尝试使用python和IB API-df获取多个证券的历史数据,而不在循环之间进行清除



我试图通过IB API获取几个产品的历史数据,并将每个产品存储在一个数据帧中(我需要将其保存在单独的csv文件中(。

这是我的代码,主要问题是数据帧没有在循环之间清除,当转移到第二个循环时,df包含2个产品的数据,第三个产品包含3个。我不知道在哪里/如何清除df。

from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.contract import Contract
import pandas as pd
import threading
import time
class IBapi(EWrapper, EClient):
def __init__(self):
EClient.__init__(self, self)
self.data = []
def historicalData(self, reqId, bar):
self.data.append([bar.date, bar.open, bar.high, bar.low, bar.close, bar.volume])

def error(self, reqId, errorCode, errorString):
print("Error. Id: " , reqId, " Code: " , errorCode , " Msg: " , errorString)
def historicalDataEnd(self, reqId: int, start: str, end: str):
print("HistoricalDataEnd. ReqId:", reqId, "from", start, "to", end)
self.df = pd.DataFrame(self.data)
def run_loop():
app.run()

app = IBapi()
#Create contract object
ES_contract = Contract()
ES_contract.symbol = 'ES'
ES_contract.secType = 'FUT'
ES_contract.exchange = 'GLOBEX'
ES_contract.lastTradeDateOrContractMonth  = '202209'
#Create contract object
VIX_contract = Contract()
VIX_contract.symbol = 'VIX'
VIX_contract.secType = 'IND'
VIX_contract.exchange = 'CBOE'
VIX_contract.currency = 'USD'
#Create contract object
DAX_contract = Contract()
DAX_contract.symbol = 'DAX'
DAX_contract.secType = 'FUT'
DAX_contract.exchange = 'EUREX'
DAX_contract.currency = 'EUR'
DAX_contract.lastTradeDateOrContractMonth  = '202209'
DAX_contract.multiplier = '25'
products={'ES': ES_contract, 'VIX': VIX_contract,  'DAX': DAX_contract}
nid=1
app.connect('127.0.0.1', 4001, 123)
#Start the socket in a thread
api_thread = threading.Thread(target=run_loop, daemon=True)
api_thread.start()
time.sleep(1) #Sleep interval to allow time for connection to server
def fetchdata_function(name,nid):
df=pd.DataFrame()
#Request historical candles
app.reqHistoricalData(nid, products[name], '', '1 W', '5 mins', 'TRADES', 0, 2, False, [])
time.sleep(10) #sleep to allow enough time for data to be returned
df = pd.DataFrame(app.data, columns=['Date', 'Open', 'High', 'Low', 'Close', 'Volume'])
df['Date'] = pd.to_datetime(df['Date'],unit='s')
df=df.set_index('Date')
df.to_csv('1week'+str(name)+'5min.csv')  
print(df)
names=['ES', 'DAX', 'VIX']
for name in names:     
fetchdata_function(name,nid)
nid=nid+1   

app.disconnect()

创建一个字典,并将app.data作为键值对附加到historicaldata回调中。然后你可以单独访问它们——事实上,将dict转换为多级数据帧也是可能的

最新更新