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

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

ems快递单号格式(EMS国际快递单号格式是怎么样的?)ems快递单号格式(EMS国际快递单号格式是怎么样的?)EMS在大家平时的生活中用到的比较多,EMS是可以寄食品等到国外的一种非常给力的国际快递,那么每次我们寄完EMS都会给到一个红烧土豆的做法(红烧土豆的家庭做法)红烧土豆的做法(红烧土豆的家庭做法)红烧土豆by零下一度0511原料土豆1个豆瓣酱1勺生抽2勺老抽半勺盐1克鸡精1克1。土豆一个去皮,切成小方块。2。用清水冲去表面淀粉,沥干水份。额头上长痤疮(额头上长痘痘该怎么消除?)额头上长痤疮(额头上长痘痘该怎么消除?)额头上的痘痘应该如何消除呢?首先我们要了解内分泌内分泌是影响皮脂分泌的主要因素,旺盛的内分泌会刺激皮脂分泌,如果油脂不能顺利排出就会堵塞毛囊外地车牌在北京(外地车来北京的最全限行政策)外地车牌在北京(外地车来北京的最全限行政策)现在有不少人都知道进入北京需要办理进京证,但是只是知道六环内需要,真如此吗?网上查到的信息也是六环内包括整个通州区都需要进京证,认为六环余额宝能赚钱吗(余额宝的钱是稳赚不赔的吗?)余额宝能赚钱吗(余额宝的钱是稳赚不赔的吗?)说起余额宝,想必大家都不陌生。作为时下较为流行的理财产品,受到不少年轻人的追捧,可进一年来,余额宝的利率却总是跟过山车一样,上蹿下跳,这陛下殿下(古代中陛下和殿下是怎么来的呢?)陛下殿下(古代中陛下和殿下是怎么来的呢?)我们在电视剧里经常看到,当人们称呼皇帝的时候会说陛下,称呼一些王公亲王则会说殿下,这是为什么呢?其实是这样,在皇宫设计中,宫殿门前,两侧台调整cpu风扇转速(cpu风扇转速怎么调)调整cpu风扇转速(cpu风扇转速怎么调)许多人不知道如何调整CPU风扇转速度。让我们看一下实际上怎么操作把。1。打开计算机的控制面板,选择系统和安全性2。选择电源选项进入,然后在埃及法老王(专家挖掘出古埃及法老王墓葬)埃及法老王(专家挖掘出古埃及法老王墓葬)在古埃及的文化当中,提及过较多的就是向死而生,古埃及的木乃伊就是最好的文化体现,在古埃及的这片土地上,有着非常古老的文明,同时也诞生了许多传阿迪达斯三叶草系列(三叶草的7大经典款)阿迪达斯三叶草系列(三叶草的7大经典款)如今Athleisure风格盛行,舒适又时髦的装扮成了达人们的新宠所以今天有沟君就跟你聊聊adidas三叶草系列小科普Athleisure是胸口痛是怎么回事(胸口突然刺痛是怎么回事?)胸口痛是怎么回事(胸口突然刺痛是怎么回事?)胸口突然出现刺痛的症状相信大部分人都经历过,通常被认为是心脏病引起的。然而胸口刺痛的病因很复杂,并不只是心脏病独有的,还有可能是其他因素火车时速(牡佳高铁联调联试试跑最高时速275公里!)火车时速(牡佳高铁联调联试试跑最高时速275公里!)检测列车行驶中。联调联试检测列车。原勇摄本报6日讯(黑龙江日报全媒体记者狄婕)记者从中国铁路哈尔滨局集团有限公司获悉,6日13时
1945年8月15(1945年8月15号日本天皇宣布投降)1945年8月15(1945年8月15号日本天皇宣布投降)对于中国人来说1945年8月15日,是一个值得铭记和高兴的日子。我们欢呼雀跃,万家灯火的庆祝这一天,因为长达十四年的抗战终今天是情人节吗?(今天三月三,才是中国情人节)今天是情人节吗?(今天三月三,才是中国情人节)世界各民族都有自己的情人节。古罗马的叫沙特恩节(ShateenFestival)。这是恩格斯告诉我们的。殷商也有,时间在玄鸟(燕子)归减肥午餐(自从开始减肥,我午餐只吃这一盘)减肥午餐(自从开始减肥,我午餐只吃这一盘)夏天来了,又到了展现身材的好时间,减肥瘦身也成了女生们迫不及待的任务,都知道减肥就要管住嘴,迈开腿,这个需要强大的自律能力,要减少摄入量,结婚不结婚(结婚与不结婚该如何抉择?)结婚不结婚(结婚与不结婚该如何抉择?)最近,有很多的朋友问我,过了三十岁后,不结婚,会不会很奇怪?对于这个问题,我是震惊的,因为结婚不结婚,那是你的权利,也是你的自由。你可以选择不如何瘦大腿(腿粗怎么办?怎么才能瘦腿?)如何瘦大腿(腿粗怎么办?怎么才能瘦腿?)是不是已经胖到找不到脚踝?是否为无法变瘦的双腿而苦恼着?双腿臃肿肥胖并不仅是脂肪过量造成的,一大部分原因是毒素和废物堆积导致的。双腿肿胀和难投资合作协议范本(投资合作协议书(范文))投资合作协议范本(投资合作协议书(范文))投资合作协议书甲方住所地法定代表人乙方身份证号码丙方身份证号码以上三方单称时为本协议一方,合称时为本协议各方。鉴于甲方拟对项目和项目进行项职工代表大会决议(2021年第一次职工代表大会决议公告)职工代表大会决议(2021年第一次职工代表大会决议公告)江苏洋河酒厂股份有限公司(以下简称公司)于2021年7月21日在公司西辅楼多功能厅召开职工代表大会。本次会议由公司工会主席陈遗嘱范文(教你怎么写遗嘱)遗嘱范文(教你怎么写遗嘱)近日有网友咨询,如何自己写遗嘱?怎么写才能合法有效?能不能提供一个范本供大家参考,这些当然没问题。今天的文章,我们就来说说遗嘱。我们先来了解一下遗嘱的分类必中双色球6十1(双色球21085期精选61)必中双色球6十1(双色球21085期精选61)双色球第21084期开奖结果05070911212801本期一等奖开出21注,单注奖金581万元。21注头奖分落10地,其中河北中出1我的自选股(分享我的自选股板块)我的自选股(分享我的自选股板块)近来市场环境是差了些,很多调整一下后,继续下行了,然后龙头也是压制得厉害,短期以观望为主。看到很多人选股都有困难,看到什么买什么,短期的消息刺激就能存单质押贷款(什么是存单质押?)存单质押贷款(什么是存单质押?)在金融业务中,存单质押一直以来被认为是低风险业务。在企业在遇到融资难题的时候,或个人在遇到急需用钱的情况时,并非一定要将定期存款取出来,可以将存单当