从历史数据构建经过调整的持续期货合约

Sno*_*opy 0 python trading financial pandas

我正在学习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
Run Code Online (Sandbox Code Playgroud)

我希望在卷卷上完成"滚动"到新的合同.

编辑添加:
由于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
Run Code Online (Sandbox Code Playgroud)

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

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

chr*_*isb 5

这里有一些粗略的东西让你开始 - 将需要更多的思考,使这更一般,并可能做出改进.

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

esm = Quandl.get("CME/ESM2000")['2000-3']
esh = Quandl.get("CME/ESH2000")['2000-3']
Run Code Online (Sandbox Code Playgroud)

可以实现数据的组合(按日期加入)视图,使用merge该视图可以在标记和/或列上连接数据帧.因为date是两个帧中的索引,所以指定left_indexright_index

combined = esh.merge(esm, left_index=True, right_index=True)
Run Code Online (Sandbox Code Playgroud)

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

m_highest = combined['Volume_y'] > combined['Volume_x']
roll_date = m_highest[m_highest].index[0]
Run Code Online (Sandbox Code Playgroud)

然后通过选择该日期的每个帧的结算来计算差距.

roll_gap = esm.loc[roll_date, 'Settle'] - esh.loc[roll_date, 'Settle']
Run Code Online (Sandbox Code Playgroud)

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

df = pd.concat([esh[esh.index < roll_date], esm[esm.index >= roll_date]])
Run Code Online (Sandbox Code Playgroud)

最后,选择较早的日期并根据间隙金额进行调整.

df.loc[df.index < roll_date, ['Open','High','Low','Settle']] = (
         df.loc[df.index < roll_date, ['Open','High','Low','Settle']] + roll_gap)
Run Code Online (Sandbox Code Playgroud)