从历史数据构建可调整的连续期货合约

时间:2014-07-27 04:38:56

标签: python pandas financial trading

我正在学习Python,所以需要指导如何解决这个问题。

我正在使用Quandl软件包下载历史期货数据(ESH2000, ESM2000, ESU2000, ESZ2000, ESH2001, ...., ESU2014)。现在我想为绘图和回测建立连续的后调整合约。

非常感谢有关用于完成以下操作的软件包的建议(即pandas,或numpy,或直接python或其他软件包):

Quandle文件具有以下数据结构:

Date, Open, High, Low, Last, Change, Settle, Volume, Prev. Day Open Interest

ESH2000 data:
3/1/2000    1372.25 1388.75 1371            1384.5  60887   29558
3/2/2000    1384.25 1390.5  1372.5          1385    62489   30059
3/3/2000    1384.75 1414.5  1383.5          1410.5  65432   29923
3/6/2000    1411    1412.75 1386.25         1395    59860   29549
3/7/2000    1394.5  1404.5  1351            1351.75 85263   31256
3/8/2000    1352.75 1376    1348.5          1366    73911   30916
3/9/2000    1367    1405    1357.5          1404    7153    28164
3/10/2000   1403.25 1415.5  1394.25         1399    3192    27549
3/13/2000   1398    1415.75 1364.75         1383.75 2025    26719
3/14/2000   1380.25 1395.75 1359.5          1359.5  1207    25134


ESM2000 data:
3/1/2000    1396    1404    1389.75         1402.75 52  105
3/2/2000    1400.75 1407.75 1391.25         1402.75 91  147
3/3/2000    1400.75 1433    1400.75         1429.75 183 189
3/6/2000    1424.75 1428.75 1405.25         1415    366 379
3/7/2000    1412.5  1423    1370.25         1370.25 1160    1023
3/8/2000    1372.75 1393.75 1366.25         1384    981 1194
3/9/2000    1384.25 1423.5  1376.75         1423    49536   5974
3/10/2000   1423.25 1434.25 1412            1417.75 65615   9561
3/13/2000   1416.75 1418.25 1381.25         1401.75 69428   11559
3/14/2000   1401.25 1414.25 1376.75         1380.5  77793   12057

我希望在卷卷上完成“滚动”到新的合同。

编辑添加:
由于ESH2000合约交易量在2000年3月9日下降,因为交易者转向ESM2000合约,我需要“滚动”到新的合约数据,然后重新调整先前的价值。所以在这个例子中,2000年3月9日新合约的结算价值为1423,而旧合约的结算价值为1404,所以我想匹配它们。所以我需要通过在旧合约的所有值中加上19来进行调整 编辑结束:

所需的输出为:Date, AdjOpen, AdjHigh, AdjLow, AdjClose (Settle), Vol, OI:

3/1/2000    1391.25 1407.75 1390    1403.5  60887   29558       ADJ ESH2000 Data
3/2/2000    1403.25 1409.5  1391.5  1404    62489   30059       ADJ ESH2000 Data
3/3/2000    1403.75 1433.5  1402.5  1429.5  65432   29923       ADJ ESH2000 Data
3/6/2000    1430    1431.75 1405.25 1414    59860   29549       ADJ ESH2000 Data
3/7/2000    1413.5  1423.5  1370    1370.75 85263   31256       ADJ ESH2000 Data
3/8/2000    1371.75 1395    1367.5  1385    73911   30916       ADJ ESH2000 Data
3/9/2000    1384.25 1423.5  1376.75 1423    49536   5974        ESU2000 Data
3/10/2000   1423.25 1434.25 1412    1417.75 65615   9561        ESU2000 Data
3/13/2000   1416.75 1418.25 1381.25 1401.75 69428   11559       ESU2000 Data
3/14/2000   1401.25 1414.25 1376.75 1380.5  77793   12057       ESU2000 Data

我现在正在阅读pandas文档,但我不确定如何“比较”两个文件/数据框以及如何输出文件的子集然后重新调整,然后为历史记录中的每个附加合同执行此操作。

不,我不是要求任何人为我这样做,只是希望有一些方向来集中我的学习努力。

1 个答案:

答案 0 :(得分:5)

这里有一些粗略的东西可以让你开始 - 会更多地考虑使这更加通用,并且可能会有所改进。

首先,我将在每个合约中使用2000年3月的子集,假设每个合约都有自己的数据框。

esm = Quandl.get("CME/ESM2000")['2000-3']
esh = Quandl.get("CME/ESH2000")['2000-3']

可以使用merge来实现数据的组合(按日期加入)视图,left_index可以在标记和/或列上连接数据框。由于日期是两个框架中的索引,因此请指定right_indexcombined = esh.merge(esm, left_index=True, right_index=True)

_x

常用列名称后缀为_y(左框架)和m_highest = combined['Volume_y'] > combined['Volume_x'] roll_date = m_highest[m_highest].index[0] (右框架)。要获得一个真/假的向量,如果M合约的音量最高,只需比较两者。要获得卷切换的第一个日期,您可以使用自身索引该向量,并获取第一个索引值。

roll_gap = esm.loc[roll_date, 'Settle'] - esh.loc[roll_date, 'Settle']

然后通过挑选该日期的每一帧的结算来计算差距。

df = pd.concat([esh[esh.index < roll_date], esm[esm.index >= roll_date]])

通过从每个帧中选择正确的日期并连接来构建组合框架。

df.loc[df.index < roll_date, ['Open','High','Low','Settle']] = (
         df.loc[df.index < roll_date, ['Open','High','Low','Settle']] + roll_gap)

最后,选择较早的日期并按间隙金额进行调整。

{{1}}