1 几乎所有例子的仓位都是self.fixed_size=1
进阶课程里看过陈晓优老师讲的很多策略例子,都是讲如何买和如何卖,如何止盈和止损的,又是仿真、优化、实盘的,看到人是心潮澎湃!
于是看是着手仿照例子编写自己的策略,策略经过计算买卖信号后,总是要下单的,那我下多大仓位呢? 回过头这时候参考例子才发现,几乎所有的仓位都是self.fixed_size=1,就没有讲如何动态决定仓位的例子!
于是VNPY的QQ群里问前辈、先知,无人回答,再在论坛里问老师,终于回答了:”不建议动态仓位,这么重要的事情必须交给手工完成!“,这个答复让我有点懵——做量化交易你让为手动决定仓位???
2 是不建议动态仓位,还是无法动态仓位?
动态仓位需要什么条件:
- 开仓价格(Price)
- 可用资金(Money)
- 合约乘数(Size)
- 保证金(率)(Margin)
- 手续费(率)(FeeRate)
- 开仓的量 (N)
- 开仓资金(KM)
假设是按手续费率(而不是按手收费),那么开仓资金为:
KM = Price*N*Size*Margin (1+ FeeRate)
那么必须符合添加KM < Money,进而推出
N < Money/(Price*Size*Margin (1+ FeeRate))。
当然你不可能满仓干,也许还要一个最大开仓资金比例R,例如:
N = int(Money*R/(Price*Size*Margin (1+ FeeRate)))。
当R=40%表示用你账户里40%的资金,可以动态开仓的手数。这样不就可以动态开仓了吗?
当然实际开仓时的仓位计算可能比这复杂多了,比如你可以考虑交易合约的波动水平,需要考虑投资者愿意承担的风险水平等等,但不管怎么变化,策略动态开仓都必须要有如下这几个参数:
- 开仓价格(Price)
- 合约乘数(Size)
- 可用资金(Money)
- 保证金(率)(Margin)
- 手续费(率)(FeeRate)
3 用户策略怎么可以与”钱“无关?
经过艰苦和漫长的代码研读和梳理,发现CTA策略交易中只有pos、trading和inited这些策略成员,没有与资金相关的东西。我们来看看这几个动态下单必须具备的参数是否提供了:
- 开仓价格(Price):策略从合约的行情数据中提取
- 合约乘数(Size):main_engine中可以使用vt_symbol作为参数提取,函数是main_engine.get_contract()
- 可用资金(Money):目前有,可以通过 main_engine.get_account()函数提供 但是是当你运行多个策略的时候,这些策略是共用同一个账户的,无法直接使用。
- 保证金(率)(Margin):目前有,但是这是各个交易所公布的统一的保证金(率),不是你开户的期货各种给你的保证金(率),如rb2010.SHFE的保证金是率8%,可是也许你的开户的期货公司给你的保证金率为却为12%或者15%,怎么用?
- 手续费(率)(FeeRate):目前没有,而且这个费率回是因人而异的,这样是看你怎么和你的期货经纪人怎么谈判的,所以也没有办法用!
结论:
目前VNPY的CTA策略因为缺少上述几个关键参数,无法实现动态仓位交易。是不能也,而非不可以!
4 为CTA账户引入策略账户!
作为交易赚钱的CTA策略,怎么可以不与这些资金相关的参数打交道?因人而异的保证金和手续费不应该成为不提供这些参数的理由!
当多个策略在同时运行的时候,你的实际账户权益的消长,到底是哪个策略赚的,哪个策略赔的都无法说清楚,运行3天后就已经是一本糊涂账了,这怎么可以!
虽然有上面的困难,但是办法总比困难多!可以参考文华财经8.3或者库安9.0的办法(熟悉文华财经客户端的人应该都知道),它们的方法是用模组账户的方法来为每个用户模组创建一个虚拟的模组账户,很好地解决用户算法对资金、保证金和手续费等参数的设定!
策略账户的功能:
- 分配交易的初始资金,还可以做出金入金等虚拟操作,目的就是控制策略的交易规模。
- 设置各个合约实际使用的保证金(率)
- 设置各个合约可以使用的手续费(率),包括开仓、平仓和平今仓手续费(率)
- 可以记录策略产出的委托单
- 可以记录策略初始的成交单
- 可以为策略提供合约的当前可用资金、保证金(率)和手续费(率)
- 算策略的历史交易盈亏和当前交易的浮动盈亏
- 提供当前策略账户的权益和可用资金
- 提供策略自创建以来的所有历史委托单和成交单查询,解决目前CTA策略之知道最新活动委托单,当日成交单和未平仓的仓位,而不知道历史交易的情况的问题。
如何实现策略账户 ?
策略账户的已经基本上实现了,目前只在测试中,且看我一步一步慢慢为大家分享......
5. 最新进展
有兴趣的可以先看看 策略账户界面展示。