【策略回归】——对海龟法则的验证

本文使用海龟法则对2013年至2016年间1850只sz股票和1173只sh股票进行策略回测,与一直持有股票的策略对比。结果显示,海龟法则的累积涨跌幅胜率为41.47% (sh) 和 34.42% (sz),表明该策略在A股市场表现并不理想,未考虑滑点和手续费的影响。
摘要由CSDN通过智能技术生成

今天拿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股似乎并不尽如人意,有兴趣的朋友可以把时间调整一下试试。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值