我一生中似乎无法获得所需的结构并使它正常运行,所以冒昧地来到你们这里.
设定:
我有一个名为Futures_Contracts的目录,里面有大约30个文件夹,所有文件夹都用基础资产命名,最后是6个最近的csv格式的到期合同.每个csv的格式均相同,并包含日期,O,H,L,C,V,OI,到期月.
注意:O H L C V OI是开仓,高,低,收盘,成交量,未平仓头寸(对于不熟悉的人)也假设平仓是以下结算的代名词
任务:从这里开始,目标是将期货数据加载到多指数熊猫数据框中,以使*指数为基础商品符号,中级指数为月-年到期日,最后OHLC数据.最终目标是让我可以在zipline模块上开始破解,以使其在期货上运行.
因此,在视觉上:
我的尝试:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from pandas import DataFrame, Series
import datetime
plt.figsize(16,8)
deliveries = {}
commoidities = {}
columns = 'open', 'high', 'low', 'settle', 'volume', 'interest', 'delivery' #Contract fields
path = os.getcwdu()+'/Futures_Contracts/' #Futures Path
for sym in os.listdir(path):
if sym[0] != '.': #Weed out hidden files
deliveries[sym] = []
i = 0
for contract in os.listdir(path + sym):
temp = pd.io.parsers.read_csv(path + sym + '/' + contract, index_col=0, parse_dates = True, names = columns)#pull in the csv
deliveries[sym].append(str(contract[:-4][-1] + contract[:-4][:-1][-2:])) #add contract to dict in form of MonthCode-YY
commodities[sym] = deliveries[sym]
commodities[sym][i] = temp
i += 1
这在某种程度上是可行的,但是实际上这是一个嵌套的dict,它在最后保留一个数据帧.因此,切片非常笨拙:
commodities['SB2'][0]['settle'].plot()
commodities['SB2'][3]['settle'].plot()
commodities['SB2'][4]['settle'].plot()
commodities['SB2'][3]['settle'].plot()
commodities['SB2'][4]['settle'].plot()
commodities['SB2'][5]['settle'].plot()
和产量
理想情况下,我将能够对每个索引进行切片,以便可以比较资产,到期日,日期和价值之间的数据.进一步标记我正在查看的内容,如您在matplotlib图表中看到的,所有内容都简单地称为“定居”
当然可以做到这一点,但我还不够聪明,无法弄清楚.
解决方法:
我认为将其集成到一个DataFrame中会更好,因此请考虑使用MultiIndex.这是一个玩具示例,我认为它将很好地转换为您的代码:
In [11]: dfN13 = pd.DataFrame([[1, 2]], columns=[['N13', 'N13'], ['a', 'b']])
In [12]: dfM13 = pd.DataFrame([[3, 4]], columns=[['M13', 'M13'], ['a', 'b']])
这些是您示例中的DataFrame,但是列的第一级只是资产名称.
In [13]: df = pd.concat([dfN13, dfM13], axis=1)
In [14]: df
Out[14]:
N13 M13
a b a b
0 1 2 3 4
为了方便起见,我们可以标记列级别和索引.
In [15]: df.columns.names = ['asset', 'chart']
In [16]: df.index.names = ['date'] # well, not in this toy example
In [17]: df
Out[17]:
asset N13 M13
chart a b a b
date
0 1 2 3 4
注意:这看起来很像您的电子表格.
我们可以使用xs提取特定的图表(例如ohlc):
In [18]: df.xs('a', level='chart', axis=1)
Out[18]:
asset N13 M13
date
0 1 3
In [19]: df.xs('a', level='chart', axis=1).plot() # win