【量化】商品期货换月的处理思路(old)

商品期货存在换月的情况,即期货合约是有到期日的,如果不想实物交割就得将持仓转换到之后的合约上,而不同月份的价格是不一样的,也就是不连续的,在回测中需要处理换月带来的跳空:

比如上图中的PG是逐月换月的,鼠标标记处就有500点的价差,如果不处理,回测中做多则多了500点的利润、做空则多了500点的亏损,但这在实际换月中不会出现。

因此这和股票中的复权一样都是基础性问题,但是看到中文网络上很少有相关文章去讨论、处理这方面的问题,请教邢大说:

你可以自己定好规则,比如说次月的合约成交量比当月的高了。连续高三天,那你就换到次月的

紧接着问问chatGPT,经过一系列友好交流后:

用邢大的思路先自己拼接一个主连。

准备工作

分合约的商品期货数据。可在量化小讲堂这里下载:

持仓量主力换月

wind里面对自己主连设计的解释是:

由不同时期持仓量最大合约的行情数据拼接而成的拟合合约。因在换月期前后最大持仓量会在不同合约间来回摆动,所以Wind主连合约规则定为只向前切换不回退,每日收盘结算后判断是否切换。

由此可见他们是按持仓量来进行划分的,因此我们这里也用持仓量作为划分标准。

首先,我们把原始数据拼接起来,形成一个具有多个交易日期、但每个合约仅有一个交易日期的表格(以甲醇为例):

from glob import glob
kline_path = r'path'
for i in ['symbol']:
    symbol_file_path = glob(kline_path + '/%s/*[0-9].csv' % i)  # 此处是寻找所有数字结尾的csv文件

df_list = []
for i in symbol_file_path:
    df_list.append(pd.read_csv(i, encoding='GBK', skiprows=1, parse_dates=['交易日期']))

all_coin_data = pd.concat(df_list, ignore_index=True)
data_need_to_prepare = all_coin_data.sort_values('交易日期')

接下来开始整理工作,按合约名字把持仓量铺平开来:

# 计算每个合约在每个交易日的持仓量
holdings = data_need_to_prepare.groupby(['交易日期', '合约代码'])['持仓量'].sum().unstack()

其次用rolling求出来过去滚动5日持仓量最大的值,获取每日横截面比较最大的合约名为一个series,最终用inner的方式把df和series给merge起来,得到的就是我们要的结果。

# 求出过去五日的最大值
rolling_max = holdings.rolling(window=5).max()
# 找到最大值所在的列名
max_columns = rolling_max.idxmax(axis=1)

series_df = max_columns.reset_index()
series_df.columns = ['交易日期', '合约代码']

result = pd.merge(data_need_to_prepare, series_df, on=['交易日期', '合约代码'], how='inner')

最后用股票的复权方式进行复权即可。这里的前收盘价就是单纯的上一个该合约上一日的收盘价,用这个算涨跌幅应该就是当根K线距离本合约上根K线的涨跌幅,以此避免了换月带来的价差。

另一种思路——换月日重新开平仓

上述用股票的复权思路进行了处理,但注意在开仓的时候如果涉及到开仓的具体数量,要用原本没复权的价格,因此处理起来也相对复杂。

有一个取巧的办法,上面不是我们自己做了主连嘛,也就是可以获得换月时间,那么直接把换月那天的仓位变为0即可达成换月前一日平仓、第二日开仓的结果,换月当日空仓:

# 在换月的时候仓位为0,然后第二天正常交易
df.loc[df['合约代码'] != df['合约代码'].shift(), 'pos'] = 0
  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值