用Python编写的第一个回测程序
用Python编写的第一个回测程序
2016-08-06
def savfig(figureObj, fn_prefix1='backtest8', fn_prefix2='_1_'):
import datetime
fmt= '%Y_%m_%d_%H_%M_%S'
now = datetime.datetime.now()
fname_savfig = fn_prefix1 + fn_prefix2 + now.strftime(fmt)+ '.png'
figureObj.savefig(fname_savfig, facecolor=fig.get_facecolor()) def backtest8(ohlc=ohlc, SD=1.0, n_short=2, n_long=20, f_savfig=False):
u'''
双均线策略回测函数
signature: backtest8(ohlc=ohlc, SD=1.0, n_short=2, n_long=20, f_savfig=False)
param::
ohlc - dohlcva 数据, dataFrame结构的
SD - MA1/MA2 > SD 触发多头买入的快均线/慢均线的阀值
f_savefig - flag for saving Matplot output figures '''
import matplotlib
#import seaborn as sns
#sns.set_style('white') myfontprops = matplotlib.font_manager.FontProperties(
fname='C:/Windows/Fonts/msyh.ttf')#微软雅黑 maShort = pd.Series.rolling(ohlc.C, n_short).mean()
maLong = pd.Series.rolling(ohlc.C, n_long).mean() fig=plt.figure() # create new figure
ohlc.C.plot(grid=True, figsize=(8,4))
maShort.plot(label='MA'+str(n_short))
maLong.plot(grid=True,label='MA'+str(n_long))
# ohlc.iloc[:,[0,1,2,3]].plot(grid=False, figsize=(8,4))
# ohlc.iloc[:,[0,1,2,3]].plot(grid=True,figsize=(8,4))
plt.legend(loc='best')
plt.title( s=u'历史股价', fontproperties=myfontprops)
if f_savfig:
savfig(fig, 'backtest8', '_0_') # SD=1.0
regime = np.where( maShort/maLong > SD, 1, 0)
regime = pd.Series(regime, index=maShort.index)
print ('Regime Length = %s'%regime.size) fig=plt.figure() # create new figure
regime[:].plot(lw=1.5, ylim=(-0.1, 1.1), figsize=(8,4), title=u'Regime')
if f_savfig:
savfig(fig, 'backtest8', '_1_') fig=plt.figure() # create new figure
regime[-100:].plot(lw=1.5, ylim=(-0.1, 1.1), figsize=(8,4), title=u'Regime')
if f_savfig:
savfig(fig, 'backtest8', '_2_') pp_ratio_bnh = np.log(ohlc.C / ohlc.C.shift(1) )
pp_ratio_strategy = regime.shift(1) * pp_ratio_bnh
#最后我们把每天的收益率求和就得到了最后的累计收益率
#(这里因为我们使用的是指数收益率,所以将每日收益累加是合理的),
#这个累加的过程也可以通过DataFrame的内置函数cumsum轻松完成:
norm_return_bnh = pp_ratio_bnh .cumsum().apply(np.exp)
norm_return_strategy = pp_ratio_strategy.cumsum().apply(np.exp) fig=plt.figure() # create a new figure
norm_return_strategy. plot(lw=1.5, figsize=(8,4), label=u'Strategy')
norm_return_bnh. plot(lw=1.5, label=u'BnH') plt.legend(loc='best')
plt.title(s=u'策略收益率与历史价格对比', fontproperties=myfontprops)
if f_savfig:
savfig(fig, 'backtest8', '_3_') assert (regime.index == ohlc.C.index).all()==True # 'signal index not equals price index'
# assert用来判断语句的真假,如果为假的话将触发AssertionError错误, 为开发人员提示出错的表达式
return norm_return_strategy, n_short, n_long, SD
结果图: 有四张, 主要用于质量控制的目的.
1. 历史价格
2. 交易信号
3. 第2的子集, 放大后才能看清楚, 技术指标择时模型的细节(如何触发交易信号)
4. 策略的收益率
后续补充内容:
封装成类
- 添加绩效策略指标: 一大堆的东西
优化
- 完善绘图程序, 智能地选择输入(data_obj, param, **kwargs)




用Python编写的第一个回测程序的更多相关文章
- 手把手教你用Python搭建自己的量化回测框架【均值回归策略】
手把手教你用Python搭建自己的量化回测框架[均值回归策略] 引言 大部分量化策略都可以归类为均值回归与动量策略.事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利.否则,价格是随机游走的, ...
- 使用Python写的第一个网络爬虫程序
今天尝试使用python写一个网络爬虫代码,主要是想訪问某个站点,从中选取感兴趣的信息,并将信息依照一定的格式保存早Excel中. 此代码中主要使用到了python的以下几个功能,因为对python不 ...
- 用python 编写redis 暴力破解密码的程序
本文摘自http://blog.knownsec.com/2015/11/analysis-of-redis-unauthorized-of-expolit/ import redisimport l ...
- 量化投资策略:常见的几种Python回测框架(库)
量化投资策略:常见的几种Python回测框架(库) 原文地址:http://blog.csdn.net/lawme/article/details/51454237 本文章为转载文章.这段时间在研究量 ...
- Python之路第一课Day1--随堂笔记
课堂大纲: 一.Python介绍 二.发展史 三.Python 2 or 3? 四.安装 五.Hello World程序 六.变量 七.用户输入 八.模块初识 九..pyc是个什么鬼? 十.数据类型初 ...
- Python自动化 【第一篇】:Python简介和入门
Python简介: 一.什么是python Python是一门动态解释性的强类型定义语言. pythonde 特点:“优雅”.“明确”.“简单”. 二.Python由来 python的创始人为吉多·范 ...
- 如何使用TradingView(TV)回测数字货币交易策略
更多精彩内容,欢迎关注公众号:数量技术宅.想要获取本期分享的完整策略代码,请加技术宅微信:sljsz01 TradingView平台简介 前段时间,有粉丝找到技术宅,表示他有一个常用的交易平台,叫做T ...
- python 基础篇第一篇
本节内容 1.python介绍 2.发展史 3.python2和python3 4.安装 5.简单程序,hello world程序 6.变量 7.用户输入 8.模块初识 9..pyc是什么? 10.数 ...
- Python编写守护进程程序
Python编写守护进程程序思路 1. fork子进程,父进程退出通常,我们执行服务端程序的时候都会通过终端连接到服务器,成功连接后会加载shell环境,终端和shell都是进程,shell进程是终端 ...
随机推荐
- 使用 U盘 重装 Mac OSX
一.制作 U 盘系统启动盘 1.从 App Store 上下载 OS Application.(这里需要注意,取消下载完的自动更新,并存储下这个 OS.Application 文件,因为系统更新完后, ...
- ngrok 外网访问小能手
以前在学校的时候想把自己做的网站发布让外网访问,可是又没有虚拟服务器和域名就显得异常的麻烦,曾经试过花生壳映射,效果虽然还不错,但是略显麻烦.今天找到一个更方便的小工具--ngrok ! 简单的介绍一 ...
- centos升级支持到C++11, gcc4.8.2
升级到4.8[这个应该是目前最新的啦,不过网上查的话已经到5.2啦,感觉落后一点比较稳,当然还有就是这个版本是新的里面使用最多的] wget http://people.centos.org/tru/ ...
- openstack搭建配置
安装和配置网络节点vim /etc/sysctl.confnet.ipv4.ip_forward=1net.ipv4.conf.all.rp_filter=0net.ipv4.conf.default ...
- Android ListView 子控件点击事件
android:descendantFocusability beforeDescendants:viewgroup会优先其子类控件而获取到焦点 afterDescendants:viewgroup只 ...
- RDIFramework.NET ━ 9.13 系统日志与系统异常管理 ━ Web部分
RDIFramework.NET ━ .NET快速信息化系统开发框架 9.13 系统日志与系统异常管理 -Web部分 一个软件在投入运行时不可能没有任何异常,在软件发生异常时及时的记录下来,也好我 ...
- 计划将项目中使用entity framework的要点记录到改栏目下
ef监控sql执行性能日志.http://www.cnblogs.com/CreateMyself/p/5277681.html http://123.122.205.38/cn_sql_server ...
- 20145320 《Java程序设计》第1周学习总结
20145320 <Java程序设计>第1周学习总结 教材学习内容总结 第一章 Java最早是Sun公司的项目Green Project中编写Star7应用程序的程序语言,1995年5月2 ...
- 图割Graph-Cut的最大流实现
利用最大流标号法求解最大流,详见代码: Version:未加头尾节点版: 缺点:havn't take nodes' pixels into consideration /************** ...
- android 绘图之Path与Paint详解
/** * Paint类介绍 * * Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色, * 样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法, * 大体上可以分 ...