Python 根据历史数据构建调整后的连续期货合约
我正在学习Python,所以需要关于如何解决这个问题的指导 我正在使用Quandl软件包下载历史期货数据Python 根据历史数据构建调整后的连续期货合约,python,pandas,financial,trading,Python,Pandas,Financial,Trading,我正在学习Python,所以需要关于如何解决这个问题的指导 我正在使用Quandl软件包下载历史期货数据(ESH2000、ESM2000、ESU2000、ESZ2000、ESH2001、…、ESU2014)。现在,我想构建用于绘图和回溯测试的连续回溯调整契约 如果您能提供有关用于完成以下任务的软件包(即pandas、numpy、straight python或其他软件包)的建议,将不胜感激: Quandle文件具有以下数据结构: Date, Open, High, Low, Last, Chan
(ESH2000、ESM2000、ESU2000、ESZ2000、ESH2001、…、ESU2014)
。现在,我想构建用于绘图和回溯测试的连续回溯调整契约
如果您能提供有关用于完成以下任务的软件包(即pandas、numpy、straight 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来进行反向调整。
编辑结束: 所需的输出将是:
日期、AdjOpen、AdjHigh、AdjLow、AdjClose(结算)、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文档,但不确定如何“比较”两个文件/数据帧,以及如何输出文件子集,然后进行反向调整,然后对历史记录中的每个附加合同进行调整
不,我不是要求任何人帮我做这件事,只是希望有一些方向来集中我的学习努力。这里有一些粗略的东西让你开始-需要更多的思考才能使这件事更一般,并且可能会有所改进 首先,我将只处理每个合同的2000年3月子集,假设每个都在它自己的数据框架中
esm = Quandl.get("CME/ESM2000")['2000-3']
esh = Quandl.get("CME/ESH2000")['2000-3']
使用merge
可以连接标记和/或列上的数据帧,可以实现数据的组合(按日期连接)视图。因为日期在两个帧中都是索引,所以指定left\u索引
和right\u索引
combined = esh.merge(esm, left_index=True, right_index=True)
通用列名将以\ux
(左框)和\uy
(右框)作为后缀。要获得M合同是否具有最高容量的真/假向量,只需比较两者。要获取卷切换的第一个日期,您可以将该向量本身编入索引,并获取第一个索引值
m_highest = combined['Volume_y'] > combined['Volume_x']
roll_date = m_highest[m_highest].index[0]
然后通过选择该日期每帧的结算来计算差距
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=pd.concat([esh[esh.index=roll\u date]]
最后,选择较早的日期并根据差额金额进行调整
df.loc[df.index < roll_date, ['Open','High','Low','Settle']] = (
df.loc[df.index < roll_date, ['Open','High','Low','Settle']] + roll_gap)
df.loc[df.index
这里有一些粗略的东西可以让您开始学习-需要更多的思考才能使其更加通用,并且可能会有所改进
首先,我将只处理每个合同的2000年3月子集,假设每个都在它自己的数据框架中
esm = Quandl.get("CME/ESM2000")['2000-3']
esh = Quandl.get("CME/ESH2000")['2000-3']
使用merge
可以连接标记和/或列上的数据帧,可以实现数据的组合(按日期连接)视图。因为日期在两个帧中都是索引,所以指定left\u索引
和right\u索引
combined = esh.merge(esm, left_index=True, right_index=True)
通用列名将以\ux
(左框)和\uy
(右框)作为后缀。要获得M合同是否具有最高容量的真/假向量,只需比较两者。要获取卷切换的第一个日期,您可以将该向量本身编入索引,并获取第一个索引值
m_highest = combined['Volume_y'] > combined['Volume_x']
roll_date = m_highest[m_highest].index[0]
然后通过选择该日期每帧的结算来计算差距
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=pd.concat([esh[esh.index=roll\u date]]
最后,选择较早的日期并根据差额金额进行调整
df.loc[df.index < roll_date, ['Open','High','Low','Settle']] = (
df.loc[df.index < roll_date, ['Open','High','Low','Settle']] + roll_gap)
df.loc[df.index
我将从合并文档开始——同样,一旦开始,这里有一篇关于在python@chrisb中构建连续未来的文章。我试图了解如何使用合并,或者更具体地说,从第一个契约中提取子集,其中卷量大于第二个契约。我也读过quantstart,它是一个很好的参考资料,尽管它是一种创建连续卷的不同方法,并且需要为每个卷手动输入日期,我正试图避免这种情况。@davisdba感谢您修复了格式设置。新手在这里,仍在学习如何正确发布。你的术语有点特定于你的领域,因此你如何获得所需的输出还不是很清楚,你能编辑你的问题进一步解释吗?@chrisb我希望我在编辑中解释清楚。如果不让我知道,我会做得更多。我会从合并文档开始——同样,一旦开始,这里有一篇关于在python@chrisb中构建连续未来的文章。我试图了解如何使用合并,或者更具体地说,从第一个契约中提取子集,其中的容量大于第二个契约。我也读过quantstart,它是一个很好的参考资料,尽管它是一种创建连续卷的不同方法,并且需要为每个卷手动输入日期,我正试图避免这种情况。@davisdba感谢您修复了格式设置。新手在这里,仍在学习如何正确发布。你的术语有点特定于你的领域,因此你如何获得所需的输出还不是很清楚,你能编辑你的问题进一步解释吗?@chrisb我希望我在编辑中解释清楚。如果不让我知道,我会做更多。谢谢。我刚刚想出了合并的办法(根据你先前的建议),然后打算试试