上篇文章里用pyalgotrade框架计算了策略收益率、夏普值、最大回测等回测指标,但是貌似没有直接计算α值,β值,信息比率等回测指标的方法。看来要自己实现了。
参照《Python量化策略风险指标》( https://zhuanlan.zhihu.com/p/55425806)这篇文章里的定义实现吧。
先来计算beta值。beta值相当于业绩评价基准收益的总体波动性。常被用于衡量某一策略的系统性风险。如果beta值大于1,策略波动大于市场,否则,策略波动小于市场。
还有Alpha值,代表实际收益和按照beta系数计算的期望收益之间的差额,代表策略多大程度上跑赢了预期的收益率。可以理解为超额收益率。
计算这两个值要选一个基准,一般是沪深300指数,但是指数的值是3000多,跟个股的价格差别很大,如果直接用指数作为基准,需要进行数据调整。我就用300ETF(510300)来做基准了,聚宽上也进行同样的调整。
计算代码就照那篇文章上给的代码了。
先用300ETF的数据建立一个feeds并以此建立策略,计算收益率,用累积收益率计算alpha和beta值。
# 计算一些回测指标
def calculater(ret, retbase):
# 计算α β值
X = ret.getCumulativeReturns()
Y = retbase.getCumulativeReturns()
n1 = X.__len__()
n2 = Y.__len__()
x = []
y = []
if n1 == n2:
for i in range(n1):
x.append(X[i])
y.append(Y[i])
alpha = 0.0
beta = 0.0
b, a, r_value, p_value, std_err = stats.linregress(x, y)
# alpha转化为年
alpha = round(a * 250, 3)
beta = round(b, 3)
print("α值:%.2f β值:%.2f" % (alpha, beta))
结果:
聚宽上的结果
差别还是很大的,尤其beta值。
夏普比率代表每多承担一份风险,可以获得几份回报,即单位风险所获得的超额回报,该比率越高,策略承担单位风险得到的超额回报越高,所以夏普比率越高越好。pyalgotrade里有类计算,就不自己实现了。
信息比率,与夏普比率类似,但是其参考基准不是无风险收益率,而是策略的市场基准收益率。
但是按照知乎文章里的代码计算出来的信息比率为16.08,差距太大了。我按照原始定义算出来的呢?为0.01。差距也很大,不过貌似更靠谱一些。
# 计算信息比率
# 先计算超额收益
ex_return = [x[i] - y[i] for i in range(len(x))]
print(ex_return)
print(np.mean(ex_return))
print(np.std(ex_return))
information = np.sqrt(len(ex_return)) * np.mean(ex_return)/np.std(ex_return)
print("信息比率:%.2f" % information)
# 方法2
information2 = (x[-1] - y[-1])/np.std(ex_return)
print("信息比率:%.2f" % information2)
先这样吧。再把整个计算回测指标的过程封装起来吧。下次了。代码见https://github.com/zwdnet/MyQuant/blob/master/01/testdata.py
我发文章的四个地方,欢迎大家在朋友圈等地方分享,欢迎点“在看”。
我的个人博客地址:https://zwdnet.github.io
我的CSDN博客地址:https://blog.csdn.net/zwdnet
我的博客园博客地址: https://www.cnblogs.com/zwdnet/
我的微信个人订阅号:赵瑜敏的口腔医学学习园地