Cara menggunakan python openapi parser

Saya baru-baru ini mulai menggunakan Python sehingga saya bisa berinteraksi dengan Bloomberg API, dan saya mengalami beberapa kesulitan menyimpan data ke dalam kerangka data Pandas (atau panel). Saya bisa mendapatkan output di Prompt perintah baik-baik saja, jadi itu bukan masalah.

Pertanyaan yang sangat mirip ditanyakan di sini: Pembungkus panda untuk api Bloomberg?

Namun, kode yang dirujuk dalam jawaban yang diterima untuk pertanyaan itu adalah untuk API lama, dan itu tidak berfungsi untuk API terbuka yang baru. Rupanya pengguna yang mengajukan pertanyaan dapat dengan mudah memodifikasi kode itu agar berfungsi dengan API baru, tetapi saya sudah terbiasa memegang tangan saya di R, dan ini adalah usaha pertama saya dengan Python.

Bisakah beberapa pengguna yang baik hati menunjukkan kepada saya cara memasukkan data ini ke Panda? Ada contoh di API Python (tersedia di sini: http://www.openbloomberg.com/open-api/ ) disebut SimpleHistoryExample.py yang telah saya kerjakan dengan yang saya sertakan di bawah ini. Saya percaya saya harus memodifikasi sebagian besar di sekitar loop 'while (True)' menuju akhir fungsi 'main ()', tetapi semua yang saya coba sejauh ini memiliki masalah.

Terima kasih sebelumnya, dan saya harap ini dapat membantu siapa pun yang menggunakan Panda untuk keuangan.

# 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 __== "__main__":
    print "SimpleHistoryExample"
    try:
        main()
    except KeyboardInterrupt:
        print "Ctrl+C pressed. Stopping..."

Saya menggunakan tia ( https://github.com/bpsmith/tia/blob/master/examples/datamgr.ipynb )

Ini sudah mengunduh data sebagai bingkai data panda dari bloomberg. Anda dapat mengunduh riwayat untuk beberapa ticker dalam satu panggilan tunggal dan bahkan mengunduh beberapa data referensi bloombergs (pertemuan tanggal Bank Sentral, liburan untuk negara tertentu, dll)

Dan Anda cukup menginstalnya dengan pip. Tautan ini penuh dengan contoh tetapi untuk mengunduh data historis semudah:

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')

dan df adalah kerangka data panda. 

Semoga ini bisa membantu

Saya baru saja menerbitkan ini yang mungkin bisa membantu

http://github.com/alex314159/blpapiwrapper

Pada dasarnya tidak terlalu intuitif untuk membongkar pesan, tetapi inilah yang berfungsi untuk saya, di mana strData adalah daftar bidang bloomberg, misalnya ['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

Anda juga dapat menggunakan pdblp untuk ini (Penafian: Saya penulisnya). Ada tutorial yang menunjukkan fungsi serupa yang tersedia di sini https://matthewgilbert.github.io/pdblp/tutorial.html , fungsionalitas dapat dicapai menggunakan sesuatu seperti

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

Saya telah menggunakan pybbg untuk melakukan hal-hal semacam ini. Anda bisa mendapatkannya di sini:

https://github.com/bpsmith/pybbg

Impor paket dan Anda dapat melakukannya (ini ada dalam kode sumber, file bbg.py):

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

Keuntungan:

  • Mudah digunakan; boilerplate minimal, dan parsing indeks dan tanggal untuk Anda.

  • Memblokir. Karena Anda menyebutkan R, saya menganggap Anda menggunakan ini dalam beberapa jenis lingkungan interaktif, seperti IPython. Jadi ini yang Anda inginkan, daripada harus dipusingkan dengan panggilan balik.

  • Itu juga dapat melakukan permintaan historis (mis. Seri harga), intraday dan data massal (belum ada data kutu).

Kekurangan:

  • Hanya bekerja di Windows, sejauh yang saya tahu (Anda harus menginstal dan menjalankan BB workstationg). 

  • Mengikuti di atas, itu tergantung pada api OLE 32 bit untuk Python. Ini hanya berfungsi dengan versi 32 bit - jadi Anda akan membutuhkan 32 bit python dan binding 32 bit OLE

  • Ada beberapa bug. Dalam pengalaman saya, ketika mengambil data untuk sejumlah instrumen, itu cenderung menggantung IPython. Tidak yakin apa yang menyebabkan ini.

Berdasarkan poin terakhir, saya akan menyarankan bahwa jika Anda mendapatkan sejumlah besar data, Anda mengambil dan menyimpannya dalam lembar Excel (satu instrumen per lembar), dan kemudian mengimpor ini. read_Excel tidak efisien untuk melakukan ini; Anda perlu menggunakan objek ExcelReader (?), dan kemudian beralih di atas lembar. Jika tidak, menggunakan read_Excel akan membuka kembali file setiap kali Anda membaca sheet; ini bisa memakan waktu lama.

Tia https://github.com/bpsmith/tia adalah yang terbaik yang saya temukan, dan saya sudah mencoba semuanya ... Memungkinkan Anda melakukan:

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')

Caching juga bagus.

Keduanya https://github.com/alex314159/blpapiwrapper dan https://github.com/kyuni22/pybbg melakukan pekerjaan dasar (terima kasih kawan!) Tetapi mengalami masalah dengan beberapa sekuritas/bidang serta menimpa yang pasti Anda butuhkan.

Satu hal ini https://github.com/kyuni22/pybbg memiliki yang tidak dimiliki adalah bds (keamanan, bidang).

API Bloomberg yang tepat untuk python sekarang ada yang tidak menggunakan COM. Ia memiliki semua pengait untuk memungkinkan Anda mereplikasi fungsionalitas dari addin Excel, dengan keuntungan nyata dari titik akhir bahasa pemrograman yang tepat. Objek permintaan dan respons didokumentasikan dengan buruk, dan cukup tumpul. Namun, contoh-contoh dalam API itu baik, dan beberapa bermain-main menggunakan modul periksa dan mencetak pesan respons akan membuat Anda lebih cepat. Sayangnya, lisensi terminal standar hanya berfungsi di Windows. Untuk * nix Anda akan memerlukan lisensi server (bahkan lebih mahal). Saya telah menggunakannya cukup luas.

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