使用 python 的量化平台目前很多啊,现在就三家**ricequant,joinquant,raquant**做一下简单评测

[分钟级别] 回测速度比较

同样一段双均线( SMA 长短线)策略,虽然这个双均线,没必要每分钟都刷,毕竟作为超短期指标,双均线意义不大。

所以这也是让策略开发者困扰的一点,有时候有些策略的逻辑在“被选择的频度”下面毫无意义。镭矿则没有这一困扰,镭矿策略代码里面规定是什么频度执行就是什么频度执行。

言归正传,现在我们来用这个经典策略对比一下各个平台,分钟频度下一年半(2015-05-01 到 2017-01-01 )的回测速度。每分钟刷日线数据肯定是更没有意义,所以小编将 ricequant 和 joinquant 的获取历史数据的参数手动改为获取分钟数据

策略 A:

回测时间: 2015-05-01 至 2017-01-01

使用分钟数据,短均线上穿长均线,则买入,反之,则清仓卖出

对篇幅很恐惧的同学请先看一下这个表格:

策略 A 的回测时间对比表格

ricequant 3 到 4 分钟

joinquant 表现好的时候 6 分钟

下面是镭矿 raquant的代码,耗时 17 秒

def init(context):

context.s1="sha-600000"

sma12_factor=SMAFactor(12,"close")

sma30_factor=SMAFactor(30,"close")

reg_factor("sma12",sma12_factor)

reg_factor("sma30",sma30_factor)

def every_minute(context,data):

stock=context.s1

ma12=factor_output("sma12",context.s1,"m1")["sma12"]

ma30=factor_output("sma30",context.s1,"m1")["sma30"]

if ma12>ma30:

order(stock,1000)

elif ma12 < ma30 and context.portfolio.positions[stock].amount > 0:

order_target_value(stock,0)

下面是 joinquant 的代码,耗时 6 分钟

# 初始化函数,设定要操作的股票、基准等等

def initialize(context):

# 定义一个全局变量, 保存要操作的股票

# 000001(股票:平安银行)

g.security = '000001.XSHE'

# 设定沪深 300 作为基准

set_benchmark('000300.XSHG')

# 每个单位时间(如果按天回测,则每天调用一次,如果按分钟,则每分钟调用一次)调用一次

def handle_data(context, data):

security = g.security

close_data = attribute_history(security, 10, '1m', ['close'],df=False)

ma5 = close_data['close'][-5:].mean()

ma10 = close_data['close'].mean()

cash = context.portfolio.cash

if ma5 > ma10:

order_value(security, cash)

log.info("Buying %s" % (security))

elif ma5 < ma10 and context.portfolio.positions[security].closeable_amount> 0:

order_target(security, 0)

log.info("Selling %s" % (security))

# 绘制五日均线价格

record(ma5=ma5)

# 绘制十日均线价格

record(ma10=ma10)

下面是 ricequant 的代码,耗时 3 到 4 分钟,貌似比 joinquant 的快,也有可能是因为这个例程的买入条件比较多?但是明显 ricequant 的回测准备时间较长。

import talib

# 在这个方法中编写任何的初始化逻辑。 context 对象将会在你的算法策略的任何方法之间做传递。

def init(context):

context.s1 = "000001.XSHE"

# 设置这个策略当中会用到的参数,在策略中可以随时调用,这个策略使用长短均线,我们在这里设定长线和短线的区间,在调试寻找最佳区间的时候只需要在这里进行数值改动

context.SHORTPERIOD = 20

context.LONGPERIOD = 120

# 你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新

def handle_bar(context, bar_dict):

prices = history(context.LONGPERIOD+1, '1m', 'close')[context.s1].values

short_avg = talib.SMA(prices, context.SHORTPERIOD)

long_avg = talib.SMA(prices, context.LONGPERIOD)

plot("short avg", short_avg[-1])

plot("long avg", long_avg[-1])

cur_position = context.portfolio.positions[context.s1].quantity

# 计算现在 portfolio 中的现金可以购买多少股票

shares = context.portfolio.cash/bar_dict[context.s1].close

# 如果短均线从上往下跌破长均线,也就是在目前的 bar 短线平均值低于长线平均值,而上一个 bar 的短线平均值高于长线平均值

