今天拿sz 1850只股票和sh 1173只股票从20130101以来至2016年9月的3年多的数据做回测,用海龟法则和一直持有两种策略的累积涨跌幅对比来验证海龟法则的有效性:
假设H0:海龟法则的累积涨幅>=一直持有的累积涨幅
假设H1:海龟法则的累积涨幅<一直持有的累积涨幅
采用策略(海龟法则):收盘价>最近20个交易日的最高价时买入,收盘价最近10个交易日的最低价时卖出;
(备注:这里先暂时不考虑买卖滑点和手续费;可以自己在涨跌幅里面扣除滑点和手续费)
代码:
第一步:先从保存在csv中抽取出所有sh股票代码;
import pandas as pd
import os
code_list=[]
for root,dirnames,files in os.walk('overview-data-sh'):
if files:
for f in files:
if 'sh6' in f:
code_list.append(f)
len(code_list)
第二步:将2013010以来所有sh股票数据做不同策略累积涨幅处理分析后加载到year_rnt_all中,这里面大概共940天*1173=1100000多条数据(column=48),python计算时间大概4-5分钟,速度还可以;
year_rnt_all=pd.DataFrame()
for code in code_list:
data=pd.read_csv('overview-data-sh/'+code,encoding='gbk')
data=data[['股票代码','股票名称','交易日期','涨跌幅','最高价','最低价','收盘价']]
data.交易日期=pd.to_datetime(data.交易日期)
N1=60
N2=20
data['最近N1个交易日最高价']=pd.rolling_max(data.最高价,N1)
data['最近N1个交易日最高价'].fillna(value=pd.expanding_max(data['最高价']),inplace=True)
data['最近N2个交易日最低价']=pd.rolling_min(data.最低价,N2)
data['最近N2个交易日最低价'].fillna(value=pd.expanding_min(data['最低价']),inplace=True)
buy=data[data.收盘价>=data.最近N1个交易日最高价.shift(1)].index
data.loc[buy,'收盘发出的信号']=1
sell=data[data.收盘价<data.最近N2个交易日最低价.shift(1)].index
data.loc[sell,'收盘发出的信号']=0
data['当天的仓位']=data.收盘发出的信号.shift(1)
data['当天的仓位'].fillna(method='ffill',inplace=True)
data=data[data.交易日期>=pd.to_datetime('20130101')]
data['海龟法则每日涨跌幅']=data.涨跌幅 * data.当天的仓位
year_rtn=data.set_index('交易日期')[['涨跌幅','海龟法则每日涨跌幅']].resample('A',how=lambda x: (x+1.0).prod() -1.0)
sum_cumprod_1=(year_rtn.涨跌幅+1).cumprod()
sum_cumprod_2=(year_rtn.海龟法则每日涨跌幅+1).cumprod()
year_rtn['累积涨跌幅']=sum_cumprod_1
year_rtn['海龟法则累积涨跌幅']=sum_cumprod_2
year_rnt_all=year_rnt_all.append(year_rtn)
year_rnt_all.shape
第三步:计算year_rnt_all.海龟法则累积涨跌幅>year_rnt_all.累积涨跌幅的情况,计算海龟法则胜率;
data=year_rnt_all[year_rnt_all.海龟法则累积涨跌幅>year_rnt_all.累积涨跌幅]
len(data)
海龟法则胜率=len(data)/len(year_rnt_all)
海龟法则胜率
结论:
sh:len(data)/len(year_rnt_all)=1714/4133=41.47%
sz:len(data)/len(year_rnt_all)=2297/6673=34.42%
虽然从单个个股分析,海龟法则可能有一定的胜率,但个股的现象并不能说明问题,今天从整个A股市场分析,在尚未考虑滑点和手续费的情况下,简化版的海龟法则的策略在A股似乎并不尽如人意,有兴趣的朋友可以把时间调整一下试试。