复盘期货主连时,看到相邻两天的价格差了不少,很容易顺着图表说:"这个品种涨了这么多。"但如果这两天采用的已经不是同一个月份合约,这句话就需要再想一想。
同一张合约从昨天到今天的变化,与两个交割月之间的价格差,本来就是两件事。研究记录换了合约之后,看到的端点差额可能把它们放到了一起。
差了10,不一定是同一张合约涨了10
用一组纯假设来说明。A、B是同一期货品种的两个月份合约,价格单位一致;第二天两份价格采用相同、已完成的观察口径。它们不是实际行情,也不是某个主连数据产品的拼接规则。
| 观察位置 | 合约A价格 | 合约B价格 | 研究记录采用的价格 |
|---|---|---|---|
| 第一天 | 100 | 不用于本例 | A的100 |
| 第二天 | 101 | 110 | B的110 |
只看研究记录的两个端点,是从100到了110,差额为10。但A自身只从100变到101,变化为1;第二天B比A高9。
所以,这个假设里的10,可以理解为:
A自身的变化1,加上第二天B与A之间的价差9。
不是说这10"算错了",而是它不等于"同一张合约上涨了10"。如果把这段差额继续用于解释某张合约的涨跌,就会把跨月价差也算进那张合约的价格变化中。
合约没换和换了,读法就不一样
若研究记录的两端都是A,比较的是A在两个观察位置的价格。若一端是A、另一端变成B,日期和合约身份同时变了,差额的含义也随之改变。
这对解释走势很重要。某次看起来较大的变化,可能同时包含行情本身的变化和换合约带来的价格差异;不能还没弄清两端是谁,就全归因于某个品种突然变强或变弱。
这也不意味着换月区间都该删掉。研究连续观察序列、研究固定月份合约,原本就可能需要不同的样本处理。应当把切换区间标明,让解释与研究对象一致,而不是为了让曲线好看,统一补价或抹掉差额。
用TqSdk查清两端对应哪个合约
TqSdk的query_his_cont_quotes(symbol, n)可以查询指定主连最近若干交易日对应的标的合约。symbol指定主连,n是最近的交易日数;结果中的date与主连对应列,提供逐日合约身份。
它适合帮助核对:某个研究区间的两端,对应合约是否发生了变化。确认这一点以后,再用口径一致的价格解释该区间,而不是直接拿今天的主力月份代替过去所有日期。
不过,这份结果是合约映射,不是价格表,也不能给出某一天盘中精确切换的时刻。研究日期不在返回范围内,或标的为空时,都不能靠猜月份补上。它更不会替前面的假设生成一份实际盈亏记录。
如果另外查看K线,也不要把股票、基金使用的adj_type复权参数直接当成期货主连换月的解决办法。这里要解决的是价格变化的含义,不是一键把所有研究口径变成同一种曲线。
TqSdk让换月后的价格更容易解释
我推荐在这类期货研究中用TqSdk核对标的身份,原因很具体:它让"这两天是不是同一张合约"有了可查的依据。身份没有变化,可以围绕同一合约讨论;身份变了,就把跨月价差的影响单独拿出来理解。
主连方便连续观察,不代表每段端点差都能当作同一合约的涨跌,更不能直接当成账户收益。弄清价格背后是哪张合约,复盘时才知道自己看到的是行情变化、合约差异,还是两者共同形成的结果。