Loading ...

BotVS 发布 python 本地 回测引擎

Author: 小小梦, Created: 2018-04-13 09:48:31, Updated: 2018-11-09 16:40:35

FMZ 发布 python 本地 回测引擎

FMZ backtest engine python package FMZ 回测引擎 python 库 support python2 and python3, support Windows, Linux, Mac 支持 python2 和 python3 , 支持 windows 系统,Linux 系统 ,苹果Mac OS 系统

install

安装 在命令行 输入以下命令:

pip install https://github.com/fmzquant/backtest_python/archive/master.zip
  • 注意: 苹果 Mac 系统 安装时,如果有安全限制,需要 在 pip 命令前加 sudo 命令,整条安装命令执行前会 要求输入 系统密码。

simple example

简单例子

'''backtest
start: 2018-02-19 00:00:00
end: 2018-03-22 12:00:00
period: 15m
exchanges: [{"eid":"OKEX","currency":"LTC_BTC","balance":3,"stocks":0}]
'''
from fmz import *
task = VCtx(__doc__) # initialize backtest engine from __doc__
print exchange.GetAccount()
print exchange.GetTicker()
print task.Join() # print backtest result

The config string can be generated automatically by saving the backtest configuration in the strategy edit page. 配置字符串可以通过策略编辑界面里的保存回测配置来自动生成

meta

documentation

API 文档:(即范例中 调用 GetAccount 等函数的文档)

Python 代码简单注释:

'''backtest
start: 2018-02-19 00:00:00
end: 2018-03-22 12:00:00
period: 15m
exchanges: [{"eid":"OKEX","currency":"LTC_BTC","balance":3,"stocks":0}]
'''
from fmz import *                                                  # 引用 botvs 库
task = VCtx(__doc__) # initialize backtest engine from __doc__     # 调用 VCtx 函数 根据 __doc__初始化。
print exchange.GetAccount()                                        # 测试 GetAccount 函数,并打印 回测系统测试交易所账户信息
print exchange.GetTicker()                                         # 测试 GetTicker 函数,并打印 回测系统 行情信息
print task.Join() # print backtest result                          # 调用 初始化后的 task 对象 显示回测结果
  • __doc__

    是两个下划线。__doc__用来访问模块,类声明或者函数的声明中第一个未被赋值的字符串,
    可以是被""" ""","" "",' ',括起来的,作用就是把 代码中 '''backtest   ...  ''' 的回测配置信息  传入 VCtx 类构造函数构造对象。
    
  • 修改下 测试代码, 看看 具体 Log 、GetTicker 函数如何调用。

    # coding=UTF-8
    
    '''backtest
    start: 2018-02-19 00:00:00
    end: 2018-03-22 12:00:00
    period: 15m
    exchanges: [{"eid":"OKEX","currency":"LTC_BTC","balance":3,"stocks":0}]
    '''
    
    from fmz import *                                                # 引用 botvs 库
    task = VCtx(__doc__) # initialize backtest engine from __doc__     # 调用 VCtx 函数 根据 __doc__初始化。
    print exchange.GetAccount()                                        # 测试 GetAccount 函数,并打印 回测系统测试交易所账户信息
    Log("\n 调用Log")
    Log("调用 exchange.GetTicker() : ", exchange.GetTicker())
    print task.Join() # print backtest result                          # 调用 初始化后的 task 对象 显示回测结果
    
    • print exchange.GetAccount() 代码输出显示的内容为:
    {'Balance': 3.0, 'Stocks': 0.0, 'FrozenBalance': 0.0, 'FrozenStocks': 0.0}
    
    • Log("\n 调用Log") 、 Log("调用 exchange.GetTicker() : ", exchange.GetTicker())

    输出的内容在 print task.Join() 输出数据 结构内:

    {
        "Chart": {
     	   "Cfg": "",
     	   "Datas": []
        },
        "Elapsed": 42000000,
        "Finished": true,
        "Indicators": {},
        "LoadBytes": 441845,
        "LoadElapsed": 24000000,
        "LogsCount": 2,
        "Profit": 0.0,
        "ProfitLogs": [],
        "Progress": 100.0,
        "RuntimeLogs": [                                                  # 调用输出内容在此处
     	   [1, 1518969600200, 5, "", 0, 0.0, 0.0, "\n 调用Log", "", ""],
     	   [2, 1518969600400, 5, "", 0, 0.0, 0.0, "调用 exchange.GetTicker() :  {'Sell': 0.02113476, 'Volume': 519.6953, 'Buy': 0.02113474, 'Last': 0.02113475, 'High': 0.02113476, 'Time': 1518969600000L, 'Low': 0.02113474}", "", ""]
        ],
        "Snapshort": [{
     	   "Balance": 3.0,
     	   "BaseCurrency": "LTC",
     	   "Commission": 0.0,
     	   "FrozenBalance": 0.0,
     	   "FrozenStocks": 0.0,
     	   "Id": "OKEX",
     	   "QuoteCurrency": "BTC",
     	   "Stocks": 0.0,
     	   "Symbols": {
     		   "LTC_BTC_OKEX": {
     			   "Last": 0.01893785
     		   }
     	   },
     	   "TradeStatus": {}
        }],
        "Status": "",
        "Task": {
     	   "Args": null,
     	   "Exchanges": [{
     		   "Balance": 3,
     		   "BaseCurrency": "LTC",
     		   "BasePeriod": 300000,
     		   "BasePrecision": 4,
     		   "DepthDeep": 5,
     		   "FaultTolerant": 0,
     		   "FeeDenominator": 5,
     		   "FeeMaker": 75,
     		   "FeeMin": 0,
     		   "FeeTaker": 80,
     		   "Id": "OKEX",
     		   "Label": "OKEX",
     		   "PriceTick": 1e-08,
     		   "QuoteCurrency": "BTC",
     		   "QuotePrecision": 8,
     		   "SlipPoint": 0,
     		   "Stocks": 0
     	   }],
     	   "Options": {
     		   "DataServer": "q.botvs.net",
     		   "MaxChartLogs": 800,
     		   "MaxProfitLogs": 800,
     		   "MaxRuntimeLogs": 800,
     		   "NetDelay": 200,
     		   "Period": 900000,
     		   "RetFlags": 189,
     		   "SnapshortPeriod": 300000,
     		   "TimeBegin": 1518969600,
     		   "TimeEnd": 1521691200,
     		   "UpdatePeriod": 5000
     	   }
        },
        "TaskStatus": 1,
        "Time": 1521691200000
    }
    
  • 如何使用一个策略 在本地回测引擎中回测

