在跑回测的过程中,我发现了一个比较容易被忽视的一个坑:均线在回测的时间段是不全的。

如图所示,图中红色的线是90日均线,回测的时间范围是2020-01-01 08:00:00 至 2024-01-01 16:00:00,可以看到图中最开始的一段走势中都没有红线,直到2020-05-18 那天才出现红线。

图片

均线在2020年5月18日才出现,这会导致我们的策略在2020年5月18号前都失效!下图是运行回测时的买卖结果,可以看到最早的买单是在2020年6月1日创建的:

图片
那怎样才能解决这个问题呢?

阅读全文 »

今天这篇来讲一下backtrader的策略参数调优,这块有点像机器学习,一遍一遍地迭代,找出最佳的参数值。
还是以之前的单均线策略为例子,讲一下怎么找出收益最高时的均线的周期参数。
参数调优的原理就是在回测时,让程序把不同参数值一个个代入回测,然后根据每个参数所得到的最终收益来确定哪个参数是最优参数。
执行回测时,把addstrategy改为optstrategy,再加上参数的调优范围即可。如果是对指定值进行调优,可以用元组指定要回测的参数值,如果想对连续的一系列连续的参数值进行回测,可以用range来指定范围。
指定要回测的参数值:

1
2
3
cerebro.optstrategy(
SingleMAStrategy,
period=(10,20,30,60,90))

指定要回测的参数范围:

1
2
3
cerebro.optstrategy(
SingleMAStrategy,
period=range(10, 30))

主程序如下:

阅读全文 »

今天这篇是backtrader文档的学习笔记。主要介绍了一些基本概念,包括数据源(Data Feeds)的使用、参数(Parameters)等。

官方文档链接:https://www.backtrader.com/docu/concepts

文中例子中的代码都需要导入以下库:

1
2
3
4
5
6
# 导入backtrader
import backtrader as bt
# 导入指标库
import backtrader.indicators as btind
# 导入数据源库
import backtrader.feeds as btfeeds

数据源

阅读全文 »

接入实时数据是仿真和实盘的基础,如果不能仿真和实盘,那用backtrader写的策略代码就都只能做研究了。我搜遍了全网都没有找到backtrader如何自定义实时数据源及券商接口的解决方案,backtrader支持的实盘券商不多,在官网上也没找到自定义接口的文档。在研究了backtrader内置的盈透实盘接口的文档和代码后,发现其实实盘与回测差别也就是两点:实时数据源、券商交易接口。

前一篇文章讲了怎么通过掘金量化的history接口获取数据提供给backtrader使用。本文将介绍怎么利用管道通过掘金量化的on_bar、on_tick回调函数获取实时数据。

整体思路是这样的:首先自定义一个 MyQuantData 类用来表示从掘金量化获取的实时数据源:

MyQuantData继承了bt.feed.DataBase类,conn 是用来接收从掘金量化那里传来的行情数据,islive函数用来表示这个数据源是不是实时数据源,这里一定要让它返回True,不然在运行程序的时候会卡住。获取数据的函数是_load函数,通过bar = self.conn.recv()获取管道中传来的数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class MyQuantData(bt.feed.DataBase):
conn = None

def islive(self):
return True

def start(self):
super(MyQuantData, self).start()
if self.conn is None:
raise Exception("Invalid conn!")

def stop(self):
super(MyQuantData, self).stop()
if self.conn is not None:
self.conn.close()
self.conn = None

def _load(self):
if self.conn is None:
return False
try:
bar = self.conn.recv()
self.lines.datetime[0] = bt.utils.date2num(bar['eob'])
self.lines.open[0] = bar['open']
self.lines.high[0] = bar['high']
self.lines.low[0] = bar['low']
self.lines.close[0] = bar['close']
self.lines.volume[0] = bar['volume']
self.lines.openinterest[0] = -1
return True
except:
return False
阅读全文 »

今天这篇是平时工作时的技术总结,我是一个测试开发工程师,目前开发了一套智能硬件的测试框架,还开发了一套智能硬件的云真机测试平台。

在云真机平台的日常运行中,我发现了一个比较奇怪的问题,当长时间批量设备执行测试时,有时候会出现设备大量掉线,并且重插usb电脑不识别设备,就好像usb接口坏了一样,只有重启电脑才能解决这个问题。

在经过一段时间的排查后,发现这是因为批量执行测试时,adb调用的并发量太大,超过了电脑所能承受的上限。当每秒adb的调用次数在10次左右时,可以稳定运行测试,调用速率再快就会导致usb出问题。最终,通过对adb调用进行限流解决了这个问题。

限流方案我采用的是令牌桶的方案,每秒重置桶里令牌数为10个,当测试引擎成功获取到令牌时,调用adb,获取失败时循环等待令牌。限流方案的示意图如下:

阅读全文 »

昨天介绍了怎么用掘金量化做回测,今天介绍下怎么用backtrader来做回测,backtrader 是一个在量化界大名鼎鼎的量化回测框架,功能丰富,是量化交易初学者必学的量化回测框架。目前的话我也是刚入门,只会拿它做回测,还没研究出怎么把backtrader与掘金量化结合起来用backtrader直接跑仿真和实盘。

backtrader的官网:https://www.backtrader.com/

官网安装教程:https://www.backtrader.com/docu/installation/

官方的入门教程:https://www.backtrader.com/docu/quickstart/quickstart/

接下来以单均线策略介绍下怎么用backtrader结合掘金量化的数据跑回测:

阅读全文 »

去年花了很多时间在学习股票投资上,还折腾了量化交易。

市场如战场,每时每刻行情都会变。我尝试过盯盘,太累了,而且一直盯盘会让自己心情起落不定,心态不平稳,同时也会导致自己不能专注于工作。

量化的好处是不用自己盯盘了,写好策略后让电脑按照策略执行就可以了。其实炒股就是根据当前舆论、市场的情况预测自己看好的股票会涨还是会跌,预测会涨就买入,预测会跌就卖出。不过我现在的水平还很菜,一直没敢实盘。

我用的是掘金量化平台,可以去 https://www.myquant.cn/terminal 下载,安装好后把sdk什么的装好就能用了。

单均线策略很简单:首先计算出一条均线,当天价格上穿均线则买入,当天价格下穿均线则卖出。

阅读全文 »

前面两篇介绍了如何运行 LiveKit 官方给的示例程序,今天来介绍一下怎么修改它的 flutter 示例,使它能符合我的需要搭建出一套视频对讲系统。

首先捋一下要实现的效果,我想为家里实现一个视频对讲系统,店里没人的时候,爸妈可以在手机上远程看店,顾客可以通过屏幕与爸妈交谈。爸妈年纪都大了,所以整个系统越简单越好,界面上的按钮越少越好,然后视频会话要能自动建立,一键建立。

接下来就来简单地说一下怎么修改示例程序,使我们的需求能实现。

官方示例中的文件结构是这样的

阅读全文 »
0%