16

量化交易 策略评估指标计算

 3 years ago
source link: https://blog.csdn.net/weixin_46274168/article/details/115652079
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

我们在创建策略的过程中, 需要通过不同的评估指标来验证策略的有效性. 这些指标可以帮助我们调整策略, 得到更好的结果.
在这里插入图片描述
常见的策略评估指标有:

  • 回测收益率
  • 回测年化收益率
  • Alpha, Beta

在这里插入图片描述

获取取票数据

  • 以伊利股份和贵州茅台为例
  • 分析区间 2019-01-01 到 2021-01-01

注: 贵州茅台兑牛奶, 那叫一个爽.

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
plt.style.use("fivethirtyeight")

# 定义获取数据时间段
start_date = "2019-01-01"  # 开始日期
end_date = "2021-01-01"  # 结束日期

# 获取洋河股份数据
data = get_price(["600887.XSHG", "600519.XSHG"], start_date=start_date, end_date=end_date, fields="close")
data = pd.DataFrame(data, index=data.index)

# 调试输出
print(data.head())

# 绘制走势图
data.plot(figsize=(16, 10), subplots=True)

输出结果:

            600887.XSHG  600519.XSHG
date                                
2019-01-02      21.3696     583.4249
2019-01-03      21.1985     574.6781
2019-01-04      21.4076     586.3665
2019-01-07      21.6453     589.7659
2019-01-08      21.4837     589.0840

在这里插入图片描述

回测收益率

在这里插入图片描述

# 计算每天的累计收益
data_new = data / data.iloc[0]
print(data_new.head())

# 画图
data_new.plot(figsize=(16, 10))

# 区间累计收益率
total_return = data_new.iloc[-1] - 1  # 用最后一个值减去1
total_return = pd.DataFrame(total_return.values, columns=["累计收益"], index=total_return.index)
print(total_return)

输出结果:

            600887.XSHG  600519.XSHG
date                                
2019-01-02     1.000000     1.000000
2019-01-03     0.991993     0.985008
2019-01-04     1.001778     1.005042
2019-01-07     1.012902     1.010869
2019-01-08     1.005339     1.009700
                 累计收益
600887.XSHG  1.076314
600519.XSHG  2.424605

在这里插入图片描述

回测年华收益率

在这里插入图片描述
代码:

# 查看数据长度
data_length = len(data_new)
print("数据长度:", data_length)

# 计算年化收益率
annual_return = pow(data_new.iloc[-1], 250 / data_length) - 1

# 调试输出
print("年化收益:")
print(annual_return)

调试输出:

数据长度: 487
年化收益:
600887.XSHG    0.455062
600519.XSHG    0.881225
Name: 2020-12-31 00:00:00, dtype: float64

在这里插入图片描述

# 计算累计最大值
max = data.cummax()

# 调试输出
print(data.head())
print(max.head())

# 计算每天回撤
drawdown_daily = (data.cummax() - data) / data.cummax()

# 调试输出
print(drawdown_daily.head())

# 计算最大回测
total_drawdown = drawdown_daily.max()

# 改成df
total_drawdown = pd.DataFrame([str(i * 100) + "%" for i in total_drawdown], columns=["最大回撤"], index= total_drawdown.index)

# 调试输出
print(total_drawdown.head())

输出结果:

# 计算累计最大值
max = data.cummax()

# 调试输出
print(data.head())
print(max.head())

# 计算每天回撤
drawdown_daily = (data.cummax() - data) / data.cummax()

# 调试输出
print(drawdown_daily.head())

# 计算最大回测
total_drawdown = drawdown_daily.max()

# 改成df
total_drawdown = pd.DataFrame([str(i * 100) + "%" for i in total_drawdown], columns=["最大回撤"], index= total_drawdown.index)

# 调试输出
print(total_drawdown.head())

输出结果:

            600887.XSHG  600519.XSHG
date                                
2019-01-02      21.3696     583.4249
2019-01-03      21.1985     574.6781
2019-01-04      21.4076     586.3665
2019-01-07      21.6453     589.7659
2019-01-08      21.4837     589.0840
            600887.XSHG  600519.XSHG
date                                
2019-01-02      21.3696     583.4249
2019-01-03      21.3696     583.4249
2019-01-04      21.4076     586.3665
2019-01-07      21.6453     589.7659
2019-01-08      21.6453     589.7659
            600887.XSHG  600519.XSHG
date                                
2019-01-02     0.000000     0.000000
2019-01-03     0.008007     0.014992
2019-01-04     0.000000     0.000000
2019-01-07     0.000000     0.000000
2019-01-08     0.007466     0.001156
                            最大回撤
600887.XSHG  21.322799729408366%
600519.XSHG  19.270518955514174%

夏普比率指的是策略承受一单位总风险, 会产生多少的超额报酬.

  • 假设无风险收益率为年化 3%
  • 超额收益率以无风险收益率为基准

在这里插入图片描述
代码:

# 向后填补缺失值
data_fill = data.fillna(method='pad')

# 计算每日收益率
return_rate = data_fill.apply(lambda x: x / x.shift(1) - 1)[1:]  # 去除首个NaN

# 调试输出
print(return_rate.head())

# 计算超额回报率
exReturn = return_rate - 0.03 / 250

#计算夏普比率
sharpe_rate = np.sqrt(len(exReturn)) * exReturn.mean() / exReturn.std()

#夏普比率的输出结果
SHR = pd.DataFrame(sharpe_rate,columns=['夏普比率'])

# 输出伊利和茅台的夏普比率
print(SHR)

输出结果:

|  |  |
|--|--|
|  |  |

            600519.XSHG  600887.XSHG
date                                
2019-01-03    -0.014992    -0.008007
2019-01-04     0.020339     0.009864
2019-01-07     0.005797     0.011104
2019-01-08    -0.001156    -0.007466
2019-01-09     0.018734     0.008849
                 夏普比率
600519.XSHG  3.048383
600887.XSHG  1.715563

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK