什么是指数偏离度
它是指数涨跌的快慢和偏离幅度指标。
当指数快速上涨,偏离度数据会迅速的向上偏离,当快速下跌时,偏离度数据会迅速的向下偏离。 而持续的上涨中出现下跌,偏离度就会急转直下,另一种持续的下跌中出现上涨,偏离度就会迅速上升。 指数偏离度的计算公式:100% × (当日指数 - N日平均指数) / N日平均指数;
其中N可以取5、10、20、30、60等值,就能反映出多少日的偏离度情况。数值越小反映的结果越趋近于瞬时变化,而数值越大反映的结果趋近于于平均变化。
指数偏离度反映的特征
下面是沪深300指数60日偏离度和10偏离度的情况。 60日偏离度更能反映指数在一段时间区间内的变化,整体性更好,抖动较大,有助于了解指数的长期偏离走势,而10日偏离度更能反映当前指数的瞬时变化,独立性更好,抖动较小,有助于了解指数的短期变化走势。
指数偏离度反映的是趋势的变化,更适用在量化的趋势投资中,也就是右侧投资模式,并不适合左侧投资方式,后续会介绍微笑曲线的投资方式,微笑曲线就是一种左侧投资方式。
在小将看来左侧投资方式的胜率更大也更适合自己,但萝卜青菜各有所爱,大家按自己的投资策略来就行。
源码
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
view_name = 'sh.000300'
index_info = pd.read_csv('./exportfile/indexDataAll/' + view_name + '.csv')
index_data = index_info['close'].values[1:len(index_info['close']):1]
win_10 = 10
win_30 = 30
win_60 = 60
offset = 60
index_data_deviation_10 = np.zeros([len(index_data),1])
index_data_deviation_30 = np.zeros([len(index_data),1])
index_data_deviation_60 = np.zeros([len(index_data),1])
for i in range(1,len(index_data)-offset,1):
index_data_deviation_10[i+offset] = (index_data[i+offset] - np.mean(index_data[i+offset-win_10:i+offset])) / np.mean(index_data[i+offset-win_10:i+offset])
index_data_deviation_30[i+offset] = (index_data[i+offset] - np.mean(index_data[i+offset-win_30:i+offset])) / np.mean(index_data[i+offset-win_30:i+offset])
index_data_deviation_60[i+offset] = (index_data[i+offset] - np.mean(index_data[i+offset-win_60:i+offset])) / np.mean(index_data[i+offset-win_60:i+offset])
plt_gap = 7
plt.rcParams["axes.grid"] = True
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus']=False
plt.rcParams["grid.linestyle"] = (3, 5)
fig = plt.figure(1)
ax1 = fig.add_subplot(1,1,1)
ax1.plot(index_data_deviation_10,label='10日偏离度',color='cornflowerblue',linewidth='2',linestyle='-')
ax1.plot(index_data_deviation_60,label='60日偏离度',color='tomato',linewidth='2',linestyle='-')
ax1.set_xlim(offset,len(index_data_deviation_60)+200)
ax1.set_ylim(-0.4,2)
index_ticks = index_info['date'].values[1:len(index_info['date']):1]
index_x = range(len(index_ticks),0,-round(len(index_ticks)/plt_gap))
index_xticks_tmp = index_ticks.tolist()
index_xticks = index_xticks_tmp[len(index_xticks_tmp):0:-round(len(index_ticks)/plt_gap)]
ax1.set_xticks(index_x)
ax1.set_xticklabels(index_xticks)
ax1.tick_params(labelsize=23)
plt.legend(loc='upper left',fontsize=25)
ax2 = ax1.twinx()
ax2.plot(index_data,color='darkgray',label='指数走势',linewidth='3')
ax2.set_xlim(offset,len(index_data)+200)
ax2.set_ylim(0,np.max(index_data)+1000)
ax1.set_xticks(index_x)
ax1.set_xticklabels(index_xticks)
ax2.tick_params(labelsize=23)
plt.legend(loc='upper right',fontsize=25)
plt.title('沪深300偏离度 | 10日偏离度='+str("{:.3f}".format(float(index_data_deviation_10[-1]))) + ' | 60日偏离度='+str("{:.3f}".format(float(index_data_deviation_60[-1]))),size=28)
plt.show()
上述源码中用到的指数沪深300数据或者大家需要用其他数据,可以参看原来的文章《基于Python的指数基金量化投资 - 指数数据获取》。
程序中用到的指数数据如果有问题,大家可以留言获取也可以添加小将前行的微信xjqx_666进行获取,欢迎大家一起交流沟通_
课程参考:基于Python的量化指数基金投资
|