【量化】商品期货换月的处理思路(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

相关推荐

  1. 量化商品期货处理思路old

    2023-12-28 18:22:03       66 阅读
  2. 期货量化交易:探索金融投资新领域

    2023-12-28 18:22:03       31 阅读
  3. Android音乐播放器思路处理

    2023-12-28 18:22:03       28 阅读
  4. PyTorch量化思维,以及Tensor、nn接口

    2023-12-28 18:22:03       43 阅读
  5. 如何学好量子计算机技术两种思路

    2023-12-28 18:22:03       28 阅读
  6. 【学习心得】Pandas处理缺失值思路

    2023-12-28 18:22:03       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-28 18:22:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-28 18:22:03       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-28 18:22:03       87 阅读
  4. Python语言-面向对象

    2023-12-28 18:22:03       96 阅读

热门阅读

  1. 利用ChatGPT在不同教学场景中的应用

    2023-12-28 18:22:03       62 阅读
  2. 【Web2D/3D】Canvas(第三篇)

    2023-12-28 18:22:03       51 阅读
  3. 测试工程师年终总结

    2023-12-28 18:22:03       49 阅读
  4. P8722 [蓝桥杯 2020 省 AB3] 日期识别(C语言)

    2023-12-28 18:22:03       54 阅读
  5. 不限带宽是否意味着无限带宽

    2023-12-28 18:22:03       61 阅读
  6. Linux的基本命令

    2023-12-28 18:22:03       54 阅读
  7. WebView下载适配blob协议

    2023-12-28 18:22:03       57 阅读
  8. vue exceljs json数据转excel

    2023-12-28 18:22:03       54 阅读
  9. React面试题

    2023-12-28 18:22:03       52 阅读
  10. GetLastError()详细介绍

    2023-12-28 18:22:03       56 阅读