본문 바로가기
Python, API

[Python] Sharp Ratio / Sortino Ratio / Carmar Ratio 계산

by 오늘밤날다 2023. 6. 19.

 

[샘플데이터 준비]

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라고 부르고 있다.