首页 > 解决方案 > Interactive Brokers python API - 将 ReportsFinSummary 转换为 pandas

问题描述

我正在尝试做一些我认为很简单的事情……显然不是。我想使用 python ib api 从 ReportFinSummary 中提取一些数据。我希望能够使用 DPS 数字。我正在尝试用漂亮的汤对 xml 代码进行排序,没有任何乐趣。任何帮助将不胜感激。艾伦

from ib.opt import ibConnection, message
from ib.ext.Contract import Contract
from time import sleep
from bs4 import BeautifulSoup
import pandas as pd

def fundamentalData_handler(msg):
    print(msg)

def error_handler(msg):
    print(msg)

tws = ibConnection(port=7497, clientId=123)
tws.register(error_handler, message.Error)
tws.register(fundamentalData_handler, message.fundamentalData)
tws.connect()

c = Contract()
c.m_symbol = 'RDSA'
c.m_secType = 'STK'
c.m_exchange = "SMART"
c.m_currency = "GBP"

tws.reqFundamentalData(1,c,'ReportsFinSummary')

soup = BeautifulSoup(tws.reqFundamentalData(1,c,'ReportsFinSummary'),'xml')
DPS_Data = soup.find_all('DividendPerShares')
DPS = []
for dates in DPS_Data:
    DPS.append(DPS_Data.get_text())

print(pd.DataFrame({'DPS_Data': DPS}))

sleep(2)

tws.disconnect()

标签: pythonbeautifulsoupinteractive-brokersibpyib-api

解决方案


这是未经测试的,但应该让你走上正确的轨道。您使用的是多年未开发的 IbPy,最好使用本机 API 或 IbPythonic。

from ib.opt import ibConnection, message
from ib.ext.Contract import Contract
from time import sleep
from bs4 import BeautifulSoup
import pandas as pd

class IB():
    def __init__(self):
        pass

    def fundamentalData_handler(self, msg):
        self.data = msg

    def error_handler(self, msg):
        print(msg)

    def connect(self, port=7497, clientId=123):
        self.tws = ibConnection(port, clientId)
        self.tws.register(self.error_handler, message.Error)
        self.tws.register(self.fundamentalData_handler, message.fundamentalData)
        self.tws.connect()

    def disconnect(self):
        self.tws.disconnect()

    def get(self):
        c = Contract()
        c.m_symbol = 'RDSA'
        c.m_secType = 'STK'
        c.m_exchange = "SMART"
        c.m_currency = "GBP"

        self.tws.reqFundamentalData(1, c, 'ReportsFinSummary')
        while not hasattr(self, 'data'):
            sleep(0.1)

        soup = BeautifulSoup(self.data)
        DPS_Data = soup.find_all('DividendPerShares')
        DPS = [DPS_Data.get_text() for dates in DPS_Data]

        return pd.DataFrame({'DPS_Data': DPS})

ib = IB()
ib.connect()
df = ib.get()
ib.disconnect()
print(df)

推荐阅读