【问题标题】:Save data from TWS API to csv file将数据从 TWS API 保存到 csv 文件
【发布时间】:2020-08-19 14:01:40
【问题描述】:

我有一个 Python 脚本,它从 TWS API(Interactive Brokers)读取数据,并希望将数据转储到 csv 文件中。

现在它只是覆盖数据并打印最后一行以及一堆我不想要的其他值。

它使用 print(df) 打印出正确的值。

代码:

from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.common import *
from ibapi.contract import *
from threading import Timer
from ibapi.ticktype import *
import pandas as pd
import numpy as np


class TestApp(EWrapper, EClient):
    def __init__(self):
        EWrapper.__init__(self)
        EClient.__init__(self, self)

    def error(self, reqId, errorCode, errorString):
        print("Error: ", reqId, " ", errorCode, " ", errorString)

    def nextValidId(self, orderId):
        self.start()

    def contractDetails(self, reqId, contractDetails):
        self.data = [contractDetails]
        df = pd.DataFrame(self.data)
        df.to_csv('options_test.csv')
        print(df)

    def contractDetailsEnd(self, reqId):
        print("\ncontractDetails End\n")


    def start(self):
        #self.reqSecDefOptParams(1, "AAPL", "", "STK", 265598)
        contract = Contract()
        contract.symbol = 'AAPL'
        contract.secType = 'OPT'
        contract.exchange = 'SMART'
        contract.currency = 'USD'
        #contract.primaryExchange = 'NASDAQ'
        contract.lastTradeDateOrContractMonth = '202010'
        #contract.strike = 175
        #contract.right = "C"
        #contract.multiplier = "100"
        global underlying
        underlying = contract.symbol

        self.reqMktData(1, contract, '106', False, False, [])

        self.reqContractDetails(1, contract)

    def stop(self):
        self.done = True
        self.disconnect()


def main():
    app = TestApp()
    app.nextOrderId = 0
    app.connect('127.0.0.1', 7497, 123)
    app.data = []

    Timer(4, app.stop).start()
    app.run()


if __name__ == "__main__":
    main()

我尝试使用 append() 并吐出一个错误。

    def contractDetails(self, reqId, contractDetails):
        self.data = [contractDetails]
        df = pd.append(self.data)
        df.to_csv('options_test.csv')
        print(df)

..raise AttributeError(f"module 'pandas' has no attribute '{name}'")
AttributeError: module 'pandas' has no attribute 'append'

我只想将“contractDetails”中收到的数据保存到 csv 中。

【问题讨论】:

    标签: python pandas interactive-brokers tws


    【解决方案1】:

    contractDetails 是一个 ContractDetails 详细信息对象,我不确定 pandas 将如何制作数据框。最常用的字段是合约对象,它具有可用于请求数据或下订单的 conId。它也有符号,所以你知道你在交易什么。 contractDetails 包含其他信息,例如交易时间和交易所。检查合同的源代码。为了提高效率,我稍微修改了数据框的制作方式。我还稍微修改了代码,去掉了不需要的 Timer。

    from ibapi.client import EClient
    from ibapi.wrapper import EWrapper
    from ibapi.common import *
    from ibapi.contract import *
    from threading import Timer
    from ibapi.ticktype import *
    
    import collections
    import pandas as pd
    
    class TestApp(EWrapper, EClient):
        def __init__(self):
            EWrapper.__init__(self)
            EClient.__init__(self, self)
            self.data=collections.defaultdict(list)
    
        def error(self, reqId, errorCode, errorString):
            print("Error: ", reqId, " ", errorCode, " ", errorString)
    
        def nextValidId(self, orderId):
            self.nextOrderId=orderId
            self.start()
    
        def contractDetails(self, reqId, contractDetails):
            self.data["conid"].append(contractDetails.contract.conId)
            self.data["symbol"].append(contractDetails.contract.localSymbol)
    
        def contractDetailsEnd(self, reqId):
            print("\ncontractDetails End\n")
            self.df=pd.DataFrame.from_dict(app.data)
            self.stop()
    
        def start(self):
            #self.reqSecDefOptParams(1, "AAPL", "", "STK", 265598)
            contract = Contract()
            contract.symbol = 'AAPL'
            contract.secType = 'OPT'
            contract.exchange = 'SMART'
            contract.currency = 'USD'
            #contract.primaryExchange = 'NASDAQ'
            contract.lastTradeDateOrContractMonth = '202010'
            #contract.strike = 175
            #contract.right = "C"
            #contract.multiplier = "100"
            self.reqContractDetails(1, contract)
    
        def stop(self):
            self.disconnect()
            print(self.df)
            #self.df.to_csv('options_test.csv')
    
    def main():
        app = TestApp()
        app.connect('127.0.0.1', 7496, 123)
        app.run()
    

    【讨论】:

    • 试过你的代码,它没有打印出任何东西。是不是少了什么?
    • 它为我打印。将print(self.df) 移动到self.df=pd.DataFrame.from_dict(app.data) 之后,以防在stop() 调用中出现错误。某些版本的 API 有错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 2016-09-01
    • 2016-12-21
    • 2017-08-14
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    相关资源
    最近更新 更多