用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. 策略的收益率

后续补充内容:


  1. 封装成类

  2. 添加绩效策略指标: 一大堆的东西
  3. 优化

  4. 完善绘图程序, 智能地选择输入(data_obj, param, **kwargs)

用Python编写的第一个回测程序的更多相关文章

  1. 手把手教你用Python搭建自己的量化回测框架【均值回归策略】

    手把手教你用Python搭建自己的量化回测框架[均值回归策略] 引言 大部分量化策略都可以归类为均值回归与动量策略.事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利.否则,价格是随机游走的, ...

  2. 使用Python写的第一个网络爬虫程序

    今天尝试使用python写一个网络爬虫代码,主要是想訪问某个站点,从中选取感兴趣的信息,并将信息依照一定的格式保存早Excel中. 此代码中主要使用到了python的以下几个功能,因为对python不 ...

  3. 用python 编写redis 暴力破解密码的程序

    本文摘自http://blog.knownsec.com/2015/11/analysis-of-redis-unauthorized-of-expolit/ import redisimport l ...

  4. 量化投资策略:常见的几种Python回测框架(库)

    量化投资策略:常见的几种Python回测框架(库) 原文地址:http://blog.csdn.net/lawme/article/details/51454237 本文章为转载文章.这段时间在研究量 ...

  5. Python之路第一课Day1--随堂笔记

    课堂大纲: 一.Python介绍 二.发展史 三.Python 2 or 3? 四.安装 五.Hello World程序 六.变量 七.用户输入 八.模块初识 九..pyc是个什么鬼? 十.数据类型初 ...

  6. Python自动化 【第一篇】:Python简介和入门

    Python简介: 一.什么是python Python是一门动态解释性的强类型定义语言. pythonde 特点:“优雅”.“明确”.“简单”. 二.Python由来 python的创始人为吉多·范 ...

  7. 如何使用TradingView(TV)回测数字货币交易策略

    更多精彩内容,欢迎关注公众号:数量技术宅.想要获取本期分享的完整策略代码,请加技术宅微信:sljsz01 TradingView平台简介 前段时间,有粉丝找到技术宅,表示他有一个常用的交易平台,叫做T ...

  8. python 基础篇第一篇

    本节内容 1.python介绍 2.发展史 3.python2和python3 4.安装 5.简单程序,hello world程序 6.变量 7.用户输入 8.模块初识 9..pyc是什么? 10.数 ...

  9. Python编写守护进程程序

    Python编写守护进程程序思路 1. fork子进程,父进程退出通常,我们执行服务端程序的时候都会通过终端连接到服务器,成功连接后会加载shell环境,终端和shell都是进程,shell进程是终端 ...

随机推荐

  1. Different Approaches for MVCC

    https://www.enterprisedb.com/well-known-databases-use-different-approaches-mvcc Well-known Databases ...

  2. 一步一步来做WebQQ机器人-(二)(第一次登陆)

    // 预计会有这些步骤,当然某些步骤可能会合并: 验证码 第一次登陆 第二次登陆 保持在线和接收消息 获取好友和群列表 发送消息 变成智能的(*゚∀゚*) webqq的登陆,分为2步,本文主要讲第一次 ...

  3. python中的构造函数和析构函数

    python中的特殊方法,其中两个,构造函数和析构函数的作用: 比说“__init__”这个构造函数,具有初始化的作用,也就是当该类被实例化的时候就会执行该函数.那么我们就可以把要先初始化的属性放到这 ...

  4. Android开发之Intent略解

    Intent是一种运行时绑定(run-time binding)机制,它能在程序运行过程中连接两个不同的组件.通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意 ...

  5. Rsyslog配置文件详解

    Rsyslog配置文件详解https://my.oschina.net/0757/blog/198329 # Save boot messages also to boot.log 启动的相关信息lo ...

  6. oracle创建、删除账户

    1.创建 /*第1步:创建表空间 */create tablespace xybi datafile 'E:\oracle\oradata\zzxe\xybi_d01' size 100M ; /*第 ...

  7. SDK开发断点失效

    做SDK开发,一般会创建一个静态库工程,然后添加一个app的Target 可是,Xcode7创建的工程,app的Target中断点有效,能断住,为什么静态库的Target中的断点断不住呀. 断点断住发 ...

  8. vertical-align属性

    准备阶段 vertical-align取值及含义: 值 含义 baseline 默认.元素放置在父元素的基线上. top 把元素的顶端与行中最高元素的顶端对齐 text-top 把元素的顶端与父元素字 ...

  9. require,include,require_once,include_once的区别

    最近面试时被问到,一时间还真没想到太多,仅仅回答了大概的几个,于是回来再确认一下. 以下内容为网络摘抄: ①作用及用法  可以减少代码的重复 include(_once)("文件的路径&qu ...

  10. [转] PHP计算两个坐标之间的距离, Calculate the Distance Between Two Points in PHP

    Calculate the Distance Between Two Points in PHP There are a lot of applications where it is useful ...