VeighNa量化社区
你的开源社区量化交易平台
330815977's Avatar
Member
离线
78 帖子
声望: 0

嘿, 这个怎么弄呢,ubuntu linux下面没法用这个期权模块呢。 缺 少定价模型动态库文件。 。。

嘿, 这个怎么弄呢,ubuntu linux下面没法用这个期权模块呢。 缺 少定价模型动态库文件。 。。

这两天升级上vnpy-2.0.9, ubuntu linux。
参照 《聚宽数据(JDDataSDK)集成方案(试用期长达一年)http://www.vnpy.com/forum/topic/1472-ju-kuan-shu-ju-jddatasdk-ji-cheng-fang-an-shi-yong-qi-chang-da-yi-nian》也对接上了聚宽数据方案。
其间,遇上了一个小BUG, 我不确定Windows下面是否同样,估计应该也会有同样的问题,由于聚宽数据方案 接口jqdata.py基本上和 米筐数据方案rqdata.py 差不多,因此,我在聚宽数据方案遇到的这个问题 可能在米筐数据接口那个文件rqdata.py也同样会有(我猜):
jqdata.py rqdata.py 这两个文件,RqdataClient 类里面都有一个函数: query_history(self, req: HistoryRequest),这里面有关枚举Interval的两个转换:
是这样的:
rq_interval = INTERVAL_VT2RQ.get(interval)
adjustment = INTERVAL_ADJUSTMENT_MAP[interval]
这两个转换在文件开头有定义:
INTERVAL_VT2RQ = {
Interval.MINUTE: "1m",
Interval.HOUR: "60m",
Interval.DAILY: "1d",
}

INTERVAL_ADJUSTMENT_MAP = {
Interval.MINUTE: timedelta(minutes=1),
Interval.HOUR: timedelta(hours=1),
Interval.DAILY: timedelta() # no need to adjust for daily bar
}
这个在cta_strategy/engine.py(CTA引擎) query_bar_from_rq函数传过来的参数 是可以的,数据也可以正常下载,它传给 query_history(self, req: : HistoryRequest)的参数req.interval 确实是Interval枚举类型,然后经过上述的两个字典的转换是可以得到结果的。
但问题出在,假如是由cta_backtester,也不是图形界面上策略回测那个UI,如果是在那个UI上面下载历史数据按钮,这样的话,它传递到query_history(self, req: : HistoryRequest)的参数req.interval ,就不对了,因为它是从图形界面上的那个组合框(就是选择1m,1h,d,w......的那个组合框),它实际上传递过来的是组给框当前项目上的文字字符串"1m", ”1h","d","w"..., 它实际上是Interval.value ! 而由它来作为字典的键来查询,得到的是空值 ,所以,后面下载是下载不到数据的!
因此,app/cta_backtester, app/cta_strategy这两方面传过来的参数不一致,导致了这个BUG。。。

以下是我的修改方案:(因为我是先按照 cta_backtester传来的参数改的)
jqdata.py rqdata.py 这两个文件里面的这两个字典键改一下:

INTERVAL_VT2RQ = {
Interval.MINUTE.value: "1m",
Interval.HOUR.value: "60m",
Interval.DAILY.value: "1d",
}

INTERVAL_ADJUSTMENT_MAP = {
Interval.MINUTE.value: timedelta(minutes=1),
Interval.HOUR.value: timedelta(hours=1),
Interval.DAILY.value: timedelta() # no need to adjust for daily bar
}
增加一个:
INTERVAL_JQ2VT = {
"1m": Interval.MINUTE,
"60M":Interval.HOUR,
"1d":Interval.DAILY,
}
然后在 def query_history(self, req: HistoryRequest):函数里面修改这一句:
bar = BarData(
symbol=symbol,
exchange=exchange,
interval = INTERVAL_JQ2VT.get(interval) , # interval=interval, 这一句转换回来
datetime=row.name.to_pydatetime() - adjustment,
open_price=row["open"],
high_price=row["high"],
low_price=row["low"],
close_price=row["close"],
volume=row["volume"],
gateway_name="RQ"
)
这样 cta_backtester就可以正常下载了。
然后,再cta_strategy/engine.py 修改一句:
def query_bar_from_rq(
self, symbol: str, exchange: Exchange, interval: Interval, start: datetime, end: datetime
):
"""
Query bar data from RQData.
"""
req = HistoryRequest(
symbol=symbol,
exchange=exchange,
interval=interval.value, # interval=interval, 这里转换一下,传value进去,和cta_backtester那边一致。
start=start,
end=end
)
data = rqdata_client.query_history(req)
return data

这样两边都可以用了。

目前vnpy-2.0.x 用关系型数据库sql...时只有两张表,一个是bar数据,一个是tick,所有的合约,所有的时间框架下的数据,全部揉在一个表里面,两个表全部在一个数据库文件中,实际使用中,这个数据库文件相当大,至少GB级别的(包含回测时用的数据量)
这里的问题是:
数据库访问检索太费时间了,如果一边运行着vnpy, 同时一边浏览检索数据库,vnpy很大概率会抱怨数据库被其锁了,同样的问题当订阅很多的合约行情的时候。。。。
为什么不设计成按照各个合约,各个时间框架 分别不同的Tab表格中去? 或者直接用不同的db文件? 相比起把所有的数据全部揉到一个db文件中一个tab中,那个速度提升不是一个、几个数量级别的。。。

vnpy-2.0.9 ubuntu下面报错:cannot import name 'black_76_cython' from 'vnpy.app.option_master.pricing'

vnpy/app/option_master/pricing/black_76_cython.pyd 应该是windows下面的,linux下面的vnpy-2.0.9发行包里面没有提供, 也没有提供源码可以编译的,这个问题怎么破呢?

可不可以把vnpy-1.9.2下面的pricing编译的拿过来用?

噢,原来 这样啊。 那么,如果我自已从1.9.2中把TradeCopy模块移到2.0.x, 是否可行? 工程量有多大?

vnpy可不可以实现多账户自动跟单?

这个是事件驱动的,self.pos由CTA引擎负责维护,由交易接口API onTrade成交回报事件触发。
策略状态变量,可以由变量列表varList维护,由saveSyncData() 到数据库。2.0.6版的是sync_data(). 变量列表由self.put_event()更新到CTA UI界面显示出来便于监控

呵呵, 这个嘛,我来试着回答,可以参考CTP持仓查询,在cta engine 或者 cta template 中向事件引擎注册EVENT_TIME事件,调用on_timer函数。
不过事件引擎中的定时器是1秒钟的, 如果是其它时间颗粒度的,就要自已再另外再增加定时器来搞了,

vnpy 不会出现两个策略互相 卖了对方的持仓的情况,各策略是独立的。但是跑在同一个账户里面资金是共享的。 你可以几个CTA策略交易同一个合约品种,同时也可以手工做同一个品种,互相不会干扰。只是手工做单的话别误买/卖了CTA策略的持仓,那样就乱套了

建议2.0.6版后面增加商品期权方面的功能

还有一个地方,好像是,
就是策略布署的时候,名称好像不可能用中文,否则软件重启载入也会出错的,但是是cta_strategy_setting.json报错,不是cta_strategy_data.json

我也遇到过这种情况,后来我发现当合约代码不正确时,或者打入一个不存在的合约代码,回测或下载数据时都会陷入长时间等待中。,

我好像记得除了郑交所只支持 FAK, 其它交易所都支持FOK和FAK指令。 不知道现在是不是有变化了

奇葩何止于此哟。。。
不仅是合约代码规则不一致,
还有收盘最后一个额外的tick,郑交所不会推送,
还有夜盘时段的行情推送 ”ActionDay“, ”TradingDay" 这两字段所代表的意义,四个交易所也不明确,不一致,
你以为就这些了吗?你再下个单试试看看成交时间,MD接口和TD接口中这个字段也不一致哈哈哈哈哈。。。。。

能不能考虑 在vnpy/app/data_recorder/engine.py class RecorderEngine : close函数的最开头处,考虑增加K线收盘操作,保证郑交易最后一根K线能推入数据库中
def close(self):
for vt_symbol in self.bar_recordings:
bg = self.get_bar_generator(vt_symbol)
bg.generate()

self.active = False
    if self.thread.isAlive():
        self.thread.join()

vnpy-2.0.5 自定义策略回测,我看过FAQ
"14.如果要自定义策略,那么把策略python文件放在哪里?
A:可以放在文件夹C:\ProgramData\VNConda\Lib\site-packages\vnpy\app\cta_strategy\strategies;或者是放在用户的运行时目录下"
这里面说的一个是安装目录(需要管理员权限,每次很麻烦,特别是在策略还在编写调试过程中的时候)
一个是“用户的运行时目录下”,这个是example/vn_trader/run.py这个运行目录下吗? 放在这个目录下面则没有作用,抓不到这个目录下的策略
所以,我想问,有没有办法做:
1,先不污染vnpy的安装目录,在一个另外的数据目录里面来回测自定义策略?
2, 或者vnpy主界面上的策略回测可以选择目录路径动态加载自定义的策略文件?而不是每次只在重新启动的时候才会在安装目录里面一次性加载那些预置的策略?

© 2015-2022 微信 18391752892
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】