量化交易第三节课:双移动平均策略
2022-07-21 18:20:38
423次阅读
0个评论
什么双移动平均策略?
使用两条均线来判断股价未来走势。在两条均线中,一条长期均线(如10日均线),另一条短期均线(如5日均线)这种策略基于这样的一条假设:股票价格的动量会朝着短期均线的方向移动,当短期均线穿过长期均线,超过长期的移动均线时,动量向上,此时股价可能会上涨。然而如果短期均线移动方向相反,则股价可能下跌。
下载数据
from pandas_datareader import data as dt
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
start_date ='2020-01-01'
end_date='2020-03-20'
zgpa = dt.DataReader('601318.ss','yahoo',start_date,end_date)
zgpa.head()
加工数据
perid =10
avg_10=[]
avg_value=[]
for price in zgpa['Adj Close']:
avg_10.append(price)
if len(avg_10)>perid:
del avg_10[0]
avg_value.append(np.mean(avg_10))
#print(avg_value)
#print(zgpa.index)
zgpa = zgpa.assign(avg_10=pd.Series(avg_value,index=zgpa.index))
zgpa.head()
数据可视化
#print(zgpa['Adj Close'])
plt.figure(figsize=(10,6))
plt.plot(zgpa['Adj Close'],lw=2,c='k',label='Adj Close')
plt.plot(zgpa['avg_10'],'--',lw=2,c='b',label='avg_10')
plt.legend()
plt.grid()
plt.show()
上面是展示的10日移动平均线,下面开始绘制2条均线
strategy =pd.DataFrame(index = zgpa.index)
strategy['signal']=0
#print(strategy)
strategy['avg_5']=zgpa['Adj Close'].rolling(5).mean()
strategy['avg_10']=zgpa['Adj Close'].rolling(10).mean()
strategy['signal']=np.where(strategy['avg_5']>strategy['avg_10'],1,0)
strategy['order']=strategy['signal'].diff()
strategy.tail(10)
双均线可视化
plt.figure(figsize=(10,5),dpi=100)
plt.plot(zgpa['Adj Close'],lw=2,label='Adj Close')
plt.plot(strategy['avg_5'],lw=2,ls='--',label='avg_5')
plt.plot(strategy['avg_10'],lw=2,ls='-.',label='avg_10')
print(strategy.loc[strategy.order==1].index,zgpa['Adj Close'][strategy.order==1])
plt.scatter(strategy.loc[strategy.order==1].index,zgpa['Adj Close'][strategy.order==1],
marker='^',s=80,c='r',label='Buy')
plt.scatter(strategy.loc[strategy.order==-1].index,zgpa['Adj Close'][strategy.order==1],
marker='v',s=80,c='g',label='Sell')
plt.legend()
plt.grid()
plt.show()
数据回测
initial=20000
position =pd.DataFrame(index=strategy.index).fillna(0)
position['stock']=strategy['signal'] * 100
#print(position)
position['stock value']= position.multiply(zgpa['Adj Close'],axis=0)
order =position['stock'].diff()
#print(position)
position['cash'] =initial- order.multiply(zgpa['Adj Close'],axis=0).cumsum()
position['total'] = position['stock value']+position['cash']
position.tail(10)
回测数据可视化
结论:使用双移动平均策略进行交易,在选定的时间范围内,总资产页轻微减少了,表现也没有比“低买高卖”策略优秀。当然,如果我们仔细思考一下,就会发现使用该策略后,该策略持仓时间更短,交易次数少。避免股价大幅下跌带来的损失。有没有一种在下行的趋势下也能挣到钱的一种策略呢?大家思考一下。
0
0