# !/usr/local/bin/python
# -*- coding: UTF-8 -*-
'''backtest
start: 2018-02-19 00:00:00
end: 2018-03-22 12:00:00
period: 15m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD","balance":10000,"stocks":3}]
'''
import sys
sys.path.append("/usr/local/lib/python2.7/site-packages")    # 测试时添加了路径,如不需要可以删除

from fmz import *
import math
import talib

task = VCtx(__doc__) # initialize backtest engine from __doc__

# ------------------------------ 策略部分开始 --------------------------
print exchange.GetAccount()     # 调用一些接口,打印其返回值。
print exchange.GetTicker()

def adjustFloat(v):             # 策略中自定义的函数
    v = math.floor(v * 1000)
    return v / 1000

def onTick(e):
    Log("onTick")
    # ....

#
# ...
# 
# 此处省略 自定义函数实现等代码。

def main():
    InitAccount = GetAccount()
    
    while True:
        onTick(exchange)
        Sleep(1000)
# ------------------------------ 策略部分结束 --------------------------

try:
    main()                     # 回测结束时会 raise EOFError() 抛出异常,来停止回测的循环。所以要对这个异常处理,在检测到抛出的异常后调用 task.Join() 打印回测结果。
except:
    print task.Join()          # print backtest result  , 打印回测结果。

More

started 碰到跟楼下一样的问题了 exchange这个东西找不到 windows系统 /upload/asset/835c597bf316fa272135.png

1058715329 什么时候可以支持本地的参数优化?

西湖秋名山 @小小梦 谢谢。有python3的模版么?我已经下载了fmz的库,但使用的时候报错,找不到包在哪。 /upload/asset/1042a0deeb6624376f8fb.png

ArcTsai 同样的问题,切换到不同交易所、回测时间段、交易对之后。GetTicker类似函数返回 ret都是-2 /upload/asset/1307caa72dd498457b65fc1cbdcb660b.jpg

weis 如何设置Tick模式?默认貌似用的是模拟级Tick,怎么切换到实盘级Tick

sxiaojian 还是不会用,一个策略的main函数应该放在这个例子里的什么地方

sxiaojian 回测只能用LTC_BTC吗?我改成BTC_USDT程序就报错了

teddy print exchange.GetTicker() 在 python3 中是不是应该写成print (exchange.GetTicker())?

yxybyq 在平台回测没问题,本地回测经常报错

liput 在fmz中是自己写main函数,看到大多数策略都是自己写while True,然后一直循环调用策略的。但是在使用python的本地回测引擎时,while True会一直让程序运行,无法在__doc__指定的起始时间和结束时间内停止运行,并给出Log的输出。这时候应该怎么办? 另外,我在其他的量化平台看到一般都是只由开发者编写指定的函数,然后由平台回调。fmz允许直接编写main入口,是有什么设计上或架构上的优势或考虑吗?

liput 代码中的交互输入变量,怎么写在__doc__里面,或者是作为参数输入呢?

liput 代码已经改成fmz了,文档里面的示例代码要改一下package名。

YesYes main()里是正常的 在class里call exchange会报错,原因是?   File "D:/workspace/strategy/strategy_001.py", line 101, in main     account = self._exchange.GetAccount()   File "C:\Users\User\AppData\Local\Programs\Python\Python36-32\lib\site-packages\botvs.py", line 716, in GetAccount     EOF()   File "C:\Users\User\AppData\Local\Programs\Python\Python36-32\lib\site-packages\botvs.py", line 569, in EOF     raise EOFError()

hermes0911 是不是必须安装这个库,python写的策略才能跑回测呢?

topscien 这个东西的作用是什么?没看懂哦

Lizza 没太看明白怎么用的,这个本地回测还需要跟botvs平台通信嘛?回测哪个策略是在哪里设置的呢?

xenide

小小梦 好的 ,这个记录下,暂时没有支持。

西湖秋名山 好的,谢谢。

小小梦 找到问题了,正在处理。

西湖秋名山 是的,mac os 10.14.4

小小梦 您的操作系统是 Mac OSX么

西湖秋名山 我是用conda进行python版本管理的,我确认已经下载了fmz的python版本,本地也有了。但看官网上是写的支持python3的,但我去尝试的时候就出现这问题了。是我代码写错了么?我不知道exchange这个对象哪里来的,Log也无法找到。

小小梦 您是不是有多个 python 版本,检查下 看这个包安装到哪里了。

小小梦 这个有固定 格式,使用 页面上的 回测, /upload/asset/d9db065f6175111d4eedc44ccc502d67.png 保存 回测参数,回测 设置就保存在代码里面了。复制出来就可以用。

ArcTsai 感谢您的回答,但是我这里是通过配置字符串的方式改的回测时间 交易对和 交易所,没有通过IO函数。似乎修改任意一个,ret就会返回错误。例如图中画红线的地方,我把示例中的19日改为20日。就会报同样的错误。 /upload/asset/4ae4eb8338051eeff9d1553b163ba180.jpg

小小梦 回测 不支持 切换交易对。exchange.IO("currency", "XXX_XXX") 这样不支持的。

小小梦 帖子已经更新,您可以看下帖子最后的 范例。

小小梦 main 函数写好, 直接 调用就行了。

sxiaojian https://github.com/fmzquant/backtest_python/issues/4,看看这个有没有帮助

小小梦 错误信息 ,具体 可以截图看下。

sxiaojian 就是示例代码改成BTC_USDT就出错

小小梦 这个要看是 选择的是 哪个交易所 回测。

小小梦 要具体看下 报错信息 ,看下是错误位置。

小小梦 FMZ 采用的是 轮询架构 ,这样对于 程序 流程掌控力更强一点,编写策略更加灵活。

小小梦 '''backtest start: 2018-02-19 00:00:00 end: 2018-03-22 12:00:00 period: 15m exchanges: [{"eid":"OKEX","currency":"LTC_BTC","balance":3,"stocks":0}] ''' 这些 就是

小小梦 修改了一下。

小小梦 文件 开始 加载 这个 模拟账户配置 , 如果写在 类里面 是不是 加载不到了。

YesYes 这配置应该是对的吧 为什么不能写进class引用

YesYes 回测账户数据,是下面几行吗? 有喔,在global function main里正常引用。 可是在class里却报错 '''backtest start: 2018-02-19 00:00:00 end: 2018-03-22 12:00:00 period: 15m exchanges: [{"eid":"OKEX","currency":"LTC_BTC","balance":3,"stocks":0}] ''' from botvs import * task = VCtx(__doc__) # initialize backtest engine from __doc__

小小梦 ``` def GetAccount(self): r = _ACCOUNT() ret = self.lib.api_Exchange_GetAccount(self.ctx, self.idx, ctypes.byref(r)) if ret == API_ERR_SUCCESS: return r.toObj() elif ret == API_ERR_FAILED: return None EOF() ``` 看了下代码 好像 api_Exchange_GetAccount 这个是一个 DLL 的接口, 您上面报错信息 显示 没有返回 调用成功 也没有返回调用失败, 然后就去执行 EOF 了。您 使用回测引擎 时 有配置 回测账户 数据么?

小小梦 并不是 , 您在 本地 用 python 回测 才使用这个 库的。

小小梦 就是 把回测系统 打包成一个 python 库了, 可以让 本地 python 进行策略 回测。

小小梦 会有 通信,回测时是有数据请求的,不过运行是在本地跑的回测系统。 ``` '''backtest start: 2018-02-19 00:00:00 end: 2018-03-22 12:00:00 period: 15m exchanges: [{"eid":"OKEX","currency":"LTC_BTC","balance":3,"stocks":0}] ''' from botvs import * task = VCtx(__doc__) # initialize backtest engine from __doc__ print exchange.GetAccount() print exchange.GetTicker() print task.Join() # print backtest result ``` 这个段代码 就类似 一个 策略, 回测系统 被封装成一个 库了, 测试 运行的时候 调用回测系统的功能。 上面的 '''backtest ... ''' 内的 就是 回测参数设置, 可以在BotVS 策略回测页面生成。