范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

海龟交易法则下载(用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完整源码、量化投资前沿分析框架,与博主直接交流、结识圈内朋友等。

韩式半永久眉毛多少钱(男士半永久纹眉大概多少钱)哪个姑娘不爱美又有哪个姑娘不想一双瞳人剪秋水风情万种谈笑间呢?可是一个小时都画不好眉毛的手残党宁愿素颜,都要多睡5分钟懒人一族眉毛稀疏,或者只有半截眉毛的少毛星人好像离我们要的风情指甲上的半月痕(指甲上的月牙代表什么?)大家在生活中常常会听到这样的话你的手指甲有几个月牙?或者说手指甲上的月牙越多,就代表身体越好等等一些话题。可是指甲上的月牙代表什么意思呢?真的是我们身体健康与否的信号吗?对此常常有手指甲上的月牙(指甲上的月牙是什么?)手指甲上的月牙(指甲上的月牙是什么?)在生活中,不少人发现自己手上的月牙数量与他人不同,有的人月牙多达8到10个,有的人月牙则少至1到2个。大家看到月牙的数量不同或颜色不同,心里往迪士尼电影(五部一定要看的迪士尼冒险动画电影)迪士尼电影(五部一定要看的迪士尼冒险动画电影)作为一名资深的迪士尼影迷,今天来推荐五部你一定会喜欢的动画电影。ONWARD(12的魔法)12的魔法是2020年上映的由Disney与姚笛自曝已经结婚(姚笛自曝结婚当天,文章公开离婚消息)姚笛自曝已经结婚(姚笛自曝结婚当天,文章公开离婚消息)不论是且行且珍惜还是一别两宽,马伊琍文章这对曾经的模范夫妇,终究还是情分已尽。当大家都以为马伊琍不会选择原谅时,她短短几个字道泡温泉泳衣(妻子团泳装泡温泉)泡温泉泳衣(妻子团泳装泡温泉)自律的人最可怕,因为他们最自己的要求太高了,吃喝拉撒方面对都会很严苛,这样的人,在做人做事方面都会是标杆!就拿妻子的浪漫旅行这档节目来说吧,有蒋勤勤,联想游戏本哪个好(3000元左右的笔记本电脑推荐)双11狂欢大促已经进入白热化阶段,不少用户对于性能更加强劲的游戏本有所希冀,但是面对自己的不同需求和市面上种类繁多的游戏本产品,自己心里也犯了难。学生党主要看重主流网游的性能表现以前列腺炎的治疗方法(治疗前列腺炎的药物有很多)前列腺炎的治疗方法(治疗前列腺炎的药物有很多)令我们痛不欲生的慢性非细菌性前列腺炎说到前列腺炎,这可是我们很多男性的痛,甚至许多人用痛不欲生来形容也不为过。而造成这种情况的大多数类治疗前列腺炎最好的方法(用以下几种办法治疗,尤其是最后一种)治疗前列腺炎最好的方法(用以下几种办法治疗,尤其是最后一种)前列腺如果出现问题,很多男性都不想让别人知道,只要传出去大家就知道怎么回事了,患前列腺疾病的男性会遭受很多女性朋友的抵触桥本甲状腺炎(患上了桥本甲状腺炎)桥本甲状腺炎(患上了桥本甲状腺炎)日常生活中,很多人不太注重对甲状腺的保养,这就为甲状腺疾病产生创造了条件。其中尤为常见的就是桥本甲状腺炎。因为它属于慢性疾病,很多人就会很担心,患慢性结肠炎(慢性结肠炎和痢疾有什么区别?)慢性结肠炎(慢性结肠炎和痢疾有什么区别?)后台患者咨询医生,我家里老人最近出现腹胀和频繁拉肚子的情况,去检查说是慢性结肠炎,慢性结肠炎和痢疾有什么区别呀?回复这两种病的原因不同,症
农业现代化(推进农业农村现代化要求紧迫)农业现代化(推进农业农村现代化要求紧迫)南都讯十四五时期是全面实施乡村振兴战略加快推进农业农村现代化的关键五年。9月7日,广东省政府发布广东省推进农业农村现代化十四五规划(下称规划清新口气(保持口气清新)清新口气(保持口气清新)口腔护理观念深入人心,高颜值并且便携的漱口水水牙线等非传统产品,其销售规模和增速今年创双高,成为口腔护理新趋势。产品类目增多口腔护理市场规模翻倍如今的社交平锄禾日当午诗名(那个写锄禾日当午的唐朝诗人)锄禾日当午诗名(那个写锄禾日当午的唐朝诗人)锄禾日当午,汗滴禾下土。谁知盘中餐,粒粒皆辛苦。这首诗和骆宾王的鹅,鹅,鹅李白的床前明月光王之涣的白日依山尽一样,都是学龄前儿童的必背诗宋晓波郭玉良(聋哑偶像宋晓波)你不认老,就会一直年轻。你不服输,就会一直战斗。你不低头,世界看你仍是挺胸绽放。你不放弃,谁也无法对你判定人生结局。作为聋哑偶像,宋晓波就是这种人。幸运的是,在前行的路上,有一个同卫鞅之死(卫鞅其实是被秦孝公害死的)卫鞅之死(卫鞅其实是被秦孝公害死的)卫鞅死了,在秦孝公死后没多久,被甘龙和公子虔合谋告发其谋反,被赐死车裂极刑,惨死。他的死于秦孝公有不可推卸的责任。秦孝公对卫鞅太好了,无条件的信skg榨汁机(8款榨汁机对比)skg榨汁机(8款榨汁机对比)又来到炎炎夏日,是的没错,北方的小伙伴还好,南方的小伙伴已经融化了吃雪糕,吹空调。不好意思,在养生型吃货眼里,没有什么比自榨果汁更好了。但是话又说回来淘宝甄嬛体(甄嬛体式日常)淘宝甄嬛体(甄嬛体式日常)1用甄嬛体说话,在网络上颇为盛行。网友们从诸多方面来进行模仿,令人深感滑稽,忍俊不禁。这些造句涉及到各个方面,从论文写作到减肥,从模仿甄嬛说话,到模仿华妃泰国一夫多妻(她是泰国幕后掌权者)泰国一夫多妻(她是泰国幕后掌权者)她是泰国幕后掌权者,福寿双全遥控前朝后宫,如今89高龄仍健在近日泰国诗丽吉太后迎来八十九岁生日,因为御用颜色是蓝色,因此现在的泰国社交软件变成了蓝安妮斯顿电影(詹妮弗安妮斯顿回归剧组)安妮斯顿电影(詹妮弗安妮斯顿回归剧组)谋杀疑案2目前正在筹备之中1905电影网讯网飞公司的喜剧片在2019年上线之后,备受好评。不过影片的续集,却姗姗来迟。日前,有媒体报道称,谋杀如何补硒(作物怎么补硒效果好?)如何补硒(作物怎么补硒效果好?)对于农业种植,有特点的功能农业往往对我们效益提高帮助很大,富硒农业就是一个发展方向,那么我们用什么样的富硒肥料生产更好呢?今天开金老师与大家简单说说消失的客人(鬼故事消失的客人)消失的客人(鬼故事消失的客人)小如在一家三星级酒店上班,做的工作是宾馆部的服务生。酒店在郊区,地方比较僻静。酒店一共15层,平时入住的客人并不多,小如负责13到15层的房间保洁服务