海龟交易法则下载(用Python量化海龟交易法则)
海龟交易法则下载(用Python量化海龟交易法则)1引言
对于纯多头或空头的方向性策略而言,只有当证券价格是均值回归或趋势的,交易策略才能盈利。否则,如果价格是随机游走的,交易将无利可图(法玛有效市场假说)。换句话说,目前各种纷繁复杂的所谓量化策略大都可以归结为均值回归或趋势追踪策略。趋势追踪策略认为价格会沿着一定的趋势继续走,也常称为惯性或动量策略,很多技术指标就是基于动量的思想来设定的。今天为大家介绍著名的趋势交易策略海龟交易法则,着重介绍如何使用Python对海龟的交易规则进行量化回测,尤其是对Pandas的综合运用。关于海龟原理的详细介绍和相关轶事感兴趣的可阅读原书和网上相关资料,在微信公众号后台回复海龟交易可下载《海龟交易法则》高清中文PDF。
2海龟交易法则简介
海龟交易法则可以认为是一个完整的交易系统,具备一个完整的交易系统所应该有的所有成分,包括市场、入市、头寸规模、止损止盈、退出、买卖策略等:
市场:买卖什么?
头寸规模:买卖多少?
入市:什么时候买卖?
止损:什么时候放弃一个亏损的头寸?
离市:什么时候退出一个盈利的头寸?
策略:如何买卖?
趋势追踪唐奇安通道
海龟交易法则利用唐奇安通道的突破点作为买卖信号指导交易,简单而言唐奇安通道是由一条上轨线、中线和下线组成,上轨线由N1日内最高价构成,下轨线由N2日内最低价计算,当价格冲破上轨是可能的买入信号,反之,冲破下轨时是可能的卖出信号。
买卖单位及首次建仓
海龟交易系统本质上是一个趋势跟随的系统,但是最值得学习的是资金管理尤其是分批建仓及动态止损的部分。书中提到了N值仓位管理法,其中N值与技术指标平均真实波幅ATR计算类似。ATR是真实波幅TR的20日平均值,而TR是当前交易日最高价和最低价之差、前一交易日收盘价与当前交易日最高价之差、前一交易日收盘价与当前交易日最低价之差三者中的最大值,用公式表示为:
TRMax(HighLow,abs(HighPreClose),abs(PreCloseLow)),技术指标库TALib提供了直接计算ATR的函数。
建仓单位:
Unit(1账户总资金)N
首次建仓的时候,当捕捉到趋势,即价格突破唐奇安上轨时,买入1个unit。其意义就是,让一个N值的波动与你总资金1的波动对应,如果买入1unit单位的资产,当天震幅使得总资产的变化不超过1。
例如:
现在你有1万元资金,1波动就是100元。假如某股票的N(ATR)值为0。1元,1000。1元1000股。也就是说,你的第一笔仓位应该是在其突破上轨(假设为3元)时立刻买入1000股,耗资3000元。
动态止损或清仓条件
当股价跌破10日唐奇安通道下沿,清空头寸结束本次交易。当价格比最后一次买入价格下跌2N时,则卖出全部头寸止损。
接上面的例子,最后一次加仓价格为3。2。假如此时N值0。2元。当价格下跌到3。220。22。8元时,清仓。持仓成本为(33。13。2)100030003。1元。此时亏损(3。12。8)3000900元,对于1万来说这波亏损9。
原始的海龟交易采用唐奇安通道来追踪趋势,在趋势比较明显的行情表现不错,但是在震荡的行情中效果不佳,当然这是所有趋势型策略的通病。下面着重使用Python对唐奇安通道进行可视化,并利用简化版的海龟交易法则进行简单的历史回测。
2hr3海龟交易规则Python实现先引入后面可能用到的包(package)importpandasaspdimportnumpyasnpimporttalibastafromdatetimeimportdatetime,timedeltaimportmatplotlib。pyplotaspltmatplotlibinline正常显示画图时出现的中文和负号frompylabimportmplmpl。rcParams〔39;font。sansserif39;〕〔39;SimHei39;〕mpl。rcParams〔39;axes。unicodeminus39;〕False使用tushare获取交易数据设置tokenimporttushareasts注意token更换为你在tushare网站上获取的token39;输入你的token39;prots。proapi(token)index{39;上证综指39;:39;000001。SH39;,39;深证成指39;:39;399001。SZ39;,39;沪深30039;:39;000300。SH39;,39;创业板指39;:39;399006。SZ39;,39;上证5039;:39;000016。SH39;,39;中证50039;:39;000905。SH39;,39;中小板指39;:39;399005。SZ39;,39;上证18039;:39;000010。SH39;}获取当前交易的股票代码和名称defgetcode():dfpro。stockbasic(exchange39;39;,liststatus39;L39;)codesdf。tscode。valuesnamesdf。name。valuesstockdict(zip(names,codes))合并指数和个股成一个字典stocksdict(stock,index)returnstocks获取行情数据defgetdailydata(stock,start,end):如果代码在字典index里,则取的是指数数据codegetcode()〔stock〕ifcodeinindex。values():dfpro。indexdaily(tscodecode,startdatestart,enddateend)否则取的是个股数据else:dfpro。daily(tscodecode,adj39;qfq39;,startdatestart,enddateend)将交易日期设置为索引值df。indexpd。todatetime(df。tradedate)dfdf。sortindex()计算收益率df〔39;ret39;〕df。closedf。close。shift(1)1returndf
下面以沪深300指数为例,对唐奇安通道和买卖突破信号进行可视化。hsgetdailydata(39;沪深30039;,39;2018010139;,39;39;)〔〔39;close39;,39;open39;,39;high39;,39;low39;,39;vol39;〕〕最近N1个交易日最高价hs〔39;up39;〕ta。MAX(hs。high,timeperiod20)。shift(1)最近N2个交易日最低价hs〔39;down39;〕ta。MIN(hs。low,timeperiod10)。shift(1)每日真实波动幅度hs〔39;ATR39;〕ta。ATR(hs。high,hs。low,hs。close,timeperiod20)hs。tail()
下面使用简化版的海龟交易法则进行历史回测,即不考虑仓位管理和动态止损止盈条件,以唐奇安通道突破作为买入卖出信号。
交易规则为:
(1)当今天的收盘价,大于过去20个交易日中的最高价时,以收盘价买入;
(2)买入后,当收盘价小于过去10个交易日中的最低价时,以收盘价卖出。defmystrategy(data):x1data。closegt;data。upx2data。close。shift(1)lt;data。up。shift(1)xx1amp;x2y1data。closelt;data。downy2data。close。shift(1)gt;data。down。shift(1)yy1amp;y2data。loc〔x,39;signal39;〕39;buy39;data。loc〔y,39;signal39;〕39;sell39;buydate(data〔data。signal39;buy39;〕。index)。strftime(39;Ymd39;)selldate(data〔data。signal39;sell39;〕。index)。strftime(39;Ymd39;)buyclosedata〔data。signal39;buy39;〕。close。round(2)。tolist()sellclosedata〔data。signal39;sell39;〕。close。round(2)。tolist()return(buydate,buyclose,selldate,sellclose)对K线图和唐奇安通道进行可视化frompyechartsimportgridGrid()attr〔str(t)fortinhs。index。strftime(39;Ymd39;)〕v1np。array(hs。loc〔:,〔39;open39;,39;close39;,39;low39;,39;high39;〕〕)v2np。array(hs。up)v3np。array(hs。down)klineKline(沪深300唐奇安通道,titletextsize15)kline。add(K线图,attr,v1。round(1),isdatazoomshowTrue,)成交量barBar()bar。add(成交量,attr,hs〔39;vol39;〕,tooltiptraggeraxis,islegendshowFalse,isyaxisshowFalse,yaxismax5max(hs〔vol〕))lineLine()line。add(上轨线,attr,v2。round(1),isdatazoomshowTrue,issmoothTrue,issymbolshowFalse,linewidth1。5)line。add(下轨线,attr,v3。round(1),isdatazoomshowTrue,issmoothTrue,issymbolshowFalse,linewidth1。5)添加买卖信号bd,bc,sd,scmystrategy(hs)esEffectScatter(buy)es。add(sell,sd,sc,)es。add(buy,bd,bc,symboltriangle,)overlapOverlap(width2000,height600)overlap。add(kline)overlap。add(line)overlap。add(bar,yaxisindex1,isaddyaxisTrue)overlap。add(es)grid。add(overlap,gridright10)grid
(注:运行上述代码得到的是动态交互图,可调整时间区间)关掉pandas的warningspd。options。mode。chainedassignmentNonedefstrategy(stock,start,end,N120,N210):dfgetdailydata(stock,start,end)最近N1个交易日最高价df〔39;HN139;〕ta。MAX(df。high,timeperiodN1)最近N2个交易日最低价df〔39;LN239;〕ta。MIN(df。low,timeperiodN2)当日收盘价gt;昨天最近N1个交易日最高点时发出信号设置为1buyindexdf〔df。closegt;df〔39;HN139;〕。shift(1)〕。indexdf。loc〔buyindex,39;收盘信号39;〕1将当日收盘价lt;昨天最近N2个交易日的最低点时收盘信号设置为0sellindexdf〔df。closelt;df〔39;LN239;〕。shift(1)〕。indexdf。loc〔sellindex,39;收盘信号39;〕0df〔39;当天仓位39;〕df〔39;收盘信号39;〕。shift(1)df〔39;当天仓位39;〕。fillna(method39;ffill39;,inplaceTrue)ddf〔df〔39;当天仓位39;〕1〕。index〔0〕timedelta(days1)df1df。loc〔d:〕。copy()df1〔39;ret39;〕〔0〕0df1〔39;当天仓位39;〕〔0〕0当仓位为1时,买入持仓,当仓位为0时,空仓,计算资金净值df1〔39;策略净值39;〕(df1。ret。valuesdf1〔39;当天仓位39;〕。values1。0)。cumprod()df1〔39;指数净值39;〕(df1。ret。values1。0)。cumprod()df1〔39;策略收益率39;〕df1〔39;策略净值39;〕df1〔39;策略净值39;〕。shift(1)1df1〔39;指数收益率39;〕df1。rettotalretdf1〔〔39;策略净值39;,39;指数净值39;〕〕。iloc〔1〕1annualretpow(1totalret,250len(df1))1dd(df1〔〔39;策略净值39;,39;指数净值39;〕〕。cummax()df1〔〔39;策略净值39;,39;指数净值39;〕〕)df1〔〔39;策略净值39;,39;指数净值39;〕〕。cummax()ddd。max()betadf1〔〔39;策略收益率39;,39;指数收益率39;〕〕。cov()。iat〔0,1〕df1〔39;指数收益率39;〕。var()alpha(annualret〔39;策略净值39;〕annualret〔39;指数净值39;〕beta)exReturndf1〔39;策略收益率39;〕0。03250sharperationp。sqrt(len(exReturn))exReturn。mean()exReturn。std()TA1round(totalret〔39;策略净值39;〕100,2)TA2round(totalret〔39;指数净值39;〕100,2)AR1round(annualret〔39;策略净值39;〕100,2)AR2round(annualret〔39;指数净值39;〕100,2)MD1round(d〔39;策略净值39;〕100,2)MD2round(d〔39;指数净值39;〕100,2)Sround(sharperatio,2)df1〔〔39;策略净值39;,39;指数净值39;〕〕。plot(figsize(15,7))plt。title(39;海龟交易策略简单回测39;,size15)bboxdict(boxstyleround,fcw,ec0。5,alpha0。9)plt。text(df1。index〔int(len(df1)5)〕,df1〔39;指数净值39;〕。max()1。5,f39;累计收益率:策略{TA1},指数{TA2};n年化收益率:策略{AR1},指数{AR2};n最大回撤:策略{MD1},指数{MD2};n策略alpha:{round(alpha,2)},策略beta:{round(beta,2)};n夏普比率:{S}39;,size13,bboxbbox)plt。xlabel(39;39;)axplt。gca()ax。spines〔39;right39;〕。setcolor(39;none39;)ax。spines〔39;top39;〕。setcolor(39;none39;)plt。show()returndf1。loc〔:,〔39;close39;,39;ret39;,39;HN139;,39;LN239;,39;当天仓位39;,39;策略净值39;,39;指数净值39;〕〕
下面对上证综指、沪深300、创业板指数、中国平安、东方通信和贵州茅台进行简单回测,看看海龟交易规则唐奇安的择时效果如何,具体指标看图。strategy(39;上证综指39;,39;2005010139;,39;39;)
strategy(39;沪深30039;,39;39;,39;39;)
strategy(39;创业板指39;,39;39;,39;39;)
strategy(39;沪深30039;,39;2018010139;,39;39;)
strategy(39;中国平安39;,39;2005010139;,39;39;,N120,N210)
strategy(39;东方通信39;,39;2013010139;,39;39;,N120,N210)
strategy(39;贵州茅台39;,39;2005010139;,39;39;,N120,N210)
上述回测没有考虑使用N值的仓位管理和动态止损,下面是在万矿平台上加入了仓位管理进行回测,与上面简单使用Pandas的回测框架相比(图形比较丑陋),贵州茅台的各项回测指标看上去更理想了,最大回撤也只有21。具体实现代码可参考万矿平台社区上面的分享。此外,聚宽、优矿等量化平台上也提供了相应了策略回测模板,实现代码大同小异,感兴趣的可以进一步了解。
4结语
本文简要介绍了海龟交易法则的基本原理,使用Python对其买卖信号进行了可视化分析,并利用Pandas对相关指数和个股运用简化版的海龟交易规则进行了历史回测。由回测结果可看出,该简化的趋势追踪策略对于某些标的在某些区间效果表现不错,但对于某些标的或某些时期则效果不佳。当然,本文旨在回顾经典策略,展示Pandas在金融量化分析的综合运用,为Python在金融量化中的运用起到抛砖引玉的效果,不作出任何选股或策略推荐。值得注意的是,任何策略都具有一定的局限性,尤其是知道和使用该策略的交易者多了,其作用自然比该理念刚出现的的效果差得多。正如技术分析指标,刚出现的时候很有效,但被大家所熟知或应用后,自然效用就大打折扣(相对于多因子模型中的Alpha被大家挖掘后渐渐成了riskfactor)。但所谓新理念、新策略一定是站在前人的肩膀上,因此不能因为经典策略回测效果不佳而全盘否定,如何改进、细化和升级,使之更适合当下的市场才是我们要面对的问题。
关于Python金融量化
专注于分享Python在金融量化领域的应用。加入知识星球,可以免费获取30多g的量化投资视频资料、量化金融相关PDF资料、公众号文章Python完整源码、量化投资前沿分析框架,与博主直接交流、结识圈内朋友等。
大头绿衣斗僵尸国语(一部以僵尸为题材的电视剧)大头绿衣斗僵尸国语(一部以僵尸为题材的电视剧)1993年,香港TVB首次尝试将僵尸题材引入电视台播出,制作并推出了电视剧《大头绿衣斗僵尸》。鬼片主演《大头绿衣斗僵尸……
谢娜二胎已出生?近日,有关于谢娜生二胎的消息在圈内传得沸沸扬扬,据说,二胎宝宝还是个女孩,面对这个消息当事人谢娜和张杰都没有公开回应,谢娜的官方粉丝团在爆料送上热搜的第一时间就行发声明不信谣、……
吴某凡被捕会怎么判?7月31日夜晚北京朝阳区公安分局依法以涉嫌强奸罪逮捕了吴某凡,吴某凡男30岁,加拿大籍。所有网友的问题,就总结在以下两点1。他是加拿大籍啊,那么我们中国的法律能管外……
汨怎么读(你却还不知道汨罗江的汨,怎么念吧!)汨怎么读(你却还不知道汨罗江的汨,怎么念吧!)虽然在端午节那天大家有了一个全新的冷知识,是端午节跟屈原根本没有关系,早在屈原投江自尽之前这个节日就已经出现很久了,但是我们……
钢筋理论重量表(钢筋表示符号大全及钢筋理论重量表)钢筋理论重量表(钢筋表示符号大全及钢筋理论重量表)科技领域爱好者钢筋钢筋是建筑上混泥土用钢材,根据力学性能钢筋分14级钢筋;下面电百科就来介绍下钢筋是什么?钢筋表示符号大……
锻炼的最佳时间(如何确定最佳锻炼时间)锻炼的最佳时间(如何确定最佳锻炼时间)一天中的任何时间,你可以承诺锻炼是一个好时机,变得活跃。每个人锻炼的最佳时间是不同的。考虑你的生活方式和锻炼目标,以帮助找到适合你的……
高德导航地图(实测高德地图新能源导航)高德导航地图(实测高德地图新能源导航)在我国《新能源汽车产业发展规划(20212035年)》中显示,2025年新能源汽车新车销售量达将到汽车新车销售总量的20左右。专家分……
有哪些好听的歌曲(好听的笛子曲有哪些?)有哪些好听的歌曲(好听的笛子曲有哪些?)好听的笛子曲太多太多了,例如有节日喜庆名曲《喜洋洋》《挂红灯》《金蛇狂舞》。百听不厌其烦,可以一直循环播放的笛子曲非它们莫属。吹好……
昔日顶级明星,如今兜里只有6000元,这位欧巴为何成这样?其实很少人想再提起朴有天了。不过这位仁兄实在不想离开我们的视线也是让人非常窘了。这位欧巴把自己活成了别人嘴里的笑话。出道的时候那么风光。万千少女都争先恐……
天边的骆驼简谱(天边的骆驼美轮美奂无与伦比)天边的骆驼简谱(天边的骆驼美轮美奂、无与伦比)天边走来一队队跋涉的骆驼走啊走啊走在那茫茫的沙漠风里雨里高昂着它的头大雪飞沙煅练了它的性格高高的骆峰从来不……
杜海涛合肥火锅店被责令停业,为何明星都爱开火锅店?近日,杜海涛合肥所开火锅店因食品加工操作区设置不规范、蝇虫防消不到位被逍遥津市场监管所责令停业整改,引发网络热议,对此,杜海涛8日下午发文回应称:有问题就要重视且彻底解决,积极……
大鹏主持力挺郭敬明,公开站队犯了大忌,难怪被嘲情商不行万万没想到啊。在一档演员竞技类综艺节目上,竟然能够看到一个有关主持人情商的热搜!真是活久见!在《演员请就位2》的传统技艺:郭敬明和李成儒老师的battle中,……
svchostexe是什么?(聊一下svchost。exe的svchostexe是什么?(聊一下svchost。exe的那点事儿)什么是svchost。exe?svchost全名HostProcessforWindowsServi……
玲珑网友们从心底下羡慕着玲珑能有那么一位视女儿为宝的父亲在《玲珑》里,火屠辛是玲珑的亲生父亲,也是一位单亲父亲,玲珑很小的时候,她的娘亲就离开了,是火屠辛一把屎一把尿把玲珑带大的,为了照顾他的女儿,他基本上不再参与炽火族的灭火活动。……
贾珍与秦可卿关系暧昧,为何在秦可卿葬礼上不避讳对秦可卿的感情在十二钗里,秦可卿的身份最神秘,她在贾家的待遇与她本人的出身非常不符,并且她还有着超越所有人的远见和智慧来预言贾家的未来。除了她神秘的出身之外,她身上争议最大也最神秘的,就是她……
田螺的做法(又到了嗦螺蛳的季节!)田螺的做法(又到了嗦螺蛳的季节!)1、螺蛳,是软体动物门、中腹足目、田螺科、螺蛳属的通称。2、今天老刘就来分享一下香辣炒螺蛳做法,喜欢的朋友可以先收藏,有空自己试一……
中国养鸡网(养小鸡什么季节养最好)中国养鸡网(养小鸡什么季节养最好)不少想从事养鸡行业的小伙伴们,都存在这样的疑惑:养小鸡什么季节养最好?对于这个问题,已经在养鸡行业打拼多年的老铁们,一般都会告诉你……
火玫瑰蜘蛛饲养方法(火玫瑰蜘蛛怎么养)火玫瑰蜘蛛饲养方法(火玫瑰蜘蛛怎么养)火玫瑰蜘蛛怎么养,可能大家会好奇怎么还有人养蜘蛛啊,现在确实有一部分年轻人会饲养蜘蛛,火玫瑰蜘蛛就是其中饲养比较多的一种了,那么大家……
四六级算分(英语四级多少分过?)四六级算分(英语四级多少分过?)英语四级考试刚刚结束,在认真核对完答案之后,很多同学对英语四级多少分过有了一定的疑问,是不同院校不同的分数线?还是根本没有统一的分数线?……
六级多少分过(英语六级590分什么水平)一年一度的英语四六级成绩公布,你还记得你的分数吗?小编记得自己当时四级得分507分,英语六级裸考得了428分,考英语六级的时候如果不是耳机出现问题,考个500分也不是不可能。……
v影响力峰会(微博V影响力峰会在京举行)v影响力峰会(微博V影响力峰会在京举行)峰会现场。中国青年网记者唐希摄中国青年网北京12月22日电(记者唐希)12月21日,由新浪微博举办的2018年V影响力峰会在……
登山鞋品牌(户外登山鞋品牌定位策划分析)登山鞋品牌(户外登山鞋品牌定位策划分析)户外登山鞋是户外爱好者和运动者的产品,面对市场上价格不一,款式多样的产品,户外登山鞋企业如何将品牌认知通过定位在消费者心智中占领独……
渔具大全(什么鱼竿质量好?)渔具大全(什么鱼竿质量好?)作为一个合格的钓鱼人,必须要有几根趁手的鱼竿。尤其是钓大鱼的时候,除了鱼竿的质量要好,能扛得住大鱼的冲击,同时鱼竿的手感也要……
动差式流量计(流量计工作原理及优缺点讲解)动差式流量计(流量计工作原理及优缺点讲解测量流体流量的仪表统称为流量计或流量表流量计是工业测量中重要的仪表之一随着工业生产的发展,对流量测量的准确度和范围的要求越来越高,……