我在我的维亚CSV.py旨在允许接收自定义捆绑包的文件:
#
# Ingest stock csv files to create a zipline data bundle
import os
import numpy as np
import pandas as pd
import datetime
boDebug=True # Set True to get trace messages
from zipline.utils.cli import maybe_show_progress
def viacsv(symbols,start=None,end=None):
# strict this in memory so that we can reiterate over it.
# (Because it could be a generator and they live only once)
tuSymbols = tuple(symbols)
if boDebug:
print "entering viacsv. tuSymbols=",tuSymbols
# Define our custom ingest function
def ingest(environ,
asset_db_writer,
minute_bar_writer, # unused
daily_bar_writer,
adjustment_writer,
calendar,
cache,
show_progress,
output_dir,
# pass these as defaults to make them 'nonlocal' in py2
start=start,
end=end):
if boDebug:
print "entering ingest and creating blank dfMetadata"
dfMetadata = pd.DataFrame(np.empty(len(tuSymbols), dtype=[
('start_date', 'datetime64[ns]'),
('end_date', 'datetime64[ns]'),
('auto_close_date', 'datetime64[ns]'),
('symbol', 'object'),
]))
if boDebug:
print "dfMetadata",type(dfMetadata)
print dfMetadata.describe
print
# We need to feed something that is iterable - like a list or a generator -
# that is a tuple with an integer for sid and a DataFrame for the data to
# daily_bar_writer
liData=[]
iSid=0
for S in tuSymbols:
IFIL="~/notebooks/csv/"+S+".csv"
if boDebug:
print "S=",S,"IFIL=",IFIL
dfData=pd.read_csv(IFIL,index_col='Date',parse_dates=True).sort_index()
if boDebug:
print "read_csv dfData",type(dfData),"length",len(dfData)
print
dfData.rename(
columns={
'Open': 'open',
'High': 'high',
'Low': 'low',
'Close': 'close',
'Volume': 'volume',
'Adj Close': 'price',
},
inplace=True,
)
dfData['volume']=dfData['volume']/1000
liData.append((iSid,dfData))
# the start date is the date of the first trade and
start_date = dfData.index[0]
if boDebug:
print "start_date",type(start_date),start_date
# the end date is the date of the last trade
end_date = dfData.index[-1]
if boDebug:
print "end_date",type(end_date),end_date
# The auto_close date is the day after the last trade.
ac_date = end_date + pd.Timedelta(days=1)
if boDebug:
print "ac_date",type(ac_date),ac_date
# Update our meta data
dfMetadata.iloc[iSid] = start_date, end_date, ac_date, S
iSid += 1
if boDebug:
print "liData",type(liData),"length",len(liData)
print liData
print
print "Now calling daily_bar_writer"
daily_bar_writer.write(liData, show_progress=False)
# Hardcode the exchange to "YAHOO" for all assets and (elsewhere)
# register "YAHOO" to resolve to the NYSE calendar, because these are
# all equities and thus can use the NYSE calendar.
dfMetadata['exchange'] = "YAHOO"
if boDebug:
print "returned from daily_bar_writer"
print "calling asset_db_writer"
print "dfMetadata",type(dfMetadata)
print dfMetadata
print
# Not sure why symbol_map is needed
symbol_map = pd.Series(dfMetadata.symbol.index, dfMetadata.symbol)
if boDebug:
print "symbol_map",type(symbol_map)
print symbol_map
print
asset_db_writer.write(equities=dfMetadata)
if boDebug:
print "returned from asset_db_writer"
print "calling adjustment_writer"
adjustment_writer.write()
if boDebug:
print "returned from adjustment_writer"
print "now leaving ingest function"
if boDebug:
print "about to return ingest function"
return ingest
我的问题是,我输入的数据不是美国数据,而是澳大利亚股票数据。因此,它遵守澳大利亚的假日,而不是美国的假日。似乎不知何故,下面的代码默认使用美国的交易日历,并告诉我,我不能传递数据,美国市场将关闭,反之亦然。如何调整上面的代码以接受自定义日历?为了接收捆绑包,我在终端上运行以下命令:
^{pr2}$有什么想法?在
您需要在zipline/utils/calendars中定义您自己的日历:只需创建一个现有文件的副本(例如,exchange\u calendar)_纽约证券交易所)并编辑所需的假日。假设你把这个文件叫做“我的”_日历.py和班级的《我的日历》。在
请注意,您还需要采取其他2(或3)个步骤:
1)在zipline/util/calendars/calendar中注册日历_实用工具.py:您可以添加一个条目到\u default_calendar_factories,如果需要别名,还可以添加一个别名。例如,映射我自己的_日历.py使用别名“我的日历”来“拥有”:
2)您需要编辑.zipline/扩展名.py(您将在主目录中找到.zipline-要在Windows下查看您的主页,请打开dos shell并键入echo%USERPROFILE%
^{pr2}$通过这些步骤,您应该可以简单地输入zipline incentate-b my\u market来摄取您的捆绑包。在
3)我个人遇到的问题是,我需要对交易日历进行更多的控制,因为超级类交易日历假设周六/周日为非交易日,但并非每个市场/资产类别都如此。错误的日历定义将导致摄取时出现异常。 例如,为了让一个7/7、24/24交易的市场有日历,我对日历进行了如下黑客攻击:
相关问题 更多 >
编程相关推荐