[샘플데이터 준비]
date,log_plr,equity
2008-12-31,0,1
2009-01-02,0,1
2009-01-05,0,1
2009-01-06,-0.0091,0.9909
2009-01-07,0,0.9909
......
2023-06-12,0,3.7086
2023-06-13,0.0244,3.733
2023-06-14,-0.0022,3.7309
2023-06-15,0,3.7309
2023-06-16,0,3.7309
sample.csv
0.08MB
[Sharp Ratio / Sortino Ratio / Carmar Ratio 계산]
import pandas as pd
# 사전데이터의 log_plr과 equity는 로그수익률을 기반으로 계산됨
df = pd.read_csv('sample.csv', index_col='date')
df.index = pd.to_datetime(df.index)
def cal_cagr(df):
# 최초/최종자본의 증감 / 연환산기간
start_equity = df['equity'].iat[0]
end_equity = df['equity'].iat[-1]
sdate = df.index[0]
edate = df.index[-1]
period = (365 * (edate.year - sdate.year) + (30 * (edate.month - sdate.month) + (edate.day - sdate.day))) / 365
return (end_equity - start_equity) / period
def cal_stdev(log_plr, minus_only=False):
# SORTINO Ratio 계산시에는 (-)만 고려함 (0도 제외함)
if minus_only:
log_plr = log_plr[log_plr < 0]
# 연평균 거래일 252일로 가정
return log_plr.std() * (252 ** 0.5)
def cal_sharp_ratio(df):
# CAGR / STDEV
cagr = cal_cagr(df)
stdev = cal_stdev(df['log_plr'])
return cagr / stdev
def cal_sortino_ratio(df):
# CAGR / STDEV(-만)
cagr = cal_cagr(df)
stdev = cal_stdev(df['log_plr'], minus_only=True)
return cagr / stdev
def cal_carmar_ratio(df):
# CAGR / MDD
cagr = cal_cagr(df)
df['dd'] = df['equity'] - df['equity'].cummax()
mdd = df['dd'].min()
return cagr / - mdd
def cal_mean_carmar_ratio(df):
# CAGR / Mean Drawdown
cagr = cal_cagr(df)
df['dd'] = df['equity'] - df['equity'].cummax()
mean_dd = df['dd'].mean()
return cagr / - mean_dd
print('Sharp ratio: ', cal_sharp_ratio(df))
print('Sortino ratio: ', cal_sortino_ratio(df))
print('Carmar ratio: ', cal_carmar_ratio(df))
print('Mean Carmar ratio: ', cal_mean_carmar_ratio(df))
[계산결과]
Sharp ratio: 1.5844297627862274
Sortino ratio: 3.756927417428159
Carmar ratio: 2.8999048666387406
Mean Carmar ratio: 12.283150725140386
[Mean Carmar ratio]
일반적인 Carmar Ratio는 MDD가 특정 시점에서 홀로 극단에 치우쳐져 있는 경우 값이 지나치게 튀는 현상이 있는데 이를 보완하기 위해서 전체 기간 동안의 MDD가 아니라 평균 Drawdown으로 나누어서 계산하는 방법을 자주 사용하고 있다. 시장에 실제로 존재하는 방법인지는 모르겠지만 개인적으로 Mean Carmar ratio라고 부르고 있다.
'Python, API' 카테고리의 다른 글
[Python] os.walk - 하위폴더 내의 모든 파일 리스트 검색하기 (0) | 2024.05.03 |
---|---|
[Python] 분봉데이터로 당일의 누적OHLCV 계산하기 (0) | 2023.06.22 |
[Python] 체결데이터로 분봉(OHLCV) 만들기 (0) | 2023.06.04 |
[SQLITE3] column 이름으로 사용하면 안되는 단어 (0) | 2023.05.31 |
Numba 0.57 Release (Support for Python 3.11) (0) | 2023.05.03 |