本文参考了广发证券2015年7月16日《均线交叉策略的另类研究》
移动平均线是重要的技术分析指标,一般而说,当短期均线穿过长期均线时为“金叉信号”,此时可以买入股票,当长期均线穿过短期均线时为“死叉信号”,此时应该卖出股票。然而技术分析并非总是有效,本研究发现根据金叉死叉进行买卖并不一定获得正收益。
下面我们来研究新的均线策略:
首先了解凸组合的概念:设向量空间有一组有限数据x1,x2...xn,则定义x为这些数据点的一个凸组合如果x满足
x=α1x1 α2x2 ... αnxnx=α1x1 α2x2 ... αnxn
<br>x=α1x1 α2x2 ... αnxn<br>
其中实数αi(i=1,2......,n)αi(i=1,2......,n)
αi(i=1,2......,n)
\alpha_i(i=1,2... ...,n)满足α1 α2 ... αn=1α1 α2 ... αn=1α1 α2 ... αn=1
\alpha_1 \alpha_2 ... \alpha_n=1提出的改进均线交叉策略,主要是改变传统策略的平仓条件,开仓条件仍由传统的金叉死叉确定,平仓条件则是由开仓价格与当前价格来确定。若当前价格不小于开仓价与当前价的凸组合,则继续持有多单,无需平仓;若当前价格不大于开仓价与当前价的凸组合,则继续持有空单,无需平仓。
根据研究,我们发现新的均线策略无论是收益和回撤的表现均大幅提高。
本文参考了广发证券2015年7月16日《均线交叉策略的另类研究》
移动平均线是重要的技术分析指标,一般而说,当短期均线穿过长期均线时为“金叉信号”,此时可以买入股票,当长期均线穿过短期均线时为“死叉信号”,此时应该卖出股票。然而技术分析并非总是有效,本研究发现根据金叉死叉进行买卖并不一定获得正收益。
下面我们来研究新的均线策略:
首先了解凸组合的概念:设向量空间有一组有限数据x1,x2...xn,则定义x为这些数据点的一个凸组合如果x满足
$ x= \alpha_1x_1+\alpha_2x_2+...+\alpha_nx_n $
其中实数$\alpha_i(i=1,2... ...,n)$满足$\alpha_1+\alpha_2+...+\alpha_n=1$
提出的改进均线交叉策略,主要是改变传统策略的平仓条件,开仓条件仍由传统的金叉死叉确定,平仓条件则是由开仓价格与当前价格来确定。若当前价格不小于开仓价与当前价的凸组合,则继续持有多单,无需平仓;若当前价格不大于开仓价与当前价的凸组合,则继续持有空单,无需平仓。
根据研究,我们发现新的均线策略无论是收益和回撤的表现均大幅提高。
import pandas as pd
hs300=get_price('IF8888.CCFX', start_date='2016-01-01', end_date='2016-10-31', frequency='10m', fields='close', skip_paused=False, fq='pre')
datastore=pd.DataFrame()#ma=20timeline=list([5,10,20,30,60,120,240])ma=20for ma in timeline:tempt11=[]for i in arange(len(hs300)-ma): tempt11.append(float(hs300[i:(i+ma)].mean()))datastore[str(ma)]=tempt11[((timeline[-1])-ma):]datastore.index=hs300.index[timeline[-1]:]
def gain_se(slow='5',fast='10'):##交易函数##输入:短周期均线,长周期均线##返回:总收益,最大回撤,se_type=[]for i in arange(1,len(datastore)): if datastore[slow].iloc[i-1]>datastore[fast].iloc[i-1] and datastore[slow].iloc[i]<datastore[fast].iloc[i]:se_type.append(-1)elif datastore[slow].iloc[i-1]<datastore[fast].iloc[i-1] and datastore[slow].iloc[i]>datastore[fast].iloc[i]:se_type.append(1)else: se_type.append(0)rate=(hs300[timeline[-1]:].diff(1)[1:]/hs300[timeline[-1]:])[1:]tempt13=[]tempt12=0for i in arange(len(se_type)): if se_type[i]==-1:tempt12=-1elif se_type[i]==1:tempt12=1tempt13.append(tempt12)rate22=[tempt13[i]*list(rate['close'])[i] for i in arange(len(tempt13))]##计算累计收益率tempt23=1cumreturn=[]for i in arange(len(rate22)):tempt23=(rate22[i]+1)*tempt23cumreturn.append(tempt23)##计算中收益以及回撤finalreturn=cumreturn[-1]-cumreturn[0]huichestore=[]for i in arange(len(cumreturn)):for j in arange(i,len(cumreturn)):huichestore.append(cumreturn[i]-cumreturn[j])huiche=max(huichestore)##画累计收益图#plt.plot(cumreturn)##返回总收益和回撤return finalreturn,huiche
ratestore=pd.DataFrame()time=[str(timeline[i]) for i in arange(len(timeline))]for i in arange(len(time)):for j in arange(i+1,len(time)):ratestore[time[i]+'+'+time[j]]=gain_se(time[i],time[j])ratestore.index=['总收益','回撤']ratestore
5+10 | 5+20 | 5+30 | 5+60 | 5+120 | 5+240 | 10+20 | 10+30 | 10+60 | 10+120 | ... | 20+30 | 20+60 | 20+120 | 20+240 | 30+60 | 30+120 | 30+240 | 60+120 | 60+240 | 120+240 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
总收益 | 0.014933 | 0.040870 | -0.212217 | -0.220009 | -0.110054 | -0.106904 | 0.206872 | -0.156236 | -0.171456 | -0.222049 | ... | -0.159388 | -0.143848 | -0.131586 | -0.165854 | -0.022663 | -0.010057 | -0.249950 | -0.155161 | -0.142461 | -0.231228 |
回撤 | 0.204059 | 0.156019 | 0.244276 | 0.289814 | 0.206372 | 0.183445 | 0.197001 | 0.226480 | 0.298274 | 0.276466 | ... | 0.213424 | 0.232222 | 0.253973 | 0.194951 | 0.170078 | 0.165594 | 0.283028 | 0.217217 | 0.240342 | 0.324851 |
2 rows × 21 columns
首先了解凸组合的概念:设向量空间有一组有限数据x1,x2...xn,则定义x为这些数据点的一个凸组合如果x满足
$ x= \alpha_1x_1+\alpha_2x_2+...+\alpha_nx_n $
其中实数$\alpha_i(i=1,2... ...,n)$满足$\alpha_1+\alpha_2+...+\alpha_n=1$
提出的改进均线交叉策略,主要是改变传统策略的平仓条件,开仓条件仍由传统的金叉死叉确定,平仓条件则是由开仓价格与当前价格来确定。若当前价格不小于开仓价与当前价的凸组合,则继续持有多单,无需平仓;若当前价格不大于开仓价与当前价的凸组合,则继续持有空单,无需平仓。
def gain_se2(slow='5',fast='10'):##交易函数##输入:短周期均线,长周期均线##返回:总收益,最大回撤,se_type=[]for i in arange(1,len(datastore)): if datastore[slow].iloc[i-1]>datastore[fast].iloc[i-1] and datastore[slow].iloc[i]<datastore[fast].iloc[i]:se_type.append(-1)elif datastore[slow].iloc[i-1]<datastore[fast].iloc[i-1] and datastore[slow].iloc[i]>datastore[fast].iloc[i]:se_type.append(1)else: se_type.append(0)rate=(hs300[timeline[-1]:].diff(1)[1:]/hs300[timeline[-1]:])[1:]tempt13=[]tempt12=0for i in arange(len(se_type)):if tempt12==0:if se_type[i]==-1:##死叉并且空仓需要判断uu1=i##记录死叉位置tempt12=-1##开空单elif se_type[i]==1:##金叉uu2=i##记录金叉位置tempt12=1##开多单elif tempt12<0:if se_type[i]==-1:##死叉位置更新uu1=iif hs300[timeline[-1]+1:]['close'][uu1]>=hs300[timeline[-1]+1:]['close'][i]:tempt12=-1##假如价格没有超过死叉位置价格继续持仓else:tempt12=0elif tempt12>0:if se_type[i]==1:##金叉位置更新uu1=iif hs300[timeline[-1]+1:]['close'][uu2]<=hs300[timeline[-1]+1:]['close'][i]:tempt12=1##假如价格没有超过金叉位置价格继续持仓else:tempt12=0tempt13.append(tempt12)rate22=[tempt13[i]*list(rate['close'])[i] for i in arange(len(tempt13))]##计算累计收益率tempt23=1cumreturn=[]for i in arange(len(rate22)):tempt23=(rate22[i]+1)*tempt23cumreturn.append(tempt23)##计算中收益以及回撤finalreturn=cumreturn[-1]-cumreturn[0]huichestore=[]for i in arange(len(cumreturn)):for j in arange(i,len(cumreturn)):huichestore.append(cumreturn[i]-cumreturn[j])huiche=max(huichestore)##画累计收益图#plt.plot(cumreturn)##返回总收益和回撤return finalreturn,huiche
ratestore2=pd.DataFrame()time=[str(timeline[i]) for i in arange(len(timeline))]for i in arange(len(time)):for j in arange(i+1,len(time)):ratestore2[time[i]+'+'+time[j]]=gain_se2(time[i],time[j])ratestore2.index=['总收益','回撤']ratestore2
5+10 | 5+20 | 5+30 | 5+60 | 5+120 | 5+240 | 10+20 | 10+30 | 10+60 | 10+120 | ... | 20+30 | 20+60 | 20+120 | 20+240 | 30+60 | 30+120 | 30+240 | 60+120 | 60+240 | 120+240 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
总收益 | 0.394514 | 0.400482 | 0.220021 | 0.202472 | 0.150064 | 0.091290 | 0.282472 | 0.389485 | 0.186604 | 0.074751 | ... | 0.076252 | 0.049894 | 0.120789 | 0.080334 | 0.162426 | 0.100229 | 0.034078 | 0.096716 | 0.073681 | 0.049507 |
回撤 | 0.099246 | 0.120888 | 0.084650 | 0.059528 | 0.036469 | 0.075718 | 0.088983 | 0.096408 | 0.082331 | 0.081913 | ... | 0.074674 | 0.095758 | 0.096745 | 0.048449 | 0.100339 | 0.065327 | 0.094196 | 0.094667 | 0.074496 | 0.067056 |
2 rows × 21 columns
import seaborn as sns import numpy as npimport matplotlib.pyplot as pltplt.figure(figsize=(15,5))y1 = ratestore.iloc[0]*100y2 = ratestore.iloc[1]*100index = np.arange(len(y1))bar_width = 0.3ax1=plt.bar(2+index, y1, width=0.3,color='steelblue',label='总收益率')ax2=plt.bar(2+index+bar_width, y2, width=0.3 , color='goldenrod',label='最大回撤')plt.xticks(2+index+0.35,list(ratestore.columns),rotation=28)plt.xlabel('传统均线策略不同周期均线组合')plt.legend()plt.show()
import numpy as npimport matplotlib.pyplot as pltplt.figure(figsize=(15,5))y1 = ratestore2.iloc[0]*100y2 = ratestore2.iloc[1]*100index = np.arange(len(y1))bar_width = 0.3ax1=plt.bar(2+index, y1, width=0.3,color='steelblue',label='总收益率')ax2=plt.bar(2+index+bar_width, y2, width=0.3 , color='goldenrod',label='最大回撤')plt.xticks(2+index+0.35,list(ratestore2.columns),rotation=28)plt.xlabel('新的均线策略不同周期均线组合')plt.legend()plt.show()
本社区仅针对特定人员开放
查看需注册登录并通过风险意识测评
5秒后跳转登录页面...
移动端课程