商品期货多因子 全市场对冲模型
本文由量化投资训练营撰写,首发于聚宽社区。无论是写公众号,还是身处从业环境,我们一直偏向资产配置和FICC(Fixed income Currencies & Commodities,译为固定收益证券、货币及商品期货)类策略研究,以此方式来对冲单纯股票市场的高beta,试图为投资者拓展眼光,增加投资稳定性。如果说取关一个公众号越来越容易,我希望这里提供的知识或许让你多想3秒再做打算。
截面因子投资模型在商品期货中十分有效,如图在海外商品期货多因子研究中,《Harvesting Commodity Risk Premia》(获取商品风险溢价)这篇文献影响力较大。文章梳理了影响商品期货溢价的因子,总结了学术界和业界提出的构建商品期货多空组合的11大类因子(绝大多数均有正收益,其中期限结构、价值和偏度因子正收益率最为显著),其中既包括广泛讨论的动量因子、期限结构因子、特质波动率等因子,同时还探讨了2010年以后兴起的持仓情况因子、流动性因子、通胀因子、汇率因子等影响期货定价的因子。
本次研究中,我们集中于这几个因子:截面动量、流动性、展期收益率、归一化VSTD、偏度、期货现货基差、会员持仓结构。
1、截面动量
在每个日期截面上,首先计算动量值,如果单独使用此因子,选择上涨最多的N个品种做多,下跌最多的N个品种做空。它的假设是:强者恒强,弱者恒弱。动量是相对出现于品种之间的,而不是以一个绝对数值,体现出方向性。截面动量模型的持仓是对冲形态的,每一期账户内总有N个品种多头,N个品种空头。
海通研报认为横截面动量因子在不同参数组下均能取得正收益,但平均收益低于时间序列动量因子。当回看期R为30-45,持有期H为5-10个交易日时,因子表现相对较好,年化收益率超过4%。
截面动量因子的表现具有很强的参数敏感性。这是因为由不同的计算周期所得到动量特征表现结果不一,不同的品种的动量特征也会表现不一,所以在构建截面动量因子组合之后,组合的整体表现就会很强地受参数选择的影响。综合考虑之后,东方证券衍生品研究院的观点是,截面动量因子的有效性只存在部分参数区域内,较为合适的R值范围为10天~30左右,而H的合理取值范围为5~25天左右。
2、流动性(也译为非流动性)
根据流动性illiquidity溢价理论,流动性越差的资产预期收益越高,Amivest 流动性比率和Amihud 非流动性比率是常用的刻画股票流动性的因子,这里我们使用后者作为期货因子,计算方法如下:
其中ri和Amonuti分别表示期货合约在第i个交易日的收益率和成交金额,ILLIQ越高表示该品种流动性越差。
非流动性因子ILLIQ构建流动性是衡量证券变现能力的指标,流动性强,说明证券能够在折价较小的情况下,顺利卖出;相反,流动性弱,则表明交易证券需要在成交价格上做出较大让步;因此,流动性差也是风险之一。 按照风险与收益相匹配的特征,理论上市场会赋予流动性差的证券一定的收益补偿。
优矿量化哥针对该指标,在全A指数上,使用2008~2016年数据做测试,发现该指标针对股票有非常强的区分能力,且Alpha稳定,仅在2015年牛市来临前短暂性失效,从侧面说明了该因子的主要作用区间是小市值区域股票。
3、展期收益率
展期收益率属于期限结构研究的变量之一,刚才已经描述过。展期收益策略是商品期货特有的策略类型。逻辑上,展期收益策略与传统的趋势类策略相关性较差,有较好的互补性,因为他们从根源上不同源。
对于资产管理,商品配置一般不投资于实物商品,业内流行的方式是通过商品期货,然后滚动移仓,达到配置商品的目的。理论上,投资商品期货的收益可以分解成:
Futuresreturn = Spotreturn Rollreturn Collateralreturn
即期货投资收益由3部分构成:对应现货的收益、展期收益和现金收益。
在商品期货市场,同一标的品种对应着不同交割日的期货合约,如螺纹钢每年有1月,5月,10月,这3个主力合约,还有很多次主力小合约。
商品期货的现货价格(这里常用近月合约代替现货价格)与不同交割月期货合约交易价格之间的价格差,即商品期货的期限结构。若现货价格大于期货价格,或近月合约的期货价格大于远月合约的期货价格,称为期货贴水backward,或现货升水;若现货价格小于期货价格,或近月合约的期货价格小于远月合约的期货价格,称为期货升水Contango,或现货贴水。聚宽社区里有关于期限结构的策略模型,可以详细看其解释,我们也是基本上按照此结构撰写本模型。
我们一般说升贴水,都是针对远期合约。
假设 Pt,n 是 t 时刻近月合约的价格,Pt,d 是 t 时刻远月合约的价格,Nt,n 是近月合约在 t 时刻距离交割日的天数,Nt,n 是远月合约在 t 时刻距离交割日的天数。
当 Rt 为正,即近月合约价格大于远月合约价格,当 Rt 为负,即近月合约价格小于远月合约价格。对同一横截面的所有品种来说,最大的 Rt,即对所有品种来说,该标的的近月合约对远月合约涨幅最大,最小的 Rt,即对所有品种来说,该标的的近月合约对远月合约跌幅最大。
按照渤海证券的交易逻辑:若不同合约的展期收益率排名可在一定程度上体现“多强空弱”中的“强”、“弱”概念,即可根据展期收益率排名构建交易策略,我们做多展期收益率最高的品种,做空展期收益率最低的品种,该因子有很强的左侧交易的味道。
由华泰期货研究所提供的上图的动量策略与期限结构策略各年份收益图可以发现,动量策略在 2011 年、2012 年及 2016 年表现较好,但期限结构策略在 2010 年、2013 年及 2017 年表现优秀,两者直观上看相关性较低。
4、归一化VSTD
成交量标准差(然后用成交量均值归一化,或者理解为成家量CV指标)是典型的交易行为因子,这类波动因子是指过去一段时间内股价或成交量等等其他指标的波动情况,也是一类非常重要同时效果十分显著的风格因子。通过改变所取的时间区间的长度,可以观察到不同时长下的股票波动效应强弱。
引入它的原因首先是看到光大金工在股票因子测试中该因子表现较好,这类因子作为负向的大类因子,其单调性表现较为出色。
我们在聚宽测试了中证800样本股在该因子下的分层能力,同样,可以清晰区分1~5组股票(蓝、黄、绿、红、紫),且因子值最高的一组表现最差,说明如果成交量变化过于迅猛,则这类股票应该做空。期货多因子研报上无此因子,这是我们随股票多因子的经验带入期货模型的因子。
5、偏度
偏度是关于实值随机变量的平均值的概率分布的不对称性的量度。除正态分布的偏度为0,以偏度值的大小正负,可以分为正偏或者负偏分布,对于单峰分布,负偏表示概率密度函数左侧的尾部比右侧更长或更胖。相反,正偏斜表示右侧的尾巴比左侧长或胖。下图是正偏与负偏。
Miffre et al.(2013)16使用过去 12 个月的日收益率数据计算各个期货品种的三阶矩,并从低到高排序,做多偏度最低的前 20%品种,做空偏度最高的前 20%品种来构建偏度因子,因子取得 8.01%的年化超额收益。
研报显示偏度必须将窗口期放到很长,才能体现效果。这个窗口期大致在140~180日区间,且对于持有期不是很敏感,我们在实际测试中,发现偏度是一个负向因子,对于多因子模型有一定帮助。
6、期货现货基差
期货现货基差指的是期货合约价格与现货价格的差值,现货价格不像期货价格,没有统一的权威的参照,很多大宗商品由于各地区运输成本的存在,差别各异,所以现货价格参照的选取就很讲究了。这里统一参照生意社网站整理的数据,生意社网站已经对不同的商品参照了不同的市场现货价格,如:螺纹钢、玻璃、硅铁参照生产者价格,棉花、甲醇参照市场价格等。
虽然我们在模型中已经添加了期限结构,但是真正的现货数据比起远期合约,又新增了一个维度的因子,值得参考。该因子近几年表现稳定(单因子)。这里的数据来自Fushare提供:
地址和使用方式参考:加载中
个人交易者要想获得类似非结构化清洗后的数据,如果没有tushare、fuahare这样的第三方数据平台支持,真的很困难,尤其是IT功底较差的大部分开发者(以我为例)。
通过该平台提出数据后,转换成行名称为品种名,列名称为日期的数据格式,上传到聚宽【研究】平台,即可在模型中调用,调用代码参考:
# 导入读入csv文件
def csv_setting(context):
# 基差setting
body1=read_file("Basis_xzh.csv")
df1 = pd.read_csv(StringIO(body1))
df1.fillna(0)
df1.index = df1['Unnamed: 0']
del df1['Unnamed: 0']
g.df1 = df1[g.instruments]
7、会员持仓结构
所谓成交持仓表,是一项非常具有中国特色的市场信息——在每个交易日收盘之后,交易所公布每个期货品种的“结算会员成交持仓排名”,该排名以结算会员为单位,披露成交量和持仓量的数据。
2016年9月,方正金工提出了简便版的蜘蛛网策略,该方案不带一丝华丽的数学计算,在沪深300指数期货上却绩效惊人,日胜率57.3%,盈亏比1.48,交易信号的信息比率大于5,堪称性价比最高的期货CTA信号。
(1)计算会员机构的知情度:记会员机构i的多单持仓量为Bi,空单持仓量为Si,当日成交量为Vi。定义其知情度的统计量Stat如下:
Stat_i = (Bi Si) / Vi
Stat_i 的值越大,相当于当日换手率越小,则会员机构i中知情投资者的比例越高。
(2)计算会员机构的情绪指标:记会员机构i当日的多单增量为dBi,空单增量为dSi 。其情绪指标TS(Trader Sentiment)由如下公式计算得到:
TS = (dBi-dSi) / (|dBi| |dSi|)
TS 的值越大,表明该会员机构背后的交易者情绪越偏多,反之则越偏空。
========================= 分割线 =========================
模型细节和测试结果
整体模型通过这3个函数驱动:
# 开盘前运行
run_daily( before_market_open, time='before_open', reference_security=get_future_code('RB'))
# 开盘时运行
run_weekly(market_open, 1,time='open', reference_security=get_future_code('RB'))
# 交易运行
run_weekly(Trade, 1, time='open', reference_security=get_future_code('RB'))
before_market_open完成了主力合约的寻找和移仓换月,market_open完成了7个因子计算,Trade完成了交易环节。第一个函数每日运行run_daily,后两个函数每周一运行run_weekly。
Trade函数首选通过BuyList,SellList = rank_futures(context),获取交易名单。核心的rank_futures函数完成了多因子排序,其逻辑大致如下:
首先生成多列Rank值排序,然后通过Dataframe的rank函数,序列化列名称和值,得到如Momentum_rank、ILLIQ_rank这样的列,然后进行等权排序:
# 因子权重和因子值rank相乘(方法2,直接rank排序)
data_final = 1*statements['Momentum_rank'] \
1*statements['ILLIQ_rank'] \
1*statements['RollYield_rank'] \
- 1*statements['VSTD_rank'] \
- 1*statements['Skew_rank'] \
- 1*statements['Basis_rank'] \
- 1*statements['Hycc_rank']
在此之前我们尝试过先剔除3MAD异常值,再标准化,感觉总是有一些小的bug,在模型开始阶段,所以还是使用直接rank排序可靠一些。该函数最终生成:stocklist_head和stocklist_tail两个名单。传入交易函数。
交易模块最终触发了TrailingStop追踪止损模块(ATR止损),我知道很多交易者都觉得这是个必要环节,我们暂且也认为是这样,给予了2倍日线级别ATR,为了稳定效果,统一在bar后执行,也就是一个bar的close价格触发该模块,然后考虑是否在下一个bar的open价位执行追踪止损。追踪止损需要记录多空仓位,需要计算开仓后最高最低价,这些全局变量需要自己写好,在关键时刻记录价格。
和众多时间序列模型相比,横截面多因子模型在商品期货领域比不多,也许是由于编程语言门槛和因子获取难度,再加上期货品种数量长期偏少,不利于该类模型构建。但是目前我们看到市场风险已经越来越大,单品种模型面临缺乏全市场数据支撑,横截面多因子模型或许是更好的解决方案。
今早再登录聚宽,补上所需的两个文件:现货基差Basis_xzh1和会员持仓结构hycc_TS3:
链接:百度网盘 请输入提取码
提取码:ap97