if short_avg[-1] - long_avg[-1] < 0 and short_avg[-2] - long_avg[-2] > 0 and cur_position > 0:

# 进行清仓

order_target_value(context.s1, 0)

# 如果短均线从下往上突破长均线,为入场信号

if short_avg[-1] - long_avg[-1] > 0 and short_avg[-2] - long_avg[-2] < 0:

# 满仓入股

order_shares(context.s1, shares)

[日线级别] 回测速度比较

日线级别上,策略 A 回测时间对比表格(镭矿需要手动修改函数名 every_minute 为 every_day)

回测时间

镭矿 秒回(少于一秒)

ricequant 5 秒后秒回。(感觉任何回测都需要准备 5 秒钟)

joinquant 秒回(少于一秒)

对比不明显,我们来升级一下策略逻辑。为了简便,我们仍然修改策略 A ,形成策略 B 。

事实上这不是一个真正的策略,不产生任何交易。只不过我们这里为了尽快知道各个平台的回测速度罢了。

策略 B

每日轮询 50 只股票的 SMA 长短线, record 出符合 SMA 短线上穿长线的股票个数

def init(context):

context.stocks=find_by_group('sz50')

sma12_factor=SMAFactor(12,"close")

sma30_factor=SMAFactor(30,"close")

reg_factor("sma12",sma12_factor)

reg_factor("sma30",sma30_factor)

def every_day(context,data):

cnt=0

for stock in context.stocks:

ma12=factor_output("sma12",stock)["sma12"]

ma30=factor_output("sma30",stock)["sma30"]

if ma12>ma30:

cnt=cnt+1

record("cnt",cnt)

ricequant 代码

import talib

# 在这个方法中编写任何的初始化逻辑。 context 对象将会在你的算法策略的任何方法之间做传递。

def init(context):

context.stocks =concept('央企 50')

context.SHORTPERIOD = 20

context.LONGPERIOD = 120

def handle_bar(context, bar_dict):

cnt=0

for stock in context.stocks:

prices = history(context.LONGPERIOD+1, '1d', 'close')[stock].values

short_avg = talib.SMA(prices, context.SHORTPERIOD)

long_avg = talib.SMA(prices, context.LONGPERIOD)

if short_avg[-1] - long_avg[-1] < 0 and short_avg[-2] - long_avg[-2] > 0:

cnt=cnt+1

plot("cnt",cnt)

joinquant 的代码:

# 初始化函数,设定要操作的股票、基准等等

def initialize(context):

# 定义一个全局变量, 保存要操作的股票

# 000001(股票:平安银行)

g.stocks =get_concept_stocks('GN177')

set_benchmark('000300.XSHG')

# 每个单位时间(如果按天回测,则每天调用一次,如果按分钟,则每分钟调用一次)调用一次

def handle_data(context, data):

cnt=0

# 获取股票的收盘价

for stock in g.stocks:

close_data = attribute_history(stock, 10, '1d', ['close'],df=False)

# 取得过去五天的平均价格

ma5 = close_data['close'][-5:].mean()

# 取得过去 10 天的平均价格

ma10 = close_data['close'].mean()

# 取得当前的现金

if ma5>ma10:

cnt=cnt+1

record(cnt=cnt)

你们一定很好奇这次得对比结果,所以小编故意卖关子放到了最后

日线级别上,策略 B 回测时间对比表格

ricequant9 秒左右

joinquant6 秒左右

python股票回测_主流 Python 量化回测平台,回测速度客观评测相关推荐

  1. python股票查询系统_使用python获取股票的上市日期等基本信息

    之前介绍过一个Baostock的python证券数据平台,如今又增加了新的功能,提供了股票上市日期目,上市状态等信息的获取,也可以查询退市股票的信息. 还是按照之前的惯例,上代码: import ba ...

  2. python股票全套系统_用python来炒股三 炒股交易系统(法则)

    逢高买入法 I.假设处在在一段上升行情中,a 处买入后,在e处为最高点,当价格再次跌至d处全部卖出. 1. 若全程仅购入单份x且在a处,则获利为 (d- a)* x = 3px 2. 若全程在每个分点 ...

  3. python做var模型_【Python金融量化】VaR系列(五):Copula模型估计组合VaR

    作者:量化小白H     Python爱好者社区专栏作者 个人公众号:量化小白上分记 前文传送门: 之前总结的大部分模型都是基于正态性的假设,但实际上,正态性假设并不非常符合金融时间序列的特征.如果从 ...

  4. python判断回文_用python判断回文数

    信息举报 时间:2020-11-23 本页为您甄选多篇描写用python判断回文数,用python判断回文数精选,用python判断回文数大全,有议论,叙事 ,想象等形式.文章字数有400字.600字 ...

  5. python大数据免费_用python做大数据

    不学Python迟早会被淘汰?Python真有这么好的前景? 最近几年Python编程语言在国内引起不小的轰动,有超越Java之势,本来在美国这个编程语言就是最火的,应用的非常非常的广泛,而Pytho ...

  6. python炒股可行吗_用Python炒股,你不可以我能行!网友:略牛

    由于小编并无深厚的数学功底也无深厚的金融知识, 所以不会在本文中引用各种高深的投资模型或数学模型. 交易系统 这里的交易系统不一定是程序,只是指你自己的交易原则或者遵守的一些技巧或者方法,你可以手动执 ...

  7. python出现的意义_[转]Python中下划线以及命名空间的意义

    Python 用下划线作为变量前缀和后缀指定特殊变量/方法. 主要存在四种情形 1. 1. object # public 2. __object__ # special, python system ...

  8. python delimiter分隔符用法_使用Python文件读写,自定义分隔符(custom delimiter)

    众所周知,python文件读取文件的时候所支持的newlines(即换行符),是指定的.这一点不管是从python的doucuments上还是在python的源码中(作者是参考了python的io版本 ...

  9. 自学python 编程基础知识_一个python编程自学者的历程以及给自学新手的一些建议...

    文章原本昨晚已经在电脑写好了,今天准备用手机润润色再发表,结果误操作给删了,又要重新码字,真是日了狗了. 由于手机码字,以下python就用py简称代替了.写之前其实也犹豫再三,一则自己编程水平实在有 ...

  10. python大牛 关东升_《Python从小白到大牛》第4章 Python语法基础

    本章主要为大家介绍Python的一些语法,其中包括标识符.关键字.常量.变量.表达式.语句.注释.模块和包等内容. 标识符和关键字 任何一种计算机语言都离不开标识符和关键字,因此下面将详细介绍Pyth ...

最新文章

  1. apache bench linux,linux – 如何在CentOS上安装Apache Benchmark?
  2. 非Java程序员转行Java-day01-入门基础
  3. 兴利调节matlab编程,水利计算之兴利调节计算.ppt
  4. Ubuntu开发者峰会在布拉格举行
  5. chmod命令(chmod函数)自动清除设置用户ID位和设置组ID位
  6. java实现预览图片,点击实现下一张
  7. 数字地-DGND与模拟-AGND地的大学问
  8. 双系统卸载Linux,重装Deepin
  9. mysql自制食物_近2千条日常食物营养表ACCESS数据库Mysql数据库
  10. Ubuntu的下载安装教程--本人亲测
  11. java多边形合并_geotools实现多边形的合并缓冲区
  12. WFP之关联上下文数据以及注意事项
  13. 使用ArchR分析单细胞ATAC-seq数据(第十二章)
  14. 学生学籍管理系统~~登录界面(Java、SQL)
  15. 针对此次疫情的防控建议
  16. Zygote如何fork一个进程
  17. PKPM学习:板生成的问题
  18. Linux 关机和重启
  19. 【Linux编程】一、Linux常见指令和权限理解(思维导图总结)
  20. CPU峰值性能计算方法

热门文章

  1. Lucene PriorityQueue JDK PriorityQueue
  2. mysql登录出现1045错误
  3. Ubuntu下安装php7.1的gd,mysql,pdo_mysql扩展库
  4. Odoo 去掉 恼人的 上午和下午
  5. Syslog日志中心服务器收集windows和linux客户端日志
  6. PHP函数和MySQL数据库
  7. [BUG记录]java.lang.IllegalArgumentException: The observer is null.异常解决方案
  8. VS2005项目打开出错的解决办法
  9. [转]反射(用反射调用任意.net库中的方法)
  10. 【Hoxton.SR1版本】Spring Cloud Stream消息驱动