下面使用简化版的海龟交易法则进行历史回测,即不考虑仓位管理和动态止损/止盈条件,以唐奇安通道突破作为买入卖出信号。

交易规则为:

(1)当今天的收盘价,大于过去20个交易日中的最高价时,以收盘价买入;

(2)买入后,当收盘价小于过去10个交易日中的最低价时,以收盘价卖出。

def my_strategy(data):

x1=data.close>data.up

x2=data.close.shift(1)

x=x1&x2

y1=data.close

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线图和唐奇安通道进行可视化

from pyecharts import *

grid = Grid()

attr=[str(t) for t in hs.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

def strategy(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

#将当日收盘价

sell_index=df[df.close

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()

#return df1.loc[:,['close','ret','H_N1','L_N2','当天仓位','策略净值','指数净值']]

下面对上证综指、沪深300、创业板指数、中国平安、东方通信和贵州茅台进行简单回测,看看海龟交易规则唐奇安的择时效果如何,具体指标看图。

strategy('上证综指','20050101','')

4 结语

本文简要介绍了海龟交易法则的基本原理,使用Python对其买卖信号进行了可视化分析,并利用Pandas对相关指数和个股运用简化版的海龟交易规则进行了历史回测。由回测结果可看出,该简化的趋势追踪策略对于某些标的在某些区间效果表现不错,但对于某些标的或某些时期则效果不佳。当然,本文旨在回顾经典策略,展示Pandas在金融量化分析的综合运用,为Python在金融量化中的运用起到抛砖引玉的效果,不作出任何选股或策略推荐。值得注意的是,

任何策略都具有一定的局限性,尤其是知道和使用该策略的交易者多了,其作用自然比该理念刚出现的的效果差得多

。正如技术分析指标,刚出现的时候很有效,但被大家所熟知或应用后,自然效用就大打折扣(相对于多因子模型中的Alpha被大家挖掘后渐渐成了risk factor)。但

所谓新理念、新策略一定是站在前人的肩膀上,因此不能因为经典策略回测效果不佳而全盘否定,如何改进、细化和升级,使之更适合当下的市场才是我们要面对的问题

关于Python金融量化

专注于分享Python在金融量化领域的应用。加入知识星球,可以免费获取30多g的量化投资视频资料、量化金融相关PDF资料、公众号文章Python完整源码、量化投资前沿分析框架,与博主直接交流、结识圈内朋友等。

python海龟交易策略_【手把手教你】用Python量化海龟交易法则 - 简书相关推荐

  1. python进行数据预测_手把手教你用Python进行时间序列分解和预测

    原标题:手把手教你用Python进行时间序列分解和预测 作者:Mohit Sharma 翻译:数据派THU-王闯(Chuck) 预测是一件复杂的事情,在这方面做得好的企业会在同行业中出类拔萃.时间序列 ...

  2. python数据预测代码_手把手教你用Python玩转时序数据,从采样、预测到聚类丨代码...

    原标题:手把手教你用Python玩转时序数据,从采样.预测到聚类丨代码 原作 Arnaud Zinflou 郭一璞 编译 时序数据,也就是时间序列的数据. 像股票价格.每日天气.体重变化这一类,都是时 ...

  3. python自助电影售票机_手把手教你用python抢票回家过年(代码简单)

    首先看看如何快速查看剩余火车票? 当你想查询一下火车票信息的时候,你还在上12306官网吗?或是打开你手机里的APP?下面让我们来用Python写一个命令行版的火车票查看器, 只要在命令行敲一行命令就 ...

  4. python如何编游戏_手把手教你用python写游戏

    引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,项目来自 ...

  5. python时间序列动图_手把手教你用Python进行时间序列分解和预测

    来源:数据派THU(ID:DatapiTHU) ▔ 作者:Mohit Sharma 翻译:王闯(Chuck) 校对:王可汗 预测是一件复杂的事情,在这方面做得好的企业会在同行业中出类拔萃.时间序列预测 ...

  6. python预测实例教程_手把手教你用Python库Keras做预测(附代码)-阿里云开发者社区...

    当你在Keras中选择好最合适的深度学习模型,就可以用它在新的数据实例上做预测了.但是很多初学者不知道该怎样做好这一点,我经常能看到下面这样的问题: "我应该如何用Keras对我的模型作出预 ...

  7. python如何训练模型生产_手把手教你用Python构建你的第一个多标签图像分类模型(附案例)...

    你正在处理图像数据吗?我们可以使用计算机视觉算法来做很多事情: 对象检测 图像分割 图像翻译 对象跟踪(实时),还有更多-- 这让我思考--如果一个图像中有多个对象类别,我们该怎么办?制作一个图像分类 ...

  8. python 词云手把手_手把手教你用python制作属于你的第一个词云

    相信很多人在网上,或者是在一些报告或者ppt上,都看到过类似这种图片 你可能会好奇它是怎么做出来的,如果你会ps,你可能会觉得,这是用ps一步一步制作出来的.是的没错,一开始我也是坚定不移的这么认为. ...

  9. python特征工程插件_手把手教你用Python实现自动特征工程

    任何参与过机器学习比赛的人,都能深深体会特征工程在构建机器学习模型中的重要性,它决定了你在比赛排行榜中的位置. 特征工程具有强大的潜力,但是手动操作是个缓慢且艰巨的过程.Prateek Joshi,是 ...

  10. 用python创建微信机器人_手把手教你用Python创建微信机器人

    微信,一个日活10亿的超级app,不仅在国内社交独领风骚,在国外社交也同样占有一席之地.今天我们要讲的便是如何用Python来做一个微信聊天机器人. 因为是微信机器人系列的第一篇文章,所以笔者会特别详 ...

最新文章

  1. 千亿美元市值的拼多多,真被高估了吗?
  2. 程序猿必备的10款web前端开发插件一
  3. [CTO札记]从生活来看‘服务心态’
  4. 如何快速掌握oracle,教你如何快速从 Oracle 官方文档中获取需要的知识
  5. linux模式匹配,sed的模式匹配用法探讨
  6. Linux sudo找不到命令:修改sudo的PATH路径
  7. mysql 注入 file load_Mysql注入中into outfile和load_file()总结
  8. CF758 D. Ability To Convert 细节处理字符串
  9. oracle中监听程序当前无法识别连接描述符中请求服务 的解决方法
  10. sts 的js代码不变色_[黑科技] 使用 Laravel Livewire 来构建实时搜索功能(不使用一行 JS 代码)...
  11. Windows环境变量配置问题
  12. 星环大数据平台 TDH inceptor 问题排查
  13. VS C# 中使用番茄助手
  14. javacv获取摄像头列表
  15. 同比和与环比的计算公式
  16. 慕课网C#开发轻松入门 6-1练习题目
  17. 基于python学生考勤_学生考勤系统(含源代码).pdf
  18. Oracle | ORA-03135: connection lost contact.
  19. adams功能区不显示_2019新版PPT,不知道这7个新功能,怎么做好幻灯片?
  20. 电影程序php,搜一次CMS电影程序PHP版

热门文章

  1. 16进制与byte的转换
  2. iOS适配之autolayout和sizeclass(二)
  3. 【深度学习】3-从模型到学习的思路整理
  4. git在commit时候不commit某些文件
  5. 汉文化资讯社区(maven ,SSM ,MySQL)
  6. SSM校园好货APP的设计与实现毕业设计源码121619
  7. Slumdog Millionaire--《贫民窟的百万富翁》
  8. 如何用python爬取e-hentai的图片
  9. (翻译)色彩饱和度影响用户效率的方式
  10. liferay Dynamic Query 查询