基于Python的指数基金量化投资——指数基金偏离度计算

2021-11-23  本文已影响0人  小将前行

什么是指数偏离度

它是指数涨跌的快慢和偏离幅度指标。

当指数快速上涨,偏离度数据会迅速的向上偏离,当快速下跌时,偏离度数据会迅速的向下偏离。

而持续的上涨中出现下跌,偏离度就会急转直下,另一种持续的下跌中出现上涨,偏离度就会迅速上升。

指数偏离度的计算公式: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'

# (当日指数或收盘价-N日平均指数或收盘价)/N日平均指数或收盘价×100%

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的指数基金量化投资- 指数数据获取》

程序中用到的指数数据如果有问题,大家可以留言,欢迎拍砖^_^

课程参考:网易云课堂  基于Python的量化指数基金投资

上一篇下一篇

猜你喜欢

热点阅读