web-dev-qa-db-ja.com

Bloomberg APIからのデータをPandasデータフレームに保存するにはどうすればよいですか?

最近、Pythonを使用し始めたので、Bloomberg APIとやり取りできるようになりました。データをPandas=データフレーム(またはパネル)。コマンドプロンプトで正常に出力を取得できるので、それは問題ではありません。

非常によく似た質問がここで尋ねられました: Bloomberg apiのパンダラッパー?

ただし、その質問の受け入れられた回答の参照コードは古いAPI用であり、新しいオープンAPIでは機能しません。質問をしたユーザーは、新しいAPIで動作するようにそのコードを簡単に変更できたようですが、私はRで手をつないでいることに慣れており、これがPythonでの最初の試みです。

慈悲深いユーザーがこのデータをPandasに取り込む方法を教えてもらえますか? Python API(ここで利用可能: http://www.openbloomberg.com/open-api/ )というSimpleHistoryExample.pyという例があります。私は主に「main()」関数の終わりに向かって「while(True)」ループの周りを変更する必要があると思いますが、私がこれまでに試したすべては問題がありました。

事前に感謝します。そして、これがPandas=ファイナンスに使用している人の助けになることを願っています。

# SimpleHistoryExample.py

import blpapi
from optparse import OptionParser


def parseCmdLine():
    parser = OptionParser(description="Retrieve reference data.")
    parser.add_option("-a",
                      "--ip",
                      dest="Host",
                      help="server name or IP (default: %default)",
                      metavar="ipAddress",
                      default="localhost")
    parser.add_option("-p",
                      dest="port",
                      type="int",
                      help="server port (default: %default)",
                      metavar="tcpPort",
                      default=8194)

    (options, args) = parser.parse_args()

    return options


def main():
    options = parseCmdLine()

    # Fill SessionOptions
    sessionOptions = blpapi.SessionOptions()
    sessionOptions.setServerHost(options.Host)
    sessionOptions.setServerPort(options.port)

    print "Connecting to %s:%s" % (options.Host, options.port)
    # Create a Session
    session = blpapi.Session(sessionOptions)

    # Start a Session
    if not session.start():
        print "Failed to start session."
        return

    try:
        # Open service to get historical data from
        if not session.openService("//blp/refdata"):
            print "Failed to open //blp/refdata"
            return

        # Obtain previously opened service
        refDataService = session.getService("//blp/refdata")

        # Create and fill the request for the historical data
        request = refDataService.createRequest("HistoricalDataRequest")
        request.getElement("securities").appendValue("IBM US Equity")
        request.getElement("securities").appendValue("MSFT US Equity")
        request.getElement("fields").appendValue("PX_LAST")
        request.getElement("fields").appendValue("OPEN")
        request.set("periodicityAdjustment", "ACTUAL")
        request.set("periodicitySelection", "DAILY")
        request.set("startDate", "20061227")
        request.set("endDate", "20061231")
        request.set("maxDataPoints", 100)

        print "Sending Request:", request
        # Send the request
        session.sendRequest(request)

        # Process received events
        while(True):
            # We provide timeout to give the chance for Ctrl+C handling:
            ev = session.nextEvent(500)
            for msg in ev:
                print msg

            if ev.eventType() == blpapi.Event.RESPONSE:
                # Response completly received, so we could exit
                break
    finally:
        # Stop the session
        session.stop()

if __name__ == "__main__":
    print "SimpleHistoryExample"
    try:
        main()
    except KeyboardInterrupt:
        print "Ctrl+C pressed. Stopping..."
26
Danny

Tiaを使用します( https://github.com/bpsmith/tia/blob/master/examples/datamgr.ipynb

すでにデータをブルームバーグからパンダデータフレームとしてダウンロードしています。 1回の呼び出しで複数のティッカーの履歴をダウンロードでき、ブルームバーグ参照データ(中央銀行の日付の会議、特定の国の休日など)をダウンロードすることもできます。

そして、あなたはそれをpipでインストールするだけです。このリンクには例がたくさんありますが、履歴データをダウンロードするには次のように簡単です。

import pandas as pd
import tia.bbg.datamgr as dm

mgr = dm.BbgDataManager()
sids = mgr['MSFT US EQUITY', 'IBM US EQUITY', 'CSCO US EQUITY']
df = sids.get_historical('PX_LAST', '1/1/2014', '11/12/2014')

dfはpandasデータフレームです。

それが役に立てば幸い

13
Gabriel

このために pdblp を使用することもできます(免責事項:私は著者です)。ここで利用可能な同様の機能を示すチュートリアルがあります https://matthewgilbert.github.io/pdblp/tutorial.html 、機能は

import pdblp
con = pdblp.BCon()
con.start()
con.bdh(['IBM US Equity', 'MSFT US Equity'], ['PX_LAST', 'OPEN'],
        '20061227', '20061231', elms=[("periodicityAdjustment", "ACTUAL")])
7
mgilbert

これを公開したばかりで、役立つかもしれません

http://github.com/alex314159/blpapiwrapper

メッセージを展開するのは基本的にあまり直感的ではありませんが、これは私にとってうまくいくものです。strDataはブルームバーグフィールドのリストです。たとえば、['PX_LAST'、 'PX_OPEN']:

fieldDataArray = msg.getElement('securityData').getElement('fieldData')
size = fieldDataArray.numValues()
fieldDataList = [fieldDataArray.getValueAsElement(i) for i in range(0,size)]
outDates = [x.getElementAsDatetime('date') for x in fieldDataList]
output = pandas.DataFrame(index=outDates,columns=strData)
for strD in strData:
    outData = [x.getElementAsFloat(strD) for x in fieldDataList]
    output[strD] = outData
output.replace('#N/A History',pandas.np.nan,inplace=True)
output.index = output.index.to_datetime()
return output
5
alex314159

私はpybbgを使用してこの種のことを行ってきました。ここから入手できます:

https://github.com/bpsmith/pybbg

パッケージをインポートすると、次の操作を実行できます(これはソースコードのbbg.pyファイルにあります)。

banner('ReferenceDataRequest: single security, single field, frame response')
req = ReferenceDataRequest('msft us equity', 'px_last', response_type='frame')
print req.execute().response

利点:

  • 使いやすい;最小限の定型句、およびインデックスと日付を解析します。

  • ブロッキングです。 Rに言及しているので、IPythonのような何らかのインタラクティブ環境でこれを使用していると思います。コールバックをいじる必要はなく、これがあなたの望むものです。

  • また、履歴データ(価格シリーズ)、日中データ、バルクデータリクエスト(ティックデータはまだありません)も実行できます。

短所:

  • 私の知る限り、Windowsでのみ動作します(BB workstationgをインストールして実行する必要があります)。

  • 上記に続き、32ビットOLE Pythonのapiに依存します。32ビットバージョンでのみ動作します。したがって、32ビット= pythonおよび32ビットOLE bindings

  • いくつかのバグがあります。私の経験では、多くの機器のデータを取得するとき、IPythonがハングする傾向があります。何が原因なのか分かりません。

最後のポイントに基づいて、大量のデータを取得する場合は、これらを取得してExcelシート(シートごとに1つの楽器)に保存し、インポートすることをお勧めします。 read_Excelは、これを行うには効率的ではありません。 ExcelReader(?)オブジェクトを使用してから、シートを反復処理する必要があります。それ以外の場合、read_Excelを使用すると、シートを読み取るたびにファイルが再度開きます。これには時間がかかる場合があります。

3
Luciano

Tia https://github.com/bpsmith/tia は私が見つけた最高のものであり、私はそれらすべてを試しました...

import pandas as pd
import datetime
import tia.bbg.datamgr as dm
mgr = dm.BbgDataManager()
sids = mgr['BAC US EQUITY', 'JPM US EQUITY']
df = sids.get_historical(['BEST_PX_BPS_RATIO','BEST_ROE'],
                         datetime.date(2013,1,1),
                         datetime.date(2013,2,1),
                         BEST_FPERIOD_OVERRIDE="1GY",
                         non_trading_day_fill_option="ALL_CALENDAR_DAYS",
                         non_trading_day_fill_method="PREVIOUS_VALUE")
print df

#and you'll probably want to carry on with something like this
df1=df.unstack(level=0).reset_index()
df1.columns = ('ticker','field','date','value')
df1.pivot_table(index=['date','ticker'],values='value',columns='field')
df1.pivot_table(index=['date','field'],values='value',columns='ticker')

キャッシングも素晴らしいです。

https://github.com/alex314159/blpapiwrapperhttps://github.com/kyuni22/pybbg の両方が基本的な仕事をしますが(みんなありがとう!)必然的に必要となるオーバーライドと同様に、複数の証券/フィールドがあります。

これ https://github.com/kyuni22/pybbg にtiaにないことの1つは、bds(security、field)です。

2
citynorman

pythonの適切なBloomberg APIが存在します。これはCOMを使用しません。Excelアドインの機能を複製するためのすべてのフックがあり、適切なプログラミング言語の明らかな利点があります。エンドポイント:リクエストオブジェクトとレスポンスオブジェクトの文書化はかなり不十分で、非常に鈍いですが、APIのサンプルは優れており、inspectモジュールの使用やレスポンスメッセージの印刷を試してみることもできます。標準のターミナルライセンスはWindowsでのみ動作します* nixの場合、サーバーライセンス(さらに高価な)が必要になります。

https://www.bloomberg.com/professional/support/api-library/

0
Thomas Browne