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

我将一个电脑上的vnpy对应的文件夹移植到了另一个电脑上

description

可是另一个电脑上的桌面是没有图标的,我该怎么做,才能在另一个电脑上运行这份vnpy呢? 点击pythonw.exe也没有任何反应

之前一直使用的是TTS环境,因为CTP又开了,所以转过来,但是一直报错,是非交易时间段自动就会断开连接吗?

description

我有一个策略,这个策略中有一个关键变量,类型是字典,会随着策略的运行而不断改变。

现在我有一个需求,那就是,当我停止这个策略时,这个字典的值能够保存到对应策略的json文件中。并且,当我下一次启动该程序时,能够自动读取这个字典的值并且参与到后续的计算中。那么,很显然,这个变量 应该是一个variable

但是根据使用文档的说明,variables只能接受str、int、float和bool四种数据类型传入, 我无法把这个字典设置为variables, 如果把这个参数的定义放到策略模板中的init下面,相当于每次启动程序时,都将初始化这个字典为一个空字典,而这不是我想要的,我想要初始成上一次结束时的那个状态。

这应该怎么操作呢?

例如小时数据,9:00的Bar 其实是9:00 - 10:00, 可是怎么看都觉得这个bar的datetime设置成10:00更合理吧?

对CTP系统而言,如果做一个两个品种的策略, 如al2209 和 MA209
那么,对于时间 14:27:00 这秒来说,这两个合约都会发来两个tick,由于郑商所切片的随机性,有可能MA209在这一秒也可能会发来1个或3个tick。 那么我想问的是,这一秒中,两个品种最后的tick,vnpy接收到的时间最多会相差多少秒呢?

这是update_tick的源代码
description

这段代码里最让我困惑的是,只要有一个品种的 tick的 tick.datetime.minute != self.last_dt_minute,就会触发self.on_bars()
可是问题是投资组合中不是只有一个品种啊!!!
如果有多个品种,而vnpy接收到这些tick的时间有毫秒的差别(郑商所的毫秒时间本来就和大商所、上期所不一样)
那么,vnpy会在检测到第一个品种的tick 符合条件时,就直接调用self.on_bars()!!!!

如果此时on_bars计算的时间长一些,例如碰上固定的交易时间了,需要计算策略了,需要调用update_bar_hour_window了,需要send_order了,那么此时on_bars还没计算完。但此时过了200ms,另外一个品种的tick发过来了,它将又要调用self.on_bars() !!!! (因为上个品种的on_bars还没调用完, self.last_dt是在on_bars调用完后面才修改的)
这岂不是在很短的时间内就要对策略进行两次计算吗??

为了实现自己的需求,仿照着vnpy的代码,写了一个类似于PortfolioStrategy的模块

问题是,我该修改哪部分的代码,才能让这个模块,出现在这个启动界面中呢?
description

另外,我观察,几乎所有的模块,除了代码本身,还有一个后缀为.dist-info的文件夹, 里面保存的都是一些我看不懂的内容,我想问下,自己写的模块也需要添加这些内容吗?

这是vnpy 中 converter关于锁仓的逻辑
description

可是,令我困惑的是,平空如果用锁仓做,不就是开多吗? 同样的,平多的锁仓方式,应该就是开空。但是代码里,似乎只修改了request的 offset, 将其改为了OPEN, 却没有修改request的Direction, 这是为什么?

连接的是TTS接口

description

可以看到,在1点31分的时候,合约信息查询成功。 但是当我早上9点33分看vnpy时,此时已经没有了行情数据,因此我试图重新登录TTS, 但是提示我交易服务器登录失败,因为已经重复登录了。

description

可以看到,行情里面什么也没有
但是,在查询合约里面,却可以查询得到合约。

description

真是令人感到困惑。另外,原定于在今早上开盘要交易的策略,也毫无动静。

因为想在vnpy种过滤CTP产生的数据,研究了一下,发现CTP在推送数据的时候,是有推送每个品种交易状态的。

但我不懂CTP推送的具体状态是什么,想要研究CTP的API, 但却发现CTP的API所在的网站无法打开?

vnpy需要24小时开着吗?

一个策略,如果停止它、重新编辑变量、对它进行移仓操作、或者关闭vnpy,在这种种情况下, 那这个策略里头的BarGenerator里的数据,以及策略内部的局部变量(variables),还在吗?

当连接到TTS之后,点击查询合约

无论大写还是小写都查不到螺纹钢的合约信息
description

description

但是其他品种,例如玻璃,却可以查到
description

在TTS的QQ群询问了群主,群主回答TTS今天的行情没问题,可以正常获取,可是为什么vnpy连合约信息都查不到呢

比如,我先写了一个趋势策略,交易5个品种,其中 要做多螺纹钢7手
然后,我又写了一个反转策略,也交易这5个品种,虽然这个反转策略在完整计算手续费之后的赚钱效果很差,但是它总是产生和趋势策略相反的信号,例如:做空螺纹钢2手

那么,我希望这两个策略能合并起来,开多螺纹钢5手。
但是实际在模拟盘上,第一个策略会做多7手,第二个策略会平今2手。。。不仅没节省手续费,反而“超级加倍”了手续费。

portfolio支持多策略之间的“撮合”吗?

看了一下回测程序,我的订单全都是限价单下单的,经过了cross_limit_order这个函数进行订单的匹配来决定订单是否成交、以什么价格成交。

我想问一下,这种情况下,还需要考虑滑点的带来的亏损吗?

做策略的时候,想在Strategy内部获得,总资金、滑点、和pricetick的信息,这样方便更精确的控制下单函数

发现在github上的样例代码中,这些参数全部传给了一个BactestingEngine类, 观察了一下该类的add_strategy函数

description

发现该函数初始化了一个strategy类, 但是第一个参数是self,也就是BacktestingEngine类自己, 但是在strategyTemplate类模板的构造函数中,要求第一个参数的类型是StrategyEngine类。 这两个Engine没有继承关系,为什么可以用BacktestingEngine类作为参数去初始化一个Strategy呢?

情况是这样的:
当我使用了移仓助手进行了换月的操作,我的策略现在开始订阅新的合约了,那么我自然希望把老的合约数据乘上一个赋权系数继续转移到新策略中,我并不想像策略初始化时那样,先要传入历史数据那样麻烦。
我该如何完成这件事呢?

description

我有两个问题:

  1. 为什么要对ArrayManager进行两次赋值呢?
  2. 我在运行回测的过程中,观察到,有时am.inited属性,会在一段时间内变成False!, 这会导致一年的回测中,可能有一个月的时间,不会发出任何订单。更令人奇怪的是,这一个月不是发生在数据的开头部分,也不是发生在数据的结尾部分,而是在数据的中间。例如,回测时间段为2020年1月 - 2021年1月, 在2020年5月时,这一个月的am.inited都是False, 为什么会出现这种情况呢?

加入我有一个日级别的策略,我的持仓计划是:

description

我希望的策略操作是,收盘前20分钟计算出这些手数,并在收盘前20分钟,以市价单进行快速的买入并且执行。核心是:在收盘时完成这些操作,要让这些订单过夜。

但实际在回测中,由于我使用的是日级别的数据,我发现在portfolio_backtesting模块,我的实际持仓是:

description

在vnpy回测中,在计算出因子之后,不会在当天换仓,而是会将需要换仓的订单保存在一个self.active_limit_orders的变量中,并且在下一个bar到来之后,用corss_limit_order计算是否能成交,如果能成交,则形成trade。
也就是说,我希望的,上一天应该交易的trade——在回测中实际上是下一天交易的!由于交易的时间点不一样,有的订单会从能成交变成不能成交。不过有一点欣慰的地方在于,如果能成交的话,实际上产生的收益还是我想象中一样的。

我应该如何修改vnpy的回测方式,才能让它想我想象中那样回测呢?我是不是不该用日数据回测呢?谢谢各位了!

因为vnpy提供了 多合约组合策略的 批量化处理功能,可以一键启动多个多合约策略。
但是策略一多,就难免出现,A策略在做多螺纹钢,B策略在做空螺纹钢的情况。
为了节省手续费,我希望能够在内部完成一些“撮合”,避免重复的下单。我知道在vnpy内部 单策略模块中其实是有订单撮合的功能的,将方向相反的订单进行撮合;我想问的是,对于多个多合约策略的情况,是否也有这样的功能呢?

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

沪公网安备 31011502017034号

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