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
简单例子
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__
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.
配置字符串可以通过策略编辑界面里的保存回测配置来自动生成

documentation
API 文档:(即范例中 调用 GetAccount 等函数的文档)
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 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 } -
如何使用一个策略 在本地回测引擎中回测
python
# !/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 , 打印回测结果。
/Users/taoxing/opt/anaconda3/envs/ai4f/lib/python3.8/site-packages/flask_sqlalchemy/init.py:793: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future. Set it to True or False to suppress this warning.
warnings.warn(FSADeprecationWarning(
Traceback (most recent call last):
File "/Users/taoxing/Desktop/quant/trading_api_study/fmz/fmz_extend_api_demo/app.py", line 152, in <module>
db.create_all()
File "/Users/taoxing/opt/anaconda3/envs/ai4f/lib/python3.8/site-packages/flask_sqlalchemy/init.py", line 963, in create_all
self._execute_for_all_tables(app, bind, 'create_all')
File "/Users/taoxing/opt/anaconda3/envs/ai4f/lib/python3.8/site-packages/flask_sqlalchemy/init.py", line 955, in _execute_for_all_tables
op(bind=self.get_engine(app, bind), **extra)
File "/Users/taoxing/opt/anaconda3/envs/ai4f/lib/python3.8/site-packages/flask_sqlalchemy/init.py", line 896, in get_engine
return connector.get_engine()
File "/Users/taoxing/opt/anaconda3/envs/ai4f/lib/python3.8/site-packages/flask_sqlalchemy/init.py", line 556, in get_engine
self._sa.apply_driver_hacks(self._app, info, options)
File "/Users/taoxing/opt/anaconda3/envs/ai4f/lib/python3.8/site-packages/flask_sqlalchemy/init.py", line 861, in apply_driver_hacks
info.database = os.path.join(app.root_path, info.database)
AttributeError: can't set attribute
错在什么地地方了,求大神指导!!!
这个一键部署租用的服务器是其它另外的计费。和机器人实盘费用无关,使用wexApp模拟盘只是说机器人运行免费(数字货币机器人添加了任意一个非WexApp模拟盘交易所对象都会计费)。
一件部署托管者,是部署在阿里云服务器上,是付费的,会从你的账号余额中计费。 机器人运行,只操作wexApp模拟盘,机器人费用是不计费的,和一件部署托管者服务器费用无关。
您好,我想使用火币现货husd/usdt交易对, 我试了exchange.IO("currency", "HUSD_USDT"),exchange.IO("currency", "HUSD/USDT"),exchange.IO("currency", "HUSDUSDT"),不是运行退出就是品种订阅失败,请问正确的写法是什么?谢谢
from fmz import *
task = VCtx('''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}]
''')
# 创建回测环境
这样初始化一下,就好比在线回测的时候配置上了 交易所 、交易对 等信息。
这段代码我在.py文件运行时,需要导入ccxt,否则exchange无法识别。
在 Python Consle编辑,则可以正常运行。
A5:=MA(C,5);
A10:=MA(C,10);夹角:IF(CROSS(A5,A10),ATAN((A5/REF(A5,1)-1)*100)-ATAN((A10/REF(A10,1)-1)*100),0)*180/3.1416;
找到了这个公式,就是不知道REF如何实现
请问,在策略编辑器里面import statsmodels 无效,请问在那里可以导入第三方库?我在pycharm里可以导入,但是在编辑器里如何导入?
/*backtest
start: 2019-09-21 00:00:00
end: 2019-10-20 00:00:00
period: 1h
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
mode: 1
*/
通过配置信息中的,mode 设置,可以在回测页面上设置,然后在策略编辑页面上直接保存回测设置获取到配置信息字符串。
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()
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 了。您 使用回测引擎 时 有配置 回测账户 数据么?
回测账户数据,是下面几行吗?
有喔,在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
会有 通信,回测时是有数据请求的,不过运行是在本地跑的回测系统。
'''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 策略回测页面生成。
- 1











