Loading ...

FMZ 发布 python 本地 回测引擎

Author: 小小梦, Created: 2018-04-13 09:48:31, Updated: 2019-08-19 16:30:05

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 *                                                  # 引用 发明者量化 库
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 *                                                # 引用 发明者量化 库
    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平台通信嘛?回测哪个策略是在哪里设置的呢?

chujiu 对的

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 策略回测页面生成。