网站程序怎么备份,盐城网站建设兼职,升降机网站怎么做,淄博张店网站建设商品期货存在换月的情况#xff0c;即期货合约是有到期日的#xff0c;如果不想实物交割就得将持仓转换到之后的合约上#xff0c;而不同月份的价格是不一样的#xff0c;也就是不连续的#xff0c;在回测中需要处理换月带来的跳空#xff1a;
比如上图中的PG是逐月换月…商品期货存在换月的情况即期货合约是有到期日的如果不想实物交割就得将持仓转换到之后的合约上而不同月份的价格是不一样的也就是不连续的在回测中需要处理换月带来的跳空
比如上图中的PG是逐月换月的鼠标标记处就有500点的价差如果不处理回测中做多则多了500点的利润、做空则多了500点的亏损但这在实际换月中不会出现。
因此这和股票中的复权一样都是基础性问题但是看到中文网络上很少有相关文章去讨论、处理这方面的问题请教邢大说 你可以自己定好规则比如说次月的合约成交量比当月的高了。连续高三天那你就换到次月的 紧接着问问chatGPT经过一系列友好交流后
用邢大的思路先自己拼接一个主连。
准备工作
分合约的商品期货数据。可在量化小讲堂这里下载
持仓量主力换月
wind里面对自己主连设计的解释是 由不同时期持仓量最大合约的行情数据拼接而成的拟合合约。因在换月期前后最大持仓量会在不同合约间来回摆动所以Wind主连合约规则定为只向前切换不回退每日收盘结算后判断是否切换。 由此可见他们是按持仓量来进行划分的因此我们这里也用持仓量作为划分标准。
首先我们把原始数据拼接起来形成一个具有多个交易日期、但每个合约仅有一个交易日期的表格以甲醇为例
from glob import glob
kline_path rpath
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, encodingGBK, skiprows1, parse_dates[交易日期]))all_coin_data pd.concat(df_list, ignore_indexTrue)
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(window5).max()
# 找到最大值所在的列名
max_columns rolling_max.idxmax(axis1)series_df max_columns.reset_index()
series_df.columns [交易日期, 合约代码]result pd.merge(data_need_to_prepare, series_df, on[交易日期, 合约代码], howinner)最后用股票的复权方式进行复权即可。这里的前收盘价就是单纯的上一个该合约上一日的收盘价用这个算涨跌幅应该就是当根K线距离本合约上根K线的涨跌幅以此避免了换月带来的价差。
另一种思路——换月日重新开平仓
上述用股票的复权思路进行了处理但注意在开仓的时候如果涉及到开仓的具体数量要用原本没复权的价格因此处理起来也相对复杂。
有一个取巧的办法上面不是我们自己做了主连嘛也就是可以获得换月时间那么直接把换月那天的仓位变为0即可达成换月前一日平仓、第二日开仓的结果换月当日空仓
# 在换月的时候仓位为0然后第二天正常交易
df.loc[df[合约代码] ! df[合约代码].shift(), pos] 0