변동성 대비 수익률의 개념
변동성 대비 수익률은 투자 또는 트레이딩 전략의 성과를 평가할 때 고려되는 중요한 개념이다. 이는 단순히 수익률만을 고려하는 것이 아니라, 해당 전략이 감수한 리스크 대비 얼마나 효율적으로 수익을 창출했는지를 평가하는 데 사용된다.
변동성 대비 수익률을 측정하는 대표적인 지표로는 샤프 비율(Sharpe Ratio)과 소르티노 비율(Sortino Ratio)이 있다.
샤프 비율은 전략의 초과 수익률(무위험 이자율을 초과하는 부분)을 변동성(표준편차)으로 나눈 값으로, 위험 1단위당 초과 수익률을 나타낸다. 샤프 비율이 높을수록 변동성 대비 수익률이 좋다는 것을 의미한다.
소르티노 비율은 샤프 비율과 유사하지만, 변동성 대신 하방 위험(downside risk)을 사용한다는 점에서 차이가 있다. 소르티노 비율은 전략의 초과 수익률을 하방 표준편차로 나눈 값으로, 하방 위험 1단위당 초과 수익률을 나타낸다.
변동성 대비 수익률을 고려한 자금 관리 전략
변동성 대비 수익률을 고려한 자금 관리 전략은 샤프 비율이나 소르티노 비율과 같은 지표를 기준으로 포지션 크기를 결정하는 방법이다. 이 전략의 목표는 변동성 대비 수익률이 높은 전략에 더 많은 자금을 할당하여 전체 포트폴리오의 성과를 개선하는 것이다.
구체적인 전략은 다음과 같은 단계로 구현할 수 있다:
- 각 트레이딩 전략의 샤프 비율 또는 소르티노 비율을 계산한다.
- 변동성 대비 수익률이 높은 전략에 더 많은 자금을 할당한다. 이는 각 전략의 포지션 크기를 해당 전략의 샤프 비율 또는 소르티노 비율에 비례하게 조절하는 방식으로 구현할 수 있다.
- 주기적으로(예: 매월 또는 매 분기) 각 전략의 성과를 평가하고, 필요에 따라 자금 할당을 조정한다.
이 전략을 통해 변동성이 높지만 수익률이 낮은 전략에는 적은 자금을 할당하고, 변동성이 낮으면서 수익률이 높은 전략에는 더 많은 자금을 할당할 수 있다. 이는 전체 포트폴리오의 리스크 조정 수익률을 개선하는 데 도움이 될 수 있다.
파이썬 코드 예시
다음은 샤프 비율과 소르티노 비율을 계산하고, 이를 기준으로 포지션 크기를 조절하는 파이썬 코드의 예시이다:
import numpy as np
def calculate_sharpe_ratio(returns, risk_free_rate):
try:
excess_returns = returns - risk_free_rate
sharpe_ratio = np.mean(excess_returns) / np.std(excess_returns)
return sharpe_ratio
except ZeroDivisionError:
print("Error: Standard deviation of excess returns cannot be zero.")
return 0
except TypeError:
print("Error: Invalid input type. Returns and risk-free rate must be numeric.")
return 0
def calculate_sortino_ratio(returns, risk_free_rate, target_return=0):
try:
excess_returns = returns - risk_free_rate
downside_returns = excess_returns[excess_returns < target_return]
sortino_ratio = np.mean(excess_returns) / np.std(downside_returns)
return sortino_ratio
except ZeroDivisionError:
print("Error: Standard deviation of downside returns cannot be zero.")
return 0
except TypeError:
print("Error: Invalid input type. Returns and risk-free rate must be numeric.")
return 0
def risk_adjusted_position_size(capital, risk_per_trade, strategy_ratios):
try:
total_ratio = sum(strategy_ratios)
position_sizes = [capital * ratio / total_ratio / risk_per_trade for ratio in strategy_ratios]
return position_sizes
except ZeroDivisionError:
print("Error: Sum of strategy ratios cannot be zero.")
return [capital / len(strategy_ratios) / risk_per_trade] * len(strategy_ratios)
except TypeError:
print("Error: Invalid input type. All inputs must be numeric.")
return [0] * len(strategy_ratios)
# 사용 예시
returns_strategy1 = np.array([0.02, 0.03, -0.01, 0.02, 0.04])
returns_strategy2 = np.array([0.01, 0.02, -0.02, 0.03, 0.01])
risk_free_rate = 0.01
sharpe_ratio1 = calculate_sharpe_ratio(returns_strategy1, risk_free_rate)
sharpe_ratio2 = calculate_sharpe_ratio(returns_strategy2, risk_free_rate)
sortino_ratio1 = calculate_sortino_ratio(returns_strategy1, risk_free_rate)
sortino_ratio2 = calculate_sortino_ratio(returns_strategy2, risk_free_rate)
capital = 100000
risk_per_trade = 1000
strategy_ratios = [sharpe_ratio1, sharpe_ratio2]
position_sizes = risk_adjusted_position_size(capital, risk_per_trade, strategy_ratios)
print(f"Position sizes based on Sharpe Ratio: {position_sizes}")
strategy_ratios = [sortino_ratio1, sortino_ratio2]
position_sizes = risk_adjusted_position_size(capital, risk_per_trade, strategy_ratios)
print(f"Position sizes based on Sortino Ratio: {position_sizes}")
위 코드에서 calculate_sharpe_ratio
와 calculate_sortino_ratio
함수는 각각 샤프 비율과 소르티노 비율을 계산한다. risk_adjusted_position_size
함수는 총 자금, 거래당 리스크, 각 전략의 샤프 비율 또는 소르티노 비율을 입력받아 포지션 크기를 계산한다.
사용 예시에서는 두 가지 전략의 수익률 데이터와 무위험 이자율을 사용하여 샤프 비율과 소르티노 비율을 계산하고, 이를 기준으로 포지션 크기를 결정한다.