大概使用如下逻辑的判断?
if trade.offset == Offset.OPEN:
if trade.direction == Direction.LONG:
好的。 下面是我不加锁时的错误信息。
sqlite3 的数据库是没有问题的。加锁之后,就一直好用。
multiprocessing.pool.RemoteTraceback:
"""
Traceback (most recent call last):
File "/home/zlu/anaconda3/envs/py37/lib/python3.7/site-packages/peewee.py", line 3005, in execute_sql
cursor.execute(sql, params or ())
sqlite3.DatabaseError: database disk image is malformed
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/zlu/anaconda3/envs/py37/lib/python3.7/multiprocessing/pool.py", line 121, in worker
result = (True, func(args, **kwds))
File "/home/zlu/anaconda3/envs/py37/lib/python3.7/site-packages/vnpy/app/cta_strategy/backtesting.py", line 1204, in optimize
engine.load_data()
File "/home/zlu/anaconda3/envs/py37/lib/python3.7/site-packages/vnpy/app/cta_strategy/backtesting.py", line 243, in load_data
end
File "/home/zlu/anaconda3/envs/py37/lib/python3.7/site-packages/vnpy/app/cta_strategy/backtesting.py", line 1252, in load_bar_data
symbol, exchange, interval, start, end
File "/home/zlu/anaconda3/envs/py37/lib/python3.7/site-packages/vnpy/trader/database/database_sql.py", line 352, in load_bar_data
data = [db_bar.to_bar() for db_bar in s]
File "/home/zlu/anaconda3/envs/py37/lib/python3.7/site-packages/peewee.py", line 6655, in iter
self.execute()
File "/home/zlu/anaconda3/envs/py37/lib/python3.7/site-packages/peewee.py", line 1812, in inner
return method(self, database, args, *kwargs)
File "/home/zlu/anaconda3/envs/py37/lib/python3.7/site-packages/peewee.py", line 1883, in execute
return self._execute(database)
File "/home/zlu/anaconda3/envs/py37/lib/python3.7/site-packages/peewee.py", line 2054, in _execute
cursor = database.execute(self)
File "/home/zlu/anaconda3/envs/py37/lib/python3.7/site-packages/peewee.py", line 3018, in execute
return self.execute_sql(sql, params, commit=commit)
File "/home/zlu/anaconda3/envs/py37/lib/python3.7/site-packages/peewee.py", line 3012, in execute_sql
self.commit()
File "/home/zlu/anaconda3/envs/py37/lib/python3.7/site-packages/peewee.py", line 2783, in exit
reraise(new_type, new_type(exc_args), traceback)
File "/home/zlu/anaconda3/envs/py37/lib/python3.7/site-packages/peewee.py", line 183, in reraise
raise value.with_traceback(tb)
File "/home/zlu/anaconda3/envs/py37/lib/python3.7/site-packages/peewee.py", line 3005, in execute_sql
cursor.execute(sql, params or ())
peewee.DatabaseError: database disk image is malformed
"""
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/home/zlu/Work/vnpy/test/vnpy/tui_apps/cta_backtesting.py", line 59, in <module>
df = engine.run_optimization(setting)
File "/home/zlu/anaconda3/envs/py37/lib/python3.7/site-packages/vnpy/app/cta_strategy/backtesting.py", line 572, in run_optimization
result_values = [result.get() for result in results]
File "/home/zlu/anaconda3/envs/py37/lib/python3.7/site-packages/vnpy/app/cta_strategy/backtesting.py", line 572, in <listcomp>
result_values = [result.get() for result in results]
File "/home/zlu/anaconda3/envs/py37/lib/python3.7/multiprocessing/pool.py", line 657, in get
raise self._value
peewee.DatabaseError: database disk image is malformed
明白了。
有没有可能在同一个CTA模板中交易两个品种? 这样才有可能把 (1) 的内容自动化?
我的电脑是 6 cores, 对于前6个任务,是没有多进程加速的 (这个是全局锁导致的)
我最终的办法是给 load_data 加了个全局锁。
这样问题解决了,但是还是不知道原因。
我的电脑是 6 cores, 对于前6个任务,是没有多进程加速的。
之前请教过,老师指导是手动,平掉次主力,再开同样多的主力合约。
但是想想好像还是有问题。
策略的 json 文件,应该是按照策略名,而和 vt_symbol 无关,对么? (否则 1 就无法修改)
还有一种办法,就是不换仓
3a. 要是等到期了还没平掉怎么办?
3b. 是否同时再启动一个新主力合约的策略?
请老师再次指教一下。
在锁仓的模式中,如果进行的是日内交易,那么仓位会不断增加。
这种情况下,在实盘交易中, 可能就会有资金问题。
在回测中,就不会有资金的问题。
今天发现一个很奇怪的问题。
从 vntrader 中的CTA回测模块中,进行多进程优化没有问题。
但是自己从 examples 中的 jupyter notebook中进行 backtesting, 源代码是遗传算法,简单更改为 多进行优化的时候,就出现错误。 是发生再多进程 load_data 的时候,访问 sqlite3 的 fetch_one() 出错。
1。同样的代码从 UI 中运行就没有问题, 也是同时读取 sqlite3
2。自己写成单独的脚本运行,多进程读取的时候很快就出问题。
请教一下,大家有没有遇到过?
我看了一下实现,发现这个初始资金量是没有使用的。在DataFrame 里也没有每天的剩余资金。
所以最后的资金曲线都是从 100w 开始计算的。这样的话,总收益百分比和年收益百分比,都是组合投入100万时的值。
参考 examples/portfolio.py
我理解就是把几个策略单独运行,生成 DataFrame, 合并之后,再计算统计值。
但是结果好像不太对。
比如: ST1: 100w 起始资金,总收益 1,167,038.23
ST2: 100W 起始资金,总收益 328,969.07
ST3: 100W 起始资金,总收益 1,225,679.59
组合测试如上三个,总收益 2,792,130.99
画出的资金曲线还是从 100w 开始的。这个是不是不对啊。上面的组合起始资金已经是 300w 了。
请老师指教一下?
联系了米筐客服,已经解决了。
如果上面的定义正确,感觉使用 IF888 做回测应该效果比较接近于实盘。
不知道是不是正确,还请老师指教一下。
自己回答: (网上查的)
IF88:主力连续合约,由IF股指期货不同时期主力合约接续而成,仅仅是合约量价数据的简单拼接,未做平滑处理
IF888:主力连续合约,对价格拼接进行了"平滑"处理,即以主力合约切换前一天(T-1日)新、旧两个主力合约收盘价做差,之后将 T-1 日及以前的主力连续合约的所有价格水平整体加上或减去该价差,以"整体抬升"或"整体下降"主力合约的价格水平,成交量、持仓量均不作调整,成交额统一设置为0
IF99:指数连续合约,由IF股指期货全部可交易合约以累计持仓量为权重加权平均得到的
请问有什么区别? 哪里能查到 88 / 888 之类的定义?
多谢!
没有注册 Rice Quant 账户,就直接在官网上付了 3000 块。
之后页面没有任何变化。
请问这个正常么? 是不是要联系米筐解决?
对于有夜盘的品种,如果不参与夜盘交易,那么会和会测的结果有很大的偏差。
请教一下老师。课程中演示的实盘步骤是要人工在 VNTrader 中按 “初始化”,“开始”,“停止”。
这个对于日盘是没有问题的,但是对于夜盘,人工在收盘后按 "停止" 是比较困难的。(比较晚了啊)
有没有自动的方法可以进行?
用的是 CTPTest, 下单都是正常的。
但是撤单每次都是如下的故障。 vnpy 2.0.8
请教一下是什么问题呢?
Traceback (most recent call last):
File "C:\vnstudio\lib\site-packages\vnpy\trader\ui\widget.py", line 865, in cancel_all
self.main_engine.cancel_order(req, order.gateway_name)
File "C:\vnstudio\lib\site-packages\vnpy\trader\engine.py", line 183, in cancel_order
gateway.cancel_order(req)
File "C:\vnstudio\lib\site-packages\vnpy\gateway\ctptest\ctptest_gateway.py", line 186, in cancel_order
self.td_api.cancel_order(req)
File "C:\vnstudio\lib\site-packages\vnpy\gateway\ctptest\ctptest_gateway.py", line 787, in cancel_order
self.reqOrderAction(ctp_req, self.reqid)
RuntimeError: Unable to cast Python instance to C++ type (compile in debug mode for details)
多谢老师指教。
老师,请教一下。
课程中都是使用 IF88 或是 IF888 作为回测。但是在实盘交易中,IF 的主力是会按月变化的。
对于我们这种隔夜持仓的 CTA 策略,如果遇到换月,应该怎么办?
如果有换月,那么回测 IF88 (IF888), 还有实际意义么?