Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据历史数据构建调整后的连续期货合约_Python_Pandas_Financial_Trading - Fatal编程技术网

Python 根据历史数据构建调整后的连续期货合约

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

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

我正在使用Quandl软件包下载历史期货数据
(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我希望我在编辑中解释清楚。如果不让我知道,我会做更多。谢谢。我刚刚想出了合并的办法(根据你先前的建议),然后打算试试