我正在学习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文档,但我不确定如何“比较”两个文件/数据框以及如何输出文件的子集然后重新调整,然后为历史记录中的每个附加合同执行此操作。
不,我不是要求任何人为我这样做,只是希望有一些方向来集中我的学习努力。
答案 0 :(得分:5)
这里有一些粗略的东西可以让你开始 - 会更多地考虑使这更加通用,并且可能会有所改进。
首先,我将在每个合约中使用2000年3月的子集,假设每个合约都有自己的数据框。
esm = Quandl.get("CME/ESM2000")['2000-3']
esh = Quandl.get("CME/ESH2000")['2000-3']
可以使用merge
来实现数据的组合(按日期加入)视图,left_index
可以在标记和/或列上连接数据框。由于日期是两个框架中的索引,因此请指定right_index
和combined = 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}}