用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进程是终端 ...
随机推荐
- iTunes.exe 在win7系统中运行出错解决办法
重新安装了iTunes打开后就报错,然后直接退出 查windows日志提示错误应用程序名称: iTunes.exe 错误模块名称: KERNELBASE.dll 重新安装iTunes问题依旧,后来在G ...
- Python之什么是函数
我们知道圆的面积计算公式为: S = πr² 当我们知道半径r的值时,就可以根据公式计算出面积.假设我们需要计算3个不同大小的圆的面积: r1 = 12.34 r2 = 9.08 r3 = 73.1 ...
- DevExpress中的ASPxTreeView 递归显示checknodes并获得选中值
aspx代码 <dx:ASPxTreeView ID="ASPxTreeView1" runat="server"> </dx:ASPxTre ...
- ionic安装指定版本
npm install -g ionic@1.4.0 原文地址:http://stackoverflow.com/questions/30316994/how-to-install-specific- ...
- kafka 生产者java编码
public class KafkaProducerDemo { public static void main(String[] args) throws InterruptedException ...
- php日期,时间相关知识整理
unix 时间戳:从1970年1月1日0点开始到当前时间所经过的秒数. 1.将日期转换为UNIX时间戳 mktime():可以自动校正越界的输入 原型 : mktime(hour,minute,sec ...
- java获取获得Timestamp类型的当前系统时间。以及java.util.date 、java.sql.Date之间的转换
java获取取得Timestamp类型的当前系统时间java获取取得Timestamp类型的当前系统时间 格式:2010-11-04 16:19:42 方法1: Timestamp d = new T ...
- meta标签详解(meta标签的作用)///////////////////////////转
meta标签详解(meta标签的作用) 很多人却忽视了HTML标签META的强大功效,一个好的META标签设计可以大大提高你的个人网站被搜索到的可能性,有兴趣吗,谁我来重新认识一下META标签吧 ...
- XmlHttpRequest 小记
视图页面代码 控制器代码
- Access数据库中Sum函数返回空值(Null)时如何设置为0
在完成一个Access表中数据统计时,需要统计指定字段的和,使用到了Sum函数,但统计时发现,指定条件查询统计时有可能返回空值(Null),导致对应字段显示为空白,正常应显示为0.基本思路是在获取记录 ...