量化交易第四节课:海龟策略
2022-07-22 16:30:49
310次阅读
0个评论
海龟策略:在股价超过过去N个交易日的股价最高点时买入,在股价低于过去N个交易日的最低点卖出。上述最高点和最低点组成一个通道,称为“唐奇安通道”。
下载数据
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()
使用海龟策略生产交易信息
turble = pd.DataFrame(index=zgpa.index)
turble['high']=zgpa['Adj Close'].shift(1).rolling(5).max()
turble['low']=zgpa['Adj Close'].shift(1).rolling(5).min()
turble['Buy'] =zgpa['Adj Close']>turble['high']
turble['Sell']=zgpa['Adj Close']<turble['low']
turble.tail()
根据交易信号和仓位进行下单
turble['orders']=0
position =0
for k in range(len(turble)):
if turble.Buy[k] and position ==0:
turble.orders.values[k]=1
position=1
elif turble.Sell[k] and position>0:
turble.orders.values[k]=-1
position=0
turble.tail(15)
交易信号数据可视化
plt.figure(figsize=(10,5))
plt.plot(zgpa['Adj Close'],lw=2,label='Adj Close')
plt.plot(turble['high'],lw=2,ls='--',c='r',label='high')
plt.plot(turble['low'],lw=2,ls='--',c='g',label='low')
plt.scatter(turble.loc[turble.orders==1].index,zgpa['Adj Close'][turble.orders==1],marker='^',s=80,color='r',label='Buy')
plt.scatter(turble.loc[turble.orders==-1].index,zgpa['Adj Close'][turble.orders==-1],marker='v',s=80,color='g',label='Sell')
plt.legend()
plt.grid()
plt.show()
对海龟策略进行回测
initial_cash=20000
positions=pd.DataFrame(index=turble.index).fillna(0.0)
#positions.head()
positions['stock']=100*turble['orders'].cumsum()
#positions.head(15)
positions['holding_value']=positions['stock'].multiply(zgpa['Adj Close'],axis=0)
positions['diff']=positions['stock'].diff()
positions['Adj Close']=zgpa['Adj Close']
positions['cumsum']=positions['diff'].multiply(zgpa['Adj Close'],axis=0).cumsum()
positions['cash']=initial_cash-positions['diff'].multiply(zgpa['Adj Close'],axis=0).cumsum()
positions['total'] =positions['holding_value']+positions['cash']
positions.head(10)
回测数据可视化
plt.figure(figsize=(10,6))
plt.plot(positions['total'],label='total')
plt.plot(positions['holding_value'],'--',label='holding_value')
plt.grid()
plt.legend()
plt.show()
结论:可以看出使用海龟策略之后,它比我们上节课讲的双移动平均策略少赔些。海龟策略稍胜一筹。(注意:股票处于下行周期,少赔就是挣钱)
0
0