用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进程是终端 ...
随机推荐
- VS2010 更改C#类库模板
首先你找到你自己的 VS2010安装目录,例如我本地是: D:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ItemTem ...
- Android Http请求方法汇总
[转] 原文 这篇文章主要实现了在Android中使用JDK的HttpURLConnection和Apache的HttpClient访问网络资源,服务端采用python+flask编写,使用Serv ...
- python3中urllib2的问题
import urllib from urllib import request a = urllib.request.Request(url) b = urllib.request.urlopen( ...
- mysql数据库、表、字段、记录:增、删、改、查
/* 结构:数据库.表.字段.记录 操作:增删改查 */ -- 1.数据库:增删改查 create datebase if not exists jkxy; drop database if exis ...
- [Android Tips] 6. Parallax ViewPager
文章 http://ryanhoo.github.io/blog/2014/07/16/step-by-step-implement-parallax-animation-for-splash-scr ...
- wkhtmltopdf 中文参数详解
linux:wkhtmltopdf [OPTIONS]… [More input files] windows:wkhtmltopdf.exe [OPTIONS]… [More input files ...
- U盘文件偷窃程序
// Drives.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "windows.h" #incl ...
- 弹性伸缩布局flex
Flex 布局教程:语法篇 作者: 阮一峰 日期: 2015年7月10日 网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display属性 + posi ...
- bug检测报告---礼物挑选小工具--飞天小女警
飞天小女警----礼物挑选小工具 测试产品链接:http://123.207.159.79:8088/giving_gifts/ 发布在作者的博客里面:http://www.cnblogs.com/s ...
- 关于ebox
看了介绍,觉得挺不错的东西,希望能够一路走下去 老话题STM32编程,新思路,一样是编程,味道却大有不同.这就是STM32之eBox编程.让你提议不一样的编程,让开发快到你意想不 ...