30

Bloomberg API を操作できるように、最近 Python を使い始めましたが、データを Pandas データフレーム (またはパネル) に格納する際に問題が発生しています。コマンド プロンプトで問題なく出力を取得できるので、それは問題ではありません。

非常によく似た質問がここで尋ねられました: Pandas wrapper for 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..."
4

6 に答える 6

17

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 はパンダのデータフレームです。

それが役に立てば幸い

于 2016-06-10T22:06:53.963 に答える
6

参考になりそうな記事を公開しました

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
于 2014-07-02T14:09:32.077 に答える
3

私はこの種のことをするために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 をインストールして実行する必要があります)。

  • 上記に続いて、Python 用の 32 ビット OLE API に依存します。32 ビット バージョンでのみ動作するため、32 ビット Python と 32 ビット OLE バインディングが必要になります。

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

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

于 2013-12-25T12:07:47.827 に答える
3

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 にないものは bds(security, field) です。

于 2016-08-17T22:40:01.163 に答える
1

COM を使用しない Python 用の適切な Bloomberg API が存在するようになりました。Excel アドインの機能を複製できるすべてのフックがあり、適切なプログラミング言語エンドポイントという明らかな利点があります。リクエスト オブジェクトとレスポンス オブジェクトのドキュメントはほとんどなく、非常にわかりにくいものです。それでも、API の例は優れており、inspect モジュールを使って遊んだり、応答メッセージを出力したりすることで、すぐに慣れることができます。残念ながら、標準のターミナル ライセンスは Windows でしか機能しません。*nix の場合、サーバー ライセンスが必要になります (さらに高価です)。私はそれをかなり広範囲に使用しました。

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

于 2014-03-23T18:14:28.933 に答える