目录
一.顶部与底部识别算法
二.拟合历史曲线,平滑处理
三.根据识别出的极值画出历史曲线
四.如何构建顶部识别的做空策略
一.顶部与底部识别算法
在python scipy里面signal模块中有argrelextrema算法可以较为方便的为我们寻找某个时间区间下的局部极值。
np.greater寻找局部最大值,np.less寻找局部最小值。order参数为基点前后比较的期数。
###导入算法模块 import pandas as pd import numpy as np import matplotlib.pyplot as plt from statsmodels.nonparametric.kernel_regression import KernelReg from scipy.signal import argrelextrema
###back_max_loc,back_min_loc为局部最大值、最小值的标签,back_data_array_fit为金融序列,np.array格式。 N=60,M=60 back_max_loc=[argrelextrema(back_data_array_fit, np.greater,order=N)[0][i] for i in range(len(argrelextrema(back_data_array_fit, np.greater,order=N)[0]))] back_min_loc=[argrelextrema(back_data_array_fit, np.less,order=M)[0][i] for i in range(len(argrelextrema(back_data_array_fit, np.less,order=M)[0]))]
二.拟合历史曲线,平滑处理
由于商品期货的合约收盘价序列会存在较多的尖峰导致最终识别出过多的无效的极值。因此,在处理进行局部极值识别前我们先对数据进行平滑处理,在这里我们采用核回归的方式来平滑曲线。
核回归与普通的ols回归的区别在于其会利用核函数作为权重构建非线性函数,传统的ols是等权的形式。
在statsmodels中有具体的核回归的包可以直接供我们使用。具体参数使用情况可以详见下面的链接。statsmodels.nonparametric.kernel_regression.KernelReg — statsmodels
df=pd.read_excel('C:\Users\Administrator\Desktop\p_wind_index.xls',index_col=0)
back_data_array_kr = KernelReg(df['close'] ,list(range(len(df))),'c',bw=[5])
back_data_array_fit, back_data_array_std =back_data_array_kr.fit(list(range(len(df))))
df['fit']=back_data_array_fit
三.根据识别出的极值画出历史曲线
得到局部极值的标签后,可以画出历史收盘价的曲线观察一下局部极值点位是否寻找的有问题或者是存在部分极值没有识别进入的问题。如果需要改变纳入的极值点,可以修改第一步中的order参数。
plt.figure(figsize=(16,9))
font = {'family' : 'STZhongsong','weight' : 'normal','size' : 15}
font2 = {'family' : 'STZhongsong','weight' : 'normal','size' : 20}
df.datetime=pd.to_datetime(df.datetime)
plt.scatter(df.datetime.values[back_max_loc],df.close.values[back_max_loc] ,marker='o',color='red',linewidths=10,label='局部峰值')
plt.scatter(df.datetime.values[back_min_loc],df.close.values[back_min_loc] ,marker='o',color='green',linewidths=10,label='局部波谷')
plt.plot(df.datetime,df.close,color='blue',label='收盘价')
plt.legend(loc=0,prop=font)
plt.title('基于核回归的局部极值识别',font2)
plt.xlabel('时间',font)
plt.ylabel('收盘价',font)
plt.tick_params(labelsize=15)
plt.grid()
plt.savefig('D:工作技术指标顶部回溯\核回归拟合.png')
plt.show()
下面给出的是以棕榈油指数收盘价为例的局部极值识别后的曲线,图中红色为局部峰值,绿色为局部波谷,蓝色的线为指数收盘价,可以观察到局部极值识别算法可以较好的识别出时间序列中的极值点。
四.如何构建顶部识别的做空策略
在利用局部极值算法识别出商品走势的局部极值后,我们可以结合技术指标帮助我们判断合适的入场点,如判断出当前位置为局部峰值,可以结合MACD、TRIX等指标来构建空头策略。
具体的策略表现及具体调整会在下一篇文章中展示。具体数据及代码见百度网盘
链接: https://pan.baidu.com/s/1XDNMW-V_WJ9xzWvBMAEraQ
提取码: 6g8t



