vn.py官网
开源量化社区
Member
avatar
加入于:
帖子: 298
声望: 73

1. 不同的价差交易策略交易相同的价差会发生什么?

1.1 一般的理解:价差和单边合约一样是一个交易标的

CTA策略的交易标的是一个具体的单边合约。假如我们运行两个CTA策略A和B实例,它们交易的合约都是C。同时运行A和B,那么我们可以发现A和B可以独立地统计各自的持仓,也就是说它们的pos可能是不一样的,不会相互干扰。
而价差交易策略的交易标的是价差。假如我们运行两个价差交易策略SA和SB实例,它们交易的价差都是S1。同时运行SA和SB,SA和SB也应该可以独立地统计各自的持仓,也就是说它们的spread_pos也应该是不一样的,不应该相互干扰。
然而,我们可以发现SA对S1开仓成功后,SB并没有开仓过,可是我们发现SB的spread_pos已经变成和SA的spread_pos相同的数量!
有点迷糊,细想一下,是啊,谁让你交易了相同的价差标的呢?

1.2 不同价差交易策略交易不同名称价差(但是价差的各腿是相同的)

不行就改,咱们按照价差S1的设置再创建一个价差S2,但是给它取一个不同的名称,区别一下!
接下来吧价差交易策略SB的标的该出S2,再次运行价差交易策略SB。
奇怪的现象发生了:SB并没有开仓过,可是SB的spread_pos仍然变成和SA的spread_pos相同的数量!

2. 问题出在哪里?

查看一下委托单:

description

其中"来源"一栏中的内容为 “SpreadTrading_价差名称”,就是这里过于简单,导致委托单只关联了价差,而没有关联价差交易策略名称,
所以在价差交易的SpreadTradeEngine引擎无法按照价差策略来推送类似委托单order,成交单trade和价差持仓信息等。

价差交易策略一旦发出委托,调用了SpreadStrategyTemplate的start_long_algo()或者start_short_algo(),而这两个函数最终调用了SpreadStrategyEngine的start_algo()

    def start_algo(
        self,
        direction: Direction,
        price: float,
        volume: float,
        payup: int,
        interval: int,
        lock: bool,
        offset: Offset
    ) -> str:
        """"""
        if not self.trading:
            return ""

        algoid: str = self.strategy_engine.start_algo(
            self,
            self.spread_name,          # 这里只有价差名称,没有传递策略名称
            direction,
            offset,
            price,
            volume,
            payup,
            interval,
            lock
        )

        self.algoids.add(algoid)

        return algoid
  1. 从此不知道委托单到底是哪个价差交易策略发出来的了!
  2. 成交单虽然可以委托单号查询到是哪个委托单,但是1的原因,所以找不到是哪个价差交易策略的成交单了
  3. 于是成交单只能被被推送到价差

4. 应该怎么解决这个问题?

这里只讨论原则性问题:

  1. 价差交易策略发出问题时传递价差交易策略名称,而不是价差名称;
  2. 将改变价差价差交易策略名称写入OrderData的reference字段,建立与价差策略实例的关联;
  3. SpreadStrategyEngine在收到order,trade时,安照价差策略实例进行order,trade保存、统计和相关持仓计算,包括spread_pos的计算

当然,这样的改动是大了些,可是已经存在目前的问题,修改是必须的!

Administrator
avatar
加入于:
帖子: 5108
声望: 296

如果确实希望在多个价差里都有同一条腿的合约,我们推荐的修改方式是将价差的持仓计算方式,从基于账户实际持仓匹配计算,改为和CTA策略类似的逻辑持仓计算方式,此时每个价差上都可以基于自己的价差算法执行结果,来维护持仓。

价差策略和CTA策略,在交易合约上的一个区别是:

  • CTA策略中,可以有多个策略交易同一个合约,所以逻辑仓位的缓存,做在策略层面
  • 价差策略中,每个价差组合上一定最多只有一个价差策略,所以逻辑仓位的缓存做在价差层面
© 2015-2019 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号-3

沪公网安备 31011502017034号