根据日收益率,计算:
- 复合年化增长率
- 年化波动率
- 夏普比率
示例代码如下:
示例代码
import pandas as pd
import numpy as np
import math
def cal_sharp(daily_returns: np.ndarray, rf=0, period=252):
"""计算夏普比率:(投资组合期望收益率 - 无风险收益) / 投资组合波动率"""
Er = daily_returns.sum() / len(daily_returns) - rf / period # 每日的平均收益 - 每日的无风险收益
sharp = Er / daily_returns.std() * math.sqrt(period)
return sharp
def cal_volatility(daily_return: np.ndarray, period=252):
"""策略年化波动率"""
vol = np.sqrt(period) * np.std(daily_return)
return vol
def cal_cagr(daily_return: pd.Series):
"""复合年化增长率"""
cum_return = daily_return.add(1).cumprod() # 净值序列
time_days = (cum_return.index[-1] - cum_return.index[0]).days # 累计收益的天数
return np.power(np.abs(cum_return[-1]), 365 / time_days) - 1 # power(净值,1/持续年份) -1
def main():
"""
data.sum()/n 为 n 天利润百分数平均值
rf / 252 对应日无风险利益
:return:
"""
n = 200 # 数据天数
rf = 3 # 假设年无风险利率
data = np.random.normal(size=(n)) # 随机生成日增长率
# 关于 period(数值,意义):(252,日夏普),(52,周夏普),(12,月夏普),(1,年夏普)
daily_return = pd.Series(data, index=pd.date_range(start='2020-01-01 00:00', periods=n))
print("年化增长率:", cal_cagr(daily_return))
print("年化波动率:", cal_volatility(daily_return.values))
print("夏普比率:", cal_sharp(daily_return.values, rf=rf))
if __name__ == '__main__':
main()