logo_qcode_ad.jpg

前言

WonderTrader作为一个量化开发交易平台,除了C++底层带来的极致的速度体验以外,最核心也最重要的大杀器就是组合盘管理
WonderTrader的组合盘,指的是一系列策略配置而成的组合盘。一个组合盘里的策略,可以是不同策略实例,也可以是同一个策略不同品种的实例。组合盘中策略如何配置,这是投资经理要解决的问题。当投资经理确定好组合盘里的策略配比单位资金规模以后,WonderTrader——堪称组合盘管理的神器就开始发挥它的作用了。
本文将重点介绍WonderTrader的组合盘管理功能!有了WonderTrader相助,一个人管理十个亿也轻松搞定

量化交易原来这么麻烦!

张三的烦恼

张三是X私募基金的研发人员,每天的工作内容就是:看文献、分析数据、研究模型,最后转换成可以盈利的交易策略。平时张三直接用matlab写出策略逻辑,回测分析数据,无往不利。但是最近公司要所有的研发人员把策略转移到P量化平台上,他在编写策略的时候遇到了一些问题:

  • 股指期货平今佣金高,而沪金沪银平今佣金低,策略里如何控制开仓、平仓、平今?难道要在策略里按照品种写逻辑!?
  • 实时调用查询持仓接口,还要等待异步返回结果,那我逻辑怎么写?难道都要写到回调里?!
  • 如果本地保存持仓数据呢?那还需要根据订单回报和成交回报修改总持仓量和可平量,不然可平量怎么控制?这细节怎么这么繁琐!!!
  • 什么!跨期套还要考虑远期合约不活跃的时候,超时撤单的问题!?那我直接挂涨跌停总可以了吧!(领导:小张,你这边的单子怎么都是涨跌停价挂出去的?这样滑点怎么可控啊!!
  • 天呐!配对交易策略,K线闭合的时候,还要考虑两个品种是否都闭合了,才能触发计算逻辑!如果我有十个品种在一个策略里,那代码还不得乱成一锅粥啊。
  • ……

张三心里默默的想到:难道就不能让我们研发人员专注于策略逻辑吗?能不能把这些策略逻辑无关的都丢给后台啊?

李四的困扰

李四是X私募基金的投资经理,是张三的直接领导。李四的工作,就是将团队内的研发人员研发的策略,通过一套模型,合理的配置成一个组合盘。李四是一个非常自信的人,他研发的组合配置模型,可以有效地提高收益率30%,最大回撤也减少了20%。但是随着产品上线时间越长,在实际运营中,根据交易员的反馈,李四也有了不少的困扰:
对于组合中的多个策略

  • 组合盘里有10多个策略,如果每个策略独立跑的话,就要建立10多个交易通道。但是交易员反馈说CTP交易通道,只允许5个实例同时在线
  • 如果把策略放到一起来跑,交易回报不好调度。这样的话,还得找IT写一个中间件,专门将交易回报调度给各个策略。
  • ……

如果有不同策略交易同一个品种

  • 如果接口直接暴露给策略,还有可能造成每个策略检测到的仓位都是不正确的,从而持续发出交易指令
  • 即使解决了仓位分配问题,还有可能出现交叉开平的问题,佣金浪费一大堆
  • 上次期货公司打电话来问,好像有一笔自成交?幸好手数不多,还能解释过去。
  • 整合成净头寸发出去?上次搞了一次,结果张三跟我纠结了好久,说他的策略绩效没算对
  • ……

李四背靠着椅子,闭着眼琢磨着:难道就没有更好的解决方案吗?

王五的郁闷

王五是X私募基金的交易员,平时的工作就是保障各个产品的程序运行,如果风控触发,还有一些手动强平的操作。去年到现在,公司产品规模扩大了,管理的账户有20多个了。王五原来8点半上班,按时到公司就能在9点开盘前搞定所有的检查工作。但是随着管理的账户越来越多,要检查的地方也越来越多,王五为了9点前完成工作,都提前到8点10分到公司了。他实在是感觉到越来越郁闷:

  • 看门狗配了20个多进程啊!上次马总的账户上的盘子调整组合,结果不小心,改到了穆总账户上的盘子……一个月奖金都没了!
  • 今天周三了,明天IF又要换月了!头大,这次一定要弄一个列表,改一个盘子就打钩一个。还好上个月换月的时候,第二天早上我又过了一遍,不然又要出大麻烦。
  • 上午李四总新发的组合盘,又要上3个账号!3个账号手数怎么配的来着?
  • 什么!P组合风控触发了?赶紧,我记得P组合有8个账号在跑!!!
  • ……

王五嘟囔着:一个组合的交易和风控不能统一处理吗?弄错了又要扣我的工资!上次谈的那家公司叫什么来着?据说他们有一个叫做WonderTrader的新平台,特别好用!要不我还是跳了吧,这地真不是人待的。

交给WonderTrader

WonderTrader的设计目标就是让专业的人做专业的事,所以WonderTrader从架构上就完全解耦了各个层次。每个层次的每个功能模块,都可以做到极简化。不论你想要直接使用WonderTrader现成的功能模块,还是要开发自己的功能模块,你都能够体会到简约而不简单的设计理念。
如果你是张三,那么你需要WonderTrader!如果你是李四,那么你也需要WonderTrader!如果你是王五,那么你就更需要WonderTrader

策略的解放

  • 不要on_order,不要on_trade,只要on_calculate
    策略的基类定义非常简单,只保留了必要的接口。策略只需要关注这些接口即可,其他的都由WonderTrader后台解决!让你的策略逻辑简洁清晰,更好维护。

    from wtpy import Context
    
    class BaseStrategy:
        '''
        策略基础类,所有的策略都从该类派生\n
        包含了策略的基本开发框架
        '''
        def __init__(self, name):
            self.__name__ = name
    
        def name(self):
            return self.__name__
    
        def on_init(self, context:Context):
            '''
            策略初始化,启动的时候调用\n
            用于加载自定义数据\n
            @context    策略运行上下文
            '''
            return
    
        def on_calculate(self, context:Context):
            '''
            K线闭合时调用,一般作为策略的核心计算模块\n
            @context    策略运行上下文
            '''
            return
    
        def on_tick(self, context:Context, code:str, newTick:dict):
            '''
            逐笔数据进来时调用\n
            生产环境中,每笔行情进来就直接调用\n
            回测环境中,是模拟的逐笔数据\n
            @context    策略运行上下文\n
            @code       合约代码
            @newTick    最新逐笔
            '''
            return
    
        def on_bar(self, context:Context, code:str, period:str, newBar:dict):
            '''
            K线闭合时回调
            @context    策略上下文\n
            @code       合约代码
            @period     K线周期
            @newBar     最新闭合的K线
            '''
            return
  • 设置主K线,再多周期再多品种都统一调度!
    WonderTrader同一个策略里使用多周期多品种K线的时候,可以选择频率最高的一个K线周期作为主K线,策略的重算就会按照该周期进行调度。再也不用考虑哪条K线先闭合,哪条K线后闭合,闭合事件的先后顺序是怎么控制的等问题。

    df_bars = context.stra_get_bars("CFFEX.IF.HOT", "m5", 50, isMain = True)
  • 策略理论仓位互相独立,绝对不会反复轧平!

    • 每个策略有独立的理论持仓数据,互不干扰
    • 每日收盘会有独立的资金结算
    • 成交明细、平仓明细、信号明细都存在专门的数据文件里
  • 一个set_position接口,告别繁琐的多空开平!
    对于绝大多数策略研发人员来说,多空开平的细节是非常模糊的。WonderTrader的策略API将简化做到了极致,策略中只需要根据逻辑直接设置目标仓位就可以了。(WonderTrader的策略API还是保留了多空进出的接口,便于使用者迁移理解)

    #读取当前仓位
    curPos = context.stra_get_position(code)
    
    if curPos == 0:
        if highpx >= upper_bound:
            context.stra_set_position(code, 1, 'enterlong')
            context.stra_log_text("向上突破%.2f>=%.2f,多仓进场" % (highpx, upper_bound))
            return
    
        if lowpx <= lower_bound:
            context.stra_set_position(code, -1, 'entershort')
            context.stra_log_text("向下突破%.2f<=%.2f,空仓进场" % (lowpx, lower_bound))
            return
  • 目标仓位后台执行,初学者也能轻松驾驭策略开发!
    因为策略逻辑和执行完全剥离,所以策略里面再也没有交易相关内容的接口,如挂单、撤单、错单处理等逻辑。让策略研发人员把更多的精力放在模型研究和策略逻辑上,这些交易接口的细节就丢给WonderTrader吧!

组合盘的进化

  • 一级进化——净头寸管理
    组合盘按照1分钟一次的频率,定时调度所有策略重算(按照主K线周期触发重算)。策略重算以后,组合盘会读取策略所有的目标仓位(多策略多品种),根据多空自动轧平以后,得到一个净头寸。这个净头寸就是组合盘的基本头寸
    净头寸的好处是显而易见的:

    • 一个品种只有单边持仓,杜绝自成交
    • 头寸轧平,净头寸可以减少保证金占用(30多25空,按照大边保证金制度,也要占用30手的保证金,而净头寸5多只占用5手保证金)
    • 内部轧平,省掉不必要的开平,节省佣金(先开30多,再平25多,也能得到5手净头寸,但是佣金花掉55手,而直接净头寸5多执行,只花费5手净头寸)
  • 二级进化——组合盘风控
    组合盘作为基本盘,基金经理设定好策略配比和基本资金规模以后,风控参数能基本确定了。组合盘统一风控的优点在于:

    • 基本盘资金规模确定以后,不论执行的账户怎么配置,都不会影响基本盘的风控参数
    • 对于一个组合盘挂多个执行器的1+N模式下,组合盘的发生风险时可以做到一刀切,而不用再针对每个账户单独处理
    • 1+N模式下风控更及时,相比多进程模式下需要逐个确认,响应速度更快,降低损失
    • 组合盘风控是切断组合盘和执行器之间的目标仓位传递,这样的模式不会影响策略在不利行情下的继续执行,从而能够保留策略在不利行情下的表现数据

执行器——管理规模扩大的必杀技

执行器是目标仓位执行的核心模块。一个组合盘可以配置多个执行器,也就是上文提到的1+N模式。而每个执行器实例又会和交易通道一对一绑定起来,从而实现目标仓位的执行。WonderTrader的执行器,主要特点如下:

  • 1+N模式,复制粘贴就能扩大资金管理规模
    WonderTrader设置项里,执行器的设置是一个数组,如果一个组合盘需要在多个交易账号上运行,只需要复制粘贴执行器的配置项,做适当修改即可。

    "executers":[
        {
            "active":true,
            "id":"exe0",    //执行器ID
            "scale": 1,     //手数放大倍数
            "policy":       //执行逻辑调用策略
            {
                "default":{ //默认策略
                    "name":"WtExeFact.WtSimpExeUnit",   //执行单元工厂WtExeFact中的WtSimpleExtUnit执行单元
                    "offset": 0,    //执行单元参数
                    "expire": 40,
                    "opposite": true
                }
            },
            "trader":"trader0"  //绑定的交易通道ID
        },
        {
            "active":true,
            "id":"exe1",
            "scale": 2,
            "policy":
            {
                "default":{
                    "name":"WtExeFact.WtSimpExeUnit",
                    "offset": 0,
                    "expire": 40,
                    "opposite": true
                }
            },
            "trader":"trader1"
        },
        {
            "active":true,
            "id":"exe2",
            "scale": 3,
            "policy":
            {
                "default":{
                    "name":"WtExeFact.WtSimpExeUnit",
                    "offset": 0,
                    "expire": 40,
                    "opposite": true
                }
            },
            "trader":"trader2"
        },
        ......
    ]
  • 分别配置基本盘手数放大倍数,再多资金也能轻松应对
    上面展示的配置项中,一共展示了3个执行器,exe0的手数放大比例是1倍exe1手数放大比例是2倍exe2手数放大比例是3倍。假如基本盘资金是1000wtrader0就有1000w左右的资金,trader1则有2000w左右的资金,同理trader3就有3000w左右的资金。
  • 一个执行器绑定一个交易通道,分别执行互不干扰
    还是以上面展示的配置项为例,一个执行器绑定了一个交易通道。因为每个交易通道的目标手数不一样,所以各个执行器是独立执行的,搭配算法交易以后,每次下单的手数和下单的价格可能都会有所区别
  • 执行单元:让算法交易的实现简单到无以复加
    执行单元的核心就是算法交易逻辑!执行单元的简单在于:

    • 不用考虑合约,只需要获取数据并执行逻辑运算即可
    • 不用考虑开平,只需要根据目标仓位和当前仓位发出在指定价位买入或者卖出多少数量的指令即可。最终买和卖的指令,都由交易通道根据自己的实际持仓以及综合开平策略来决定是开还是平,是平今还是平昨等等。
  • 各交易通道互相独立的流量风控:跟期货公司的风控电话说再见
    交易通道的流量,主要受到交易所和券商的柜台系统限制,大致分为两个方面:

    短时间内操作的次数限制
    一个交易日内操作次数的限制
    单笔委托最大手数的限制

    短时间内的操作次数,是最容易出现的情况。绝大多数原因是因为数据出错导致的,一旦打到阈值,就会触发券商的风控预警。基于交易通道的流量风控就能很好的避免这种情况。
    单笔委托如果超过最大手数限制,会直接无法下单。而对于大资金的账号,手数大的时候交易通道会自动拆分成多笔小手数的委托。

结束语

通过上面的介绍,相信大家已经明白,一个人利用WonderTrader管理十亿资金,并不是一个空喊的口号(WonderTrader:那当然!我是有实力的!)。当然WonderTrader只是一个工具平台,要想真正能够管理十个亿的资金,组合盘的市场容量首先要足够大才行。
WonderTrader始终致力于解放量化界的人力的伟大目标,WonderTrader的口号就是——让专业的人做专业的事。让愁眉苦脸地写代码的研究员少一些,让焦头烂额上服务器的交易员少一些,麻烦的事情都丢给WonderTrader吧!
最后再来一波广告
WonderTradergithub地址:https://github.com/wondertrad...
WonderTrader官网地址:https://wondertrader.github.io
logo_qcode_ad.jpg


WonderTrader
31 声望26 粉丝