提供一個(gè)剛?cè)腴T(mén)的量化策略,5日均線突破10日買(mǎi)入狂芋,5日均線突破10日賣(mài)出。最后采用盈利20%。
import pandas as pd
import matplotlib.pyplot as plt
import tushare as ts
pro = ts.pro_api()
df = pro.daily(ts_code='000333.SZ', start_date='20150101', end_date='20181216')
介紹一下Tushare没炒,這是一個(gè)很方便調(diào)取數(shù)據(jù)的地方,大家注冊(cè)后就可以導(dǎo)出股票的任何數(shù)據(jù)
網(wǎng)站地址:https://tushare.pro/
ts_code是輸入股票代碼犯戏,后面是兩個(gè)日期送火,這樣就能得出美的DataFrame形式的數(shù)據(jù)拳话。
df.index=df.iloc[:,1]
df=df.sort_values(by=["trade_date"],ascending=True)
df.index=pd.to_datetime(df.index,format='%Y-%m-%d')
這里是由于Tushare導(dǎo)出來(lái)的數(shù)據(jù)是現(xiàn)在的排在前面,所以要重新排序一下
data=pd.DataFrame(index=df.index,columns=['close','mean5','mean10','signal'])
data['close']=df.close
data['mean5']=data.close.rolling(5).mean()
data['mean10']=data.close.rolling(10).mean()
data.mean5.iloc[0:9]=data.close.iloc[0:9]
data.mean10.iloc[0:9]=data.close.iloc[0:9]
plt.figure(figsize=(13,6), dpi=80)
plt.plot(data.close)
plt.plot(data.mean5)#5日20日均線圖
plt.plot(data.mean10)
生成移動(dòng)均線
for i in range(1,len(data)):#上穿為1种吸,開(kāi)倉(cāng)弃衍,下穿為-1,空倉(cāng)
if data.mean5.iloc[i]>data.mean10.iloc[i] and data.mean5.iloc[i-1]<data.mean10.iloc[i-1]:
data.signal.iloc[i]=1
elif data.mean5.iloc[i]<data.mean10.iloc[i] and data.mean5.iloc[i-1]>data.mean10.iloc[i-1]:
data.signal.iloc[i]=-1
else:
data.signal.iloc[i]=0
data.signal.iloc[0:2]=0
生成信號(hào)
#定義策略
def strategy(data,fee):
c=pd.DataFrame(index=data.index,columns=['close','signal','amount','a1','a2','cash','asset'])
c.open=wanke.open
c.close=data.close
c.signal=data.signal
c.amount.iloc[0]=0
c.cash.iloc[0]=1000000
c.asset.iloc[0]=1000000
for i in range(1,len(data)):
if c.signal.iloc[i]==0:#信號(hào)為0坚俗,持倉(cāng)不變
c.amount.iloc[i]=c.amount.iloc[i-1]#持倉(cāng)量
c.a1.iloc[i]=0#開(kāi)倉(cāng)量
c.a2.iloc[i]=0#出倉(cāng)量
c.cash.iloc[i]=c.cash.iloc[i-1]
c.asset.iloc[i]=c.cash.iloc[i]+c.amount.iloc[i]*c.close.iloc[i]*100
elif c.signal.iloc[i]==1:#5日均線大于10日均線镜盯,預(yù)計(jì)未來(lái)上升,開(kāi)倉(cāng)
c.a1.iloc[i]=int(1/2*c.cash.iloc[i-1]/c.open.iloc[i]/100)
c.a2.iloc[i]=0
c.amount.iloc[i]=c.amount.iloc[i-1]+c.a1.iloc[i]
c.cash.iloc[i]=c.cash.iloc[i-1]-c.a1.iloc[i]*c.open.iloc[i]*100*(1+fee)
c.asset.iloc[i]=c.cash.iloc[i]+c.amount.iloc[i]*c.close.iloc[i]*100
elif c.signal.iloc[i]==-1:
c.a1.iloc[i]=0
c.a2.iloc[i]=int(1/3*c.amount.iloc[i-1])
c.amount.iloc[i]=c.amount.iloc[i-1]-c.a2.iloc[i]
c.cash.iloc[i]=c.cash.iloc[i-1]+c.a2.iloc[i]*c.open.iloc[i]*100*(1-fee)
c.asset.iloc[i]=c.cash.iloc[i]+c.amount.iloc[i]*c.close.iloc[i]*100
return c
fee=0.0002
final=strategy(data,fee)
交易策略
#計(jì)算夏普比
d=pd.DataFrame(index=final.index,columns=['asset','dailyreturn','exturn','cumret'])
d['asset']=final['asset']
for i in range(1,len(d)):
d.dailyreturn.ix[i]=(d.asset.ix[i]-d.asset.ix[i-1])/d.asset.ix[i-1]
d['exturn']=d['dailyreturn']-0.04/250
stdexturn=d['exturn'].std()
meanexturn=d['exturn'].mean()
import numpy as np
ASR=np.sqrt(250)*meanexturn/stdexturn
print(ASR)
計(jì)算夏普比
plt.plot(d.asset)#資產(chǎn)變動(dòng)圖