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

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

猕猴桃的营养价值1(食物有营养猕猴桃!)猕猴桃的营养价值!(食物有营养猕猴桃!)猕猴桃,也称奇异果(奇异果是猕猴桃的一个人工选育品种,因使用广泛而成为了猕猴桃的代称)。中国是猕猴桃的原产地,20世纪早期被引入新西兰。猕猴扁桃体炎发烧(扁桃体发炎,咽喉肿痛)扁桃体炎发烧(扁桃体发炎,咽喉肿痛)很多人都容易在夏季感染上上呼吸道感染,其中小编我才刚刚从医院走了回来。感染的正是很常见的急性扁桃体炎。扁桃体炎,属于上呼吸道感染疾病之一,是由于这4种盗汗是大病征兆(什么是盗汗,原来它分3种类型)这4种盗汗是大病征兆(什么是盗汗,原来它分3种类型)很多人一睡觉就喜欢出汗,而有的人是在睡到后半夜的时候才出汗,有些人甚至严重到刚闭上眼睛就会出现,这种情况就叫盗汗,而且这种情况不这4种盗汗是大病征兆(这4个部位出汗,是疾病的信号)这4种盗汗是大病征兆(这4个部位出汗,是疾病的信号)后台收到读者王先生留言说,自己在5年前的公司体检中发现患了甲亢,这些年来经常有吃药治疗,在饮食中也是非常注意。但是,最近王先生发六年级下册数学填空题(六年级数学下学期圆柱综合练习)六年级下册数学填空题(六年级数学下学期圆柱综合练习)一填空题。(1)1。2升()毫升()立方厘米2。05立方米()立方米()立方分米(2)一个圆柱的体积是18。84立方厘米,高是3人生得意时(人生得意时,谨记四句话)人生得意时(人生得意时,谨记四句话)古人有云,盛者衰之始,福者祸之基。危机和祸患,往往潜伏在鼎盛和富贵的时期。如果不懂得早日做出防范,很容易由盛转衰,生出祸患。处于人生低谷时,要学君不知黄河之水天上来(将进酒君不见黄河之水天上来)君不知黄河之水天上来(将进酒君不见黄河之水天上来)君不见黄河之水天上来,奔流到海不复回。君不见高堂明镜悲白发,朝如青丝暮成雪。人生得意须尽欢,莫使金樽空对月。天生我材必有用,千金散人生得意须尽(人生得意须尽欢,莫使金樽空对月)人生得意须尽(人生得意须尽欢,莫使金樽空对月)作者蘅苒,原创文章,禁止转载将进酒君不见黄河之水天上来,奔流到海不复回。君不见高堂明镜悲白发,朝如青丝暮成雪。人生得意须尽欢,莫使金樽天山童姥的武功(天山童姥与萧峰,谁的武功更胜一筹?)天山童姥的武功(天山童姥与萧峰,谁的武功更胜一筹?)逍遥三老(无涯子,童姥,李秋水)的武功定位,可说是天龙八部论武的一个经久不衰的话题,自从各个网络平台,金庸人物的武评盛行以来,不去掉快捷方式小箭头(封装批处理程序删除图标小箭头)去掉快捷方式小箭头(封装批处理程序删除图标小箭头)大家好,春去夏将近,花开香诱人,预知学中路,找我胖廖晨。前文我把需要的知识点介绍的差不多了,在讲述后面的内容之前,我们需要回顾一下佛教音乐李娜(著名歌手李娜出家走进佛门拾记)佛教音乐李娜(著名歌手李娜出家走进佛门拾记)作者沁香一瓣责编一默春节前整理抽屉,从一本旧日记簿中翻出几张照片,那是当年在张家界天门山采风时拍摄的,除了一些风景照片外,其中一张照片的
江苏师范大学南京校区(江苏部分师范院校介绍)江苏师范大学南京校区(江苏部分师范院校介绍)个人声明1具体招生专业,详见当年招生简章。2个人建议,仅供参考。随着社会各界人士对教师的尊重和景仰,越来越多的考生喜欢报考师范类院校和专公办专科院校(四所公办专科)公办专科院校(四所公办专科)学历内卷化早已不是一个新鲜的话题,在这种愈演愈烈的学历竞争中,人们谈论考研考博出国留学。实际上,本科升学率不超过20,相当一部分学生,在读完高中职高后进一般婚戒多少钱(一般婚戒多少钱?价格高不高?)一般婚戒多少钱(一般婚戒多少钱?价格高不高?)提起婚姻,我们总是能够想起鲜花,典礼,和心爱的他,而一场盛大的婚礼,会让给我们的未来增添更多的幸福和勇气。那么,一般婚戒多少钱呢?如果四川传媒学院怎么样(天津传媒学院靠谱吗)播音与主持艺术专业属于普通高等教育本科层次艺术学门类戏剧与影视学类学科下的一个专业,该专业为培养播音学中国语言文学艺术学美学哲学新闻传播学等多学科知识专门人才,从事各类新闻播报节目中国二本大学排名(北京比较好的二本大学及排名)中国二本大学排名(北京比较好的二本大学及排名)不管是考上一本还是二本,高考生都希望自己得能尽可能上一所更强的学校。北京市是我国的一线城市,高等教育水平十分发达,名校数量也是最多的。华中科技大学研究生就业(华中科技大学就业怎么样?)华中科技大学研究生就业(华中科技大学就业怎么样?)平时关注新闻的大家一定对于孟晚舟女士不会陌生。孟晚舟人称华为大公主,她的父亲任正非是我国大名鼎鼎的华为技术有限公司创始人。孟晚舟是高考多少分适合复读(高考600多分,选择复读)高考多少分适合复读(高考600多分,选择复读)高考600多分选择复读?很多人不明白,为什么分数这么高,还要选择复读,每个人都有自己的选择,我们应该尊重别人的选择。最近,我看到一篇报四川211大学名单(隐藏在四川的211大学)四川211大学名单(隐藏在四川的211大学)提到四川的高校,大家总会想到四川大学,但在四川还有一所高校,它有着悠久的历史,也有世界一流的专业学科。农学类专业不仅在国内一枝独秀,并在山东一本院校(山东省最好的一本院校)山东一本院校(山东省最好的一本院校)昨天小编给大家介绍了安徽省的一本二本和大专院校,接下来小编将要给大家介绍山东省一些比较好的一本二本和大专院校。本文给大家介绍山东省较好的一本院校提前批次录取(提前批次录取结果公布)提前批次录取(提前批次录取结果公布)山东省作为高考大省之一,每年的录取分数线都居高不下,即使是2021年遇上高考小年,各大重点院校在提前批次的录取分数线也依然持续走高。21年各大名征集志愿(什么是征集志愿?)征集志愿(什么是征集志愿?)目前,四川省2020年高考招生正在录取的批次已陆续有征集志愿的信息发出。什么是征集志愿哪些考生可以参加征集志愿征集志愿如何投档为了解答大家的疑惑,红星新