「Python笔记」利用Python以及Tushare实现简单的均线策略

提供一个刚入门的量化策略,5日均线突破10日买入,5日均线突破10日卖出。最后采用盈利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,这是一个很方便调取数据的地方,大家注册后就可以导出股票的任何数据

网站地址:https://tushare.pro/

ts_code是输入股票代码,后面是两个日期,这样就能得出美的DataFrame形式的数据。

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导出来的数据是现在的排在前面,所以要重新排序一下

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)

生成移动均线

for i in range(1,len(data)):#上穿为1,开仓,下穿为-1,空仓

if data.mean5.iloc[i]>data.mean10.iloc[i] and data.mean5.iloc[i-1]

data.signal.iloc[i]=1

elif data.mean5.iloc[i]data.mean10.iloc[i-1]:

data.signal.iloc[i]=-1

else:

data.signal.iloc[i]=0

data.signal.iloc[0:2]=0

生成信号

#定义策略

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:#信号为0,持仓不变

c.amount.iloc[i]=c.amount.iloc[i-1]#持仓量

c.a1.iloc[i]=0#开仓量

c.a2.iloc[i]=0#出仓量

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日均线,预计未来上升,开仓

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)

交易策略

#计算夏普比

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)

计算夏普比

plt.plot(d.asset)#资产变动图


「Python笔记」利用Python以及Tushare实现简单的均线策略_第1张图片

你可能感兴趣的:(「Python笔记」利用Python以及Tushare实现简单的均线策略)