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

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

封测什么意思(在封测股上还没吃到肉的)封测什么意思(在封测股上还没吃到肉的)昨天大盘走的好像犯了周一综合征,晃荡了一天收红。这种情况最简单的法子就是看两点开盘和收盘半个小时,分别在干嘛?开盘市场放量较大,上周五冲进来的硅怎么读(半导体中的silicon为何翻译成硅而非矽?)硅怎么读(半导体中的silicon为何翻译成硅而非矽?)提到半导体,大家都知道各种处理器闪存内存等芯片都是基于半导体技术的,而我们现在常用的半导体实质上是硅基半导体,硅是这个行业最有趣名字(那些有趣的植物名字)有趣名字(那些有趣的植物名字)植物,就在我们身边,与我们的生活息息相关。我们国家是世界上植物资源最为丰富的国家之一,约有30000多种植物,仅次于世界植物最丰富的马来西亚和巴西,居初二物理题(八年级物理力学实验题汇总)初二物理题(八年级物理力学实验题汇总)八年级的物理主要是力学知识,力学可以说是初中物理最难的部分。很多学生初二下学期物理掉队的原因也就是学不好力学。如果是有耐心的家长会发现,力学最空气污染治理(空气污染对于人体的危害)空气污染治理(空气污染对于人体的危害)空气污染对于人体的危害治理空气污染的方法在历史的进程中,为了加速经济的发展,人们经常会为此牺牲大自然,例如排出废水废气填满垃圾等等。对环境的无郑州南三环(郑州三环周边新楼盘介绍)郑州南三环(郑州三环周边新楼盘介绍)一楼盘名称郑州雅颂居楼盘地址花园路与金水路交叉口往北项目特色品牌地产国际化社区地铁沿线交通地铁12号线紫荆山换乘站幼儿园省实验幼儿园省直机关第一上海银七星室内滑雪场(你期待的银七星滑雪场可能不会再有了!)上海银七星室内滑雪场(你期待的银七星滑雪场可能不会再有了!)这个周末,周到君注意到中共中央办公厅国务院办公厅印发了关于以2022年北京冬奥会为契机大力发展冰雪运动的意见,除了备战3室内滑雪场设计(京城别墅内首现滑雪场)室内滑雪场设计(京城别墅内首现滑雪场)王濛作为家喻户晓的中国短道速滑女王,曾夺得四枚冬奥会金牌,将中国推向冬奥强国,向世界演绎中国速度。在冬奥赛场上,王濛万中取一的严苛和舍我其谁的哈尔滨ufo(哈尔滨上空目击不明飞行物坠落!)哈尔滨ufo(哈尔滨上空目击不明飞行物坠落!)!10月11日凌晨015左右哈尔滨上空发现不明飞行物坠落这是行车记录仪记录的视频,在哈尔滨市香坊区和道里区群力地区均可以看见这道亮光。炳若观火(培养孩子好习惯)炳若观火(培养孩子好习惯)百道编按良好的习惯是孩子终生的宝贵财富。众所周知好习惯要从娃娃抓起,但是不少父母却不知从何下手,单一呆板的管教方式不仅事倍功半,还容易对孩子幼小的心灵造成李碧华图片(玉女歌手李碧华近照罕曝光)李碧华图片(玉女歌手李碧华近照罕曝光)近日,有网友在社交平台上晒出了昔日的玉女歌手李碧华的近照,她与金佩珊在私下相聚,并且合照的时候看起来很开心。不过她身穿黑色上衣,打扮得十分低调
曾仕强简介(国学大师曾仕强)曾仕强简介(国学大师曾仕强)曾仕强先生是当代久负盛名的中国式管理大师,一生为发扬道统文化而奔走呼号,著有易经的奥秘中国式管理胡雪岩的启示等。在以前,别人跟我讲为人处事的大道理,我一无问西东(青春无悔无问西东)无问西东(青春无悔无问西东)如果提前了解了你要面对的人生,你是否有勇气前来?在面对人生选择时,这部电影给出了答案问问自己的内心,记住自己的珍贵,把握自己的人生。我们每个人时时刻刻都武汉(武汉东西湖区一街道工委书记被免职)武汉(武汉东西湖区一街道工委书记被免职)因长青街三民小区封控管理不力,近日出现多起新冠肺炎确诊病例,中共东西湖区委决定,免去张宇新同志中共东西湖区委长青街工委书记委员职务。长青街三奇门遁甲(趣谈一个你所不知道的奇门遁甲之源起我见)奇门遁甲(趣谈一个你所不知道的奇门遁甲之源起我见)古往今来,习易者虽难登高堂之庙,也可为治事之能,或治世之才。若两者难全,也可知晓天道,明辨人伦,修正己身。然术数三千,无一不是讳深美研发廉价无人机(美军正式研发廉价无人机)美研发廉价无人机(美军正式研发廉价无人机)据全球飞行器网站(FlightGlobal)4月4日消息,美国国防高级研究计划局(DARPA)正式启动了小型低成本无人机捣蛋鬼项目。捣蛋鬼tcl电视官网(三款全场景AI电视重磅来袭)tcl电视官网(三款全场景AI电视重磅来袭)一直以来,TCL在电视机领域的成绩都是有目共睹。3月29日,TCLamp苏宁易购在南京举办了2019新品发布会,发布会以MakingLi分数乘分数(学习分数乘法)分数乘分数(学习分数乘法)分数乘法是人教版小学数学六年级上册第一单元的内容,这个内容是在学生掌握了整数乘法分数的意义和性质以及分数加减法的计算等知识的基础上进行教学的。利用分数乘法linux嵌入式开发(教程嵌入式Linux应用于开发实践)linux嵌入式开发(教程嵌入式Linux应用于开发实践)本次推荐给大家的这门嵌入式Linux应用教程相信会受到大多数人的喜爱真实项目引导任务式展开教学系统的知识体系与物联网结合的win8激活工具一键激活(一键激活WinOffice免费软件工具)win8激活工具一键激活(一键激活WinOffice免费软件工具)电脑系统装机时候大家都遇到了无法激活而无法使用某些功能的原因,还有咱们的常用的办公软件例如Office等。本次小编白木耳的功效与作用(白木耳的功效与作用)白木耳的功效与作用(白木耳的功效与作用)右上角立即关注,更多健康内容不再错过,不定期惊喜送给你白木耳也叫雪耳银耳,是一种生长于枯木上的胶质真菌,是一味滋补良药。白木耳具有强精补肾润最小化快捷键(Win7窗口最大化和最小化快捷键是什么?)最小化快捷键(Win7窗口最大化和最小化快捷键是什么?)在我们日常使用的Windows系统中,win7的使用率是较高的,在这里给大家介绍win7窗口最大化和最小化快捷键。一Wind