教育房产时事环球科技商业
投稿投诉
商业财经
热点动态
科技数码
软件应用
国际环球
晨报科学
新闻时事
信息智能
汽车房产
办公手机
教育体育
生活生物

海龟交易法则下载(用Python量化海龟交易法则)

  海龟交易法则下载(用Python量化海龟交易法则)1引言
  对于纯多头或空头的方向性策略而言,只有当证券价格是均值回归或趋势的,交易策略才能盈利。否则,如果价格是随机游走的,交易将无利可图(法玛有效市场假说)。换句话说,目前各种纷繁复杂的所谓量化策略大都可以归结为均值回归或趋势追踪策略。趋势追踪策略认为价格会沿着一定的趋势继续走,也常称为"惯性"或"动量"策略,很多技术指标就是基于动量的思想来设定的。今天为大家介绍著名的趋势交易策略——"海龟交易法则",着重介绍如何使用Python对海龟的交易规则进行量化回测,尤其是对Pandas的综合运用。关于海龟原理的详细介绍和相关轶事感兴趣的可阅读原书和网上相关资料,在微信公众号后台回复"海龟交易"可下载《海龟交易法则》高清中文PDF。
  2海龟交易法则简介
  海龟交易法则可以认为是一个完整的交易系统,具备一个完整的交易系统所应该有的所有成分,包括市场、入市、头寸规模、止损/止盈、退出、买卖策略等:
  市场:买卖什么?
  头寸规模:买卖多少?
  入市:什么时候买卖?
  止损:什么时候放弃一个亏损的头寸?
  离市:什么时候退出一个盈利的头寸?
  策略:如何买卖?
  趋势追踪——唐奇安通道
  海龟交易法则利用唐奇安通道的突破点作为买卖信号指导交易,简单而言唐奇安通道是由一条上轨线、中线和下线组成,上轨线由N1日内最高价构成,下轨线由N2日内最低价计算,当价格冲破上轨是可能的买入信号,反之,冲破下轨时是可能的卖出信号。
  买卖单位及首次建仓
  海龟交易系统本质上是一个趋势跟随的系统,但是最值得学习的是资金管理尤其是分批建仓及动态止损的部分。书中提到了N值仓位管理法,其中N值与技术指标平均真实波幅 ATR计算类似。ATR是真实波幅TR的20日平均值,而TR是当前交易日最高价和最低价之差 、前一交易日收盘价与当前交易日最高价之差、前一交易日收盘价与当前交易日最低价之差三者中的最大值,用公式表示为:
  TR=Max(High−Low,abs(High−PreClose),abs(PreClose−Low)),技术指标库TA-Lib提供了直接计算ATR的函数。
  建仓单位:
  Unit=(1%∗账户总资金)/N
  首次建仓的时候,当捕捉到趋势,即价格突破唐奇安上轨时,买入1个unit。其意义就是,让一个N值的波动与你总资金1%的波动对应,如果买入1unit单位的资产,当天震幅使得总资产的变化不超过1%。
  例如:
  现在你有1万元资金,1%波动就是100元。假如某股票的N(ATR)值为0.1元,100÷0.1元=1000股。也就是说,你的第一笔仓位应该是在其突破上轨(假设为3元)时立刻买入1000股,耗资3000元。
  动态止损或清仓条件
  当股价跌破10日唐奇安通道下沿,清空头寸结束本次交易。当价格比最后一次买入价格下跌2N时,则卖出全部头寸止损。
  接上面的例子,最后一次加仓价格为3.2。假如此时N值0.2元。当价格下跌到 3.2 - 2*0.2 = 2.8元时,清仓。持仓成本为 (3+3.1+3.2)*1000/3000 = 3.1元。此时亏损 (3.1-2.8)*3000 = 900元, 对于1万来说 这波亏损9%。
  原始的海龟交易采用唐奇安通道来追踪趋势,在趋势比较明显的行情表现不错,但是在震荡的行情中效果不佳,当然这是所有趋势型策略的通病。下面着重使用Python对唐奇安通道进行可视化,并利用简化版的海龟交易法则进行简单的历史回测。
  2
  3海龟交易规则Python实现#先引入后面可能用到的包(package) importpandasaspd importnumpyasnp importtalibasta fromdatetimeimportdatetime,timedelta importmatplotlib.pyplotasplt %matplotlibinline #正常显示画图时出现的中文和负号 frompylabimportmpl mpl.rcParams['font.sans-serif']=['SimHei'] mpl.rcParams['axes.unicode_minus']=False #使用tushare获取交易数据 #设置token importtushareasts #注意token更换为你在tushare网站上获取的 token='输入你的token' pro=ts.pro_api(token) index={'上证综指':'000001.SH', '深证成指':'399001.SZ', '沪深300':'000300.SH', '创业板指':'399006.SZ', '上证50':'000016.SH', '中证500':'000905.SH', '中小板指':'399005.SZ', '上证180':'000010.SH'} #获取当前交易的股票代码和名称 defget_code(): df=pro.stock_basic(exchange='',list_status='L') codes=df.ts_code.values names=df.name.values stock=dict(zip(names,codes)) #合并指数和个股成一个字典 stocks=dict(stock,**index) returnstocks #获取行情数据 defget_daily_data(stock,start,end): #如果代码在字典index里,则取的是指数数据 code=get_code()[stock] ifcodeinindex.values(): df=pro.index_daily(ts_code=code,start_date=start,end_date=end) #否则取的是个股数据 else: df=pro.daily(ts_code=code,adj='qfq',start_date=start,end_date=end) #将交易日期设置为索引值 df.index=pd.to_datetime(df.trade_date) df=df.sort_index() #计算收益率 df['ret']=df.close/df.close.shift(1)-1 returndf   下面以沪深300指数为例,对唐奇安通道和买卖突破信号进行可视化。hs=get_daily_data('沪深300','20180101','')[['close','open','high','low','vol']] #最近N1个交易日最高价 hs['up']=ta.MAX(hs.high,timeperiod=20).shift(1) #最近N2个交易日最低价 hs['down']=ta.MIN(hs.low,timeperiod=10).shift(1) #每日真实波动幅度 hs['ATR']=ta.ATR(hs.high,hs.low,hs.close,timeperiod=20) hs.tail()   下面使用简化版的海龟交易法则进行历史回测,即不考虑仓位管理和动态止损/止盈条件,以唐奇安通道突破作为买入卖出信号。   交易规则为:   (1)当今天的收盘价,大于过去20个交易日中的最高价时,以收盘价买入;   (2)买入后,当收盘价小于过去10个交易日中的最低价时,以收盘价卖出。defmy_strategy(data): x1=data.close>data.up x2=data.close.shift(1)<data.up.shift(1) x=x1&x2 y1=data.close<data.down y2=data.close.shift(1)>data.down.shift(1) y=y1&y2 data.loc[x,'signal']='buy' data.loc[y,'signal']='sell' buy_date=(data[data.signal=='buy'].index).strftime('%Y%m%d') sell_date=(data[data.signal=='sell'].index).strftime('%Y%m%d') buy_close=data[data.signal=='buy'].close.round(2).tolist() sell_close=data[data.signal=='sell'].close.round(2).tolist() return(buy_date,buy_close,sell_date,sell_close) #对K线图和唐奇安通道进行可视化 frompyechartsimport* grid=Grid() attr=[str(t)fortinhs.index.strftime('%Y%m%d')] v1=np.array(hs.loc[:,['open','close','low','high']]) v2=np.array(hs.up) v3=np.array(hs.down) kline=Kline("沪深300唐奇安通道",title_text_size=15) kline.add("K线图",attr,v1.round(1),is_datazoom_show=True,) #成交量 bar=Bar() bar.add("成交量",attr,hs['vol'],tooltip_tragger="axis",is_legend_show=False, is_yaxis_show=False,yaxis_max=5*max(hs["vol"])) line=Line() line.add("上轨线",attr,v2.round(1),is_datazoom_show=True, is_smooth=True,is_symbol_show=False,line_width=1.5) line.add("下轨线",attr,v3.round(1),is_datazoom_show=True, is_smooth=True,is_symbol_show=False,line_width=1.5) #添加买卖信号 bd,bc,sd,sc=my_strategy(hs) es=EffectScatter("buy") es.add("sell",sd,sc,) es.add("buy",bd,bc,symbol="triangle",) overlap=Overlap(width=2000,height=600) overlap.add(kline) overlap.add(line) overlap.add(bar,yaxis_index=1,is_add_yaxis=True) overlap.add(es) grid.add(overlap,grid_right="10%") grid   (注:运行上述代码得到的是动态交互图,可调整时间区间)#关掉pandas的warnings pd.options.mode.chained_assignment=None defstrategy(stock,start,end,N1=20,N2=10): df=get_daily_data(stock,start,end) #最近N1个交易日最高价 df['H_N1']=ta.MAX(df.high,timeperiod=N1) #最近N2个交易日最低价 df['L_N2']=ta.MIN(df.low,timeperiod=N2) #当日收盘价>昨天最近N1个交易日最高点时发出信号设置为1 buy_index=df[df.close>df['H_N1'].shift(1)].index df.loc[buy_index,'收盘信号']=1 #将当日收盘价<昨天最近N2个交易日的最低点时收盘信号设置为0 sell_index=df[df.close<df['L_N2'].shift(1)].index df.loc[sell_index,'收盘信号']=0 df['当天仓位']=df['收盘信号'].shift(1) df['当天仓位'].fillna(method='ffill',inplace=True) d=df[df['当天仓位']==1].index[0]-timedelta(days=1) df1=df.loc[d:].copy() df1['ret'][0]=0 df1['当天仓位'][0]=0 #当仓位为1时,买入持仓,当仓位为0时,空仓,计算资金净值 df1['策略净值']=(df1.ret.values*df1['当天仓位'].values+1.0).cumprod() df1['指数净值']=(df1.ret.values+1.0).cumprod() df1['策略收益率']=df1['策略净值']/df1['策略净值'].shift(1)-1 df1['指数收益率']=df1.ret total_ret=df1[['策略净值','指数净值']].iloc[-1]-1 annual_ret=pow(1+total_ret,250/len(df1))-1 dd=(df1[['策略净值','指数净值']].cummax()-df1[['策略净值','指数净值']])/df1[['策略净值','指数净值']].cummax() d=dd.max() beta=df1[['策略收益率','指数收益率']].cov().iat[0,1]/df1['指数收益率'].var() alpha=(annual_ret['策略净值']-annual_ret['指数净值']*beta) exReturn=df1['策略收益率']-0.03/250 sharper_atio=np.sqrt(len(exReturn))*exReturn.mean()/exReturn.std() TA1=round(total_ret['策略净值']*100,2) TA2=round(total_ret['指数净值']*100,2) AR1=round(annual_ret['策略净值']*100,2) AR2=round(annual_ret['指数净值']*100,2) MD1=round(d['策略净值']*100,2) MD2=round(d['指数净值']*100,2) S=round(sharper_atio,2) df1[['策略净值','指数净值']].plot(figsize=(15,7)) plt.title('海龟交易策略简单回测',size=15) bbox=dict(boxstyle="round",fc="w",ec="0.5",alpha=0.9) plt.text(df1.index[int(len(df1)/5)],df1['指数净值'].max()/1.5,f'累计收益率:\ 策略{TA1}%,指数{TA2}%;\n年化收益率:策略{AR1}%,指数{AR2}%;\n最大回撤:策略{MD1}%,指数{MD2}%;\n\ 策略alpha:{round(alpha,2)},策略beta:{round(beta,2)};\n夏普比率:{S}',size=13,bbox=bbox) plt.xlabel('') ax=plt.gca() ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') plt.show() #returndf1.loc[:,['close','ret','H_N1','L_N2','当天仓位','策略净值','指数净值']]   下面对上证综指、沪深300、创业板指数、中国平安、东方通信和贵州茅台进行简单回测,看看海龟交易规则唐奇安的择时效果如何,具体指标看图。strategy('上证综指','20050101','')   strategy('沪深300','','')   strategy('创业板指','','')   strategy('沪深300','20180101','')   strategy('中国平安','20050101','',N1=20,N2=10)   strategy('东方通信','20130101','',N1=20,N2=10)   strategy('贵州茅台','20050101','',N1=20,N2=10)   上述回测没有考虑使用N值的仓位管理和动态止损,下面是在万矿平台上加入了仓位管理进行回测,与上面简单使用Pandas的回测框架相比(图形比较丑陋),贵州茅台的各项回测指标看上去更理想了,最大回撤也只有21%。具体实现代码可参考万矿平台社区上面的分享。此外,聚宽、优矿等量化平台上也提供了相应了策略回测模板,实现代码大同小异,感兴趣的可以进一步了解。   4结语   本文简要介绍了海龟交易法则的基本原理,使用Python对其买卖信号进行了可视化分析,并利用Pandas对相关指数和个股运用简化版的海龟交易规则进行了历史回测。由回测结果可看出,该简化的趋势追踪策略对于某些标的在某些区间效果表现不错,但对于某些标的或某些时期则效果不佳。当然,本文旨在回顾经典策略,展示Pandas在金融量化分析的综合运用,为Python在金融量化中的运用起到抛砖引玉的效果,不作出任何选股或策略推荐。值得注意的是,任何策略都具有一定的局限性,尤其是知道和使用该策略的交易者多了,其作用自然比该理念刚出现的的效果差得多。正如技术分析指标,刚出现的时候很有效,但被大家所熟知或应用后,自然效用就大打折扣(相对于多因子模型中的Alpha被大家挖掘后渐渐成了risk factor)。但所谓新理念、新策略一定是站在前人的肩膀上,因此不能因为经典策略回测效果不佳而全盘否定,如何改进、细化和升级,使之更适合当下的市场才是我们要面对的问题。   关于Python金融量化   专注于分享Python在金融量化领域的应用。加入知识星球,可以免费获取30多g的量化投资视频资料、量化金融相关PDF资料、公众号文章Python完整源码、量化投资前沿分析框架,与博主直接交流、结识圈内朋友等。

青龙偃月刀多重(关羽的偃月刀多重?)青龙偃月刀多重(关羽的偃月刀多重?)一代战神关羽,它的佩刀青龙偃月刀究竟有多重?考古专家考察罕见古墓,出土一重要文物揭开谜题。那么,这个文物究竟是什么东西?墓中主人又是谁呢?在中国二十四史(二十四史里元史为何存在感低?)二十四史(二十四史里元史为何存在感低?)光明讲坛二十四史里元史为何存在感低?北京大学历史学系教授张帆在二十四史里面,元史这部书的存在感是很低的,大家不会把它作为一部名著或者有代表性珍重主人心(古诗词飞花令之珍)珍重主人心(古诗词飞花令之珍)李白行路难其一金樽清酒斗十千,玉盘珍羞直万钱。停杯投箸不能食,拔剑四顾心茫然。欲渡黄河冰塞川,将登太行雪满山。闲来垂钓碧溪上,忽复乘舟梦日边。行路难!麦片的做法(自制燕麦脆的别样做法)麦片的做法(自制燕麦脆的别样做法)燕麦脆香脆可口,还有各种果干坚果等配料来丰富口感,一次可以多做一些保存起来。泡牛奶当早餐,或者直接吃当零食,都是妥妥的By拾味爸爸豆果美食官方认证外汇点差(GMI点差滑点如何?)外汇点差(GMI点差滑点如何?)海投排行前100名的外汇平台,大家可以参考选择,如果没有在100名以内,要特别注意平台的主白标关系和风险提示。今天要向大家爆料一家平台,因为GMI操惟楚有才于斯为盛的意思是什么?(楚指湖北还是湖南?)惟楚有才于斯为盛的意思是什么?(楚指湖北还是湖南?)岳麓书院是我国四大书院之一,另外三个分别为应天书院(河南商丘)嵩阳书院(河南郑州)白鹿洞书院(江西九江)。岳麓书院大门上有一副非古代铜锁(古代的铜锁,为什么总要制成鱼形的?)古代铜锁(古代的铜锁,为什么总要制成鱼形的?)钥匙制成鱼形源自鱼不瞑目鱼这一不瞑目习性,也成为古人眼里守财看家的符号,鱼不只是祥瑞之物,还是守护之神,镇宅之宝。在古代,钥匙和锁一般张国荣与唐鹤德(唐鹤德与张国荣的爱情)张国荣与唐鹤德(唐鹤德与张国荣的爱情)没想到都2020年了,还有人在问张国荣为什么会喜欢男人,在他们眼里,喜欢男人是违背常理的。他们永远不懂,喜欢男人还是喜欢女人,就跟喜欢吃大白菜高血压防治(高血压如何控制?)高血压防治(高血压如何控制?)随着生活水平越来越好,我们再也不用像以前一样只有过年才能吃到肉了,现在只要我们想吃,随时就能吃。但是每天大鱼大肉以及一些高热量高盐食物不断地摄入,同时袁娅维年龄(36岁袁娅维真丰满)袁娅维年龄(36岁袁娅维真丰满)穿衣追求的就是美艳动人,普通人为了美可以放开,女明星自然更是如此,为了能够在穿衣上得到更多的目光和眼球,即便是上了年纪,身材不够优秀,也阻挡不了她们表外理财(表外理财是什么鬼?)表外理财(表外理财是什么鬼?)今天,被一条央行将要把表外理财纳入MPA体系监管的新闻刷屏,很多朋友茫然地问表外理财和MPA是什么鬼?正好老唐的手把手教你读财报2里有两段文字涉及这块
劳动法论文(随笔浅谈我国劳动法律关系)劳动法论文(随笔浅谈我国劳动法律关系)近期将自己学习的劳动法律相关知识,以随笔浅谈的方式写一写。一关于劳动关系相关法律中国特色社会主义法律体系,是以宪法为统帅,以法律为主干,以行政最低工资标准(11省份上调2021年最低工资标准)最低工资标准(11省份上调2021年最低工资标准)随着江苏浙江宣布自8月1日起上调最低工资标准,据中新网记者统计,今年以来,已经有上海北京浙江江苏天津陕西宁夏新疆黑龙江西藏江西这1佳能增距镜(佳能公布可调倍率增距镜专利)佳能增距镜(佳能公布可调倍率增距镜专利)增倍镜的作用大家都知道,可以直接把手里的镜头焦段直接编的更远,目前市面上主流的增倍镜规格为1。4X2。0X,如果想要获得不同的焦段那么就必须西塘住宿多少一晚(上海到西塘的火车站时刻表)西塘,江南六大古镇之一,是活着的千年古镇。碟中谍3中阿汤哥飞奔于廊棚中的场景令很多影迷都历历在目。西塘临河的街道都有廊棚,总长近千米,雨天不淋雨,晴天太阳晒不到。古镇内有保存完好的黄山歙县高考延迟(歙县高考延期这一天)黄山歙县高考延迟(歙县高考延期这一天)洪水褪去后,在这座有2200年历史的小城,商户们正在清淤,一度因积水被困的待产孕妇顺利产下婴儿,母子平安。在歙县二中,高三考生在教室内继续复习西宁景点(西宁冷门景点)西宁景点(西宁冷门景点)作为青海省会城市,西宁的知名度却并不高,很多人对西宁市区的景点也大都知之甚少,就像我一样。不过这次西宁之旅,却让我发现了一处有趣的地方青藏高原野生动物园,又连山归藏(客师词之柔兆阙论盘)连山归藏(客师词之柔兆阙论盘)柔兆阙论盘人有生辰时有痕,故而能将吉凶问。人间万物均过往,宇宙四维已轮回。吾今字字落纸间,其实后人早已观。不知东光谁才俊,能将天罡扬人间。思忖后辈风流大理到昆明汽车(昆明到大理汽车客运全线降价)大理到昆明汽车(昆明到大理汽车客运全线降价)7月1日,昆明大理正式开通了高铁,快捷舒适,适中的票价,让高铁一夜间成为昆明大理两地间的主要交通热线。7月2日,作为云南省滇西方向的主要莫斯科机场(疫情期间的莫斯科机场)莫斯科机场(疫情期间的莫斯科机场)新华社照片,外代,2020年11月19日(外代二线)(1)疫情期间的莫斯科机场11月18日,在俄罗斯首都莫斯科的多莫杰多沃机场,工作人员检查旅客佩天津火车(天津城际列车调整!)天津火车(天津城际列车调整!)8月6日,从新区多个火车站获悉,随着铁路部门车次调整,新区火车站列车运行情况均有所调整。其中,城际列车调整较大,8月7日至8月26日滨海站日开行列车调西安旅游攻略2013(保姆级西安旅行攻略)西安旅游攻略2013(保姆级西安旅行攻略)如果你想去西安旅行,那么这份保姆级攻略你可得收藏好,对你来说一定有用。我们是自驾过去的,到了西安已经中午了,不管咋说,干饭最重要,我们先去