Bloomberg API (Application Programming Interface) adalah alat canggih yang menyediakan akses terprogram ke layanan data keuangan Bloomberg yang ekstensif. Untuk lembaga keuangan, hedge fund, manajer aset, dan pengembang perangkat lunak, Bloomberg API menawarkan cara untuk mengintegrasikan data pasar real-time, informasi historis, dan data referensi langsung ke dalam aplikasi khusus, sistem perdagangan, dan alat analisis.
Bloomberg menawarkan beberapa versi API untuk mengakomodasi berbagai bahasa pemrograman dan kasus penggunaan:
- BLPAPI (Bloomberg API Core): API C++ dasar
- Wrapper khusus bahasa untuk Python, Java, dan .NET
- Server API (B-PIPE) untuk implementasi tingkat perusahaan
Tutorial ini akan memandu Anda melalui langkah-langkah penting untuk menyiapkan, menghubungkan, dan mengekstrak data secara efisien dari ekosistem keuangan Bloomberg menggunakan API mereka.
Sebelum menyelami implementasi Bloomberg API, pertimbangkan untuk menyiapkan Apidog sebagai platform pengujian API Anda.

Apidog menawarkan alternatif komprehensif untuk Postman dengan fitur-fitur yang ditingkatkan yang dirancang khusus untuk pengembangan, pengujian, dan dokumentasi API. Antarmuka intuitif dan alat kolaborasi yang kuat dapat secara signifikan menyederhanakan alur kerja integrasi Bloomberg API Anda.

Dengan fitur-fitur seperti pengujian otomatis, mock server, dan kemampuan kolaborasi tim yang lebih baik, Apidog sangat berharga saat bekerja dengan API keuangan yang kompleks.
Langkah 1: Menyiapkan Bloomberg API untuk Python
Prasyarat
Sebelum memulai dengan Bloomberg API di Python, pastikan Anda memiliki:
- Langganan Bloomberg Terminal atau hak B-PIPE yang valid
- Bloomberg Desktop API (DAPI) atau Server API yang terinstal
- Python 3.6 atau lebih tinggi yang terinstal di sistem Anda
- Keakraban dasar dengan pemrograman Python
- Akses administrator untuk menginstal paket
Proses Instalasi
Instal Paket Bloomberg Python API:
Bloomberg API untuk Python dapat diinstal menggunakan pip:
pip install blpapi
Ini akan menginstal wrapper Python API Bloomberg resmi, yang berkomunikasi dengan pustaka C++ BLPAPI yang mendasarinya.
Verifikasi Layanan Bloomberg:
Sebelum melanjutkan, pastikan layanan Bloomberg berjalan di mesin Anda. Jika Anda menggunakan Desktop API, Bloomberg Terminal harus berjalan dan Anda harus masuk.
Atur Variabel Lingkungan:
Dalam beberapa konfigurasi, Anda mungkin perlu mengatur variabel lingkungan tertentu untuk membantu Python menemukan pustaka Bloomberg:
import os
os.environ['BLPAPI_ROOT'] = 'C:\\blp\\API' # Sesuaikan jalur sesuai kebutuhan
Verifikasi Instalasi:
Buat program pengujian sederhana untuk memastikan API terinstal dengan benar:
import blpapi
print(f"Versi Bloomberg API: {blpapi.VERSION_MAJOR}.{blpapi.VERSION_MINOR}.{blpapi.VERSION_PATCH}")
Jika ini berjalan tanpa kesalahan, instalasi Python Bloomberg API Anda berfungsi dengan benar.
Langkah 2: Memahami Arsitektur Bloomberg API
Sebelum menyelami kode, penting untuk memahami komponen inti dari arsitektur Bloomberg API:
Komponen Utama
- Sesi: Antarmuka utama untuk berkomunikasi dengan layanan Bloomberg
- Layanan: Mewakili layanan Bloomberg tertentu (misalnya, //blp/refdata untuk data referensi)
- Permintaan: Pesan yang dikirim ke Bloomberg untuk mengambil data tertentu
- Peristiwa: Informasi yang dikembalikan dari Bloomberg sebagai respons terhadap permintaan atau langganan
- Pesan: Kontainer data aktual dalam peristiwa
- Elemen: Bidang data dalam pesan, yang dapat berupa nilai sederhana atau struktur bertingkat yang kompleks
Jenis Layanan
Bloomberg API menyediakan akses ke berbagai layanan:
- //blp/refdata: Data referensi, data historis, dan batang intraday
- //blp/mktdata: Data pasar real-time
- //blp/apiauth: Layanan otentikasi
- //blp/instruments: Pencarian dan penelusuran instrumen
- //blp/apiflds: Layanan informasi bidang
Langkah 3: Membangun Koneksi
Dasar dari setiap aplikasi Bloomberg API adalah membangun koneksi yang tepat ke layanan Bloomberg.
Opsi Koneksi
Bloomberg API menawarkan beberapa metode koneksi:
- Desktop API: Terhubung melalui Bloomberg Terminal lokal
- B-PIPE: Koneksi langsung ke pusat data Bloomberg (solusi perusahaan)
- Remote B-PIPE: B-PIPE melalui server jarak jauh dengan penyeimbangan beban
Contoh Koneksi Dasar
import blpapi
def create_session():
"""Membangun koneksi ke Bloomberg API."""
# Inisialisasi opsi sesi
session_options = blpapi.SessionOptions()
# Konfigurasi parameter koneksi untuk Desktop API
session_options.setServerHost("localhost")
session_options.setServerPort(8194) # Port standar untuk Bloomberg Desktop API
# Opsional: Atur detail otentikasi untuk B-PIPE
# session_options.setAuthenticationOptions("AuthenticationMode=APPLICATION_ONLY;ApplicationAuthenticationType=APPNAME_AND_KEY;ApplicationName=YourAppName")
# Buat dan mulai sesi
session = blpapi.Session(session_options)
if not session.start():
print("Gagal memulai sesi.")
return None
print("Berhasil terhubung ke Bloomberg API")
return session
# Buat sesi
session = create_session()
if session is None:
exit()
Keamanan dan Otentikasi Koneksi
Untuk koneksi B-PIPE, keamanan adalah yang terpenting. Proses otentikasi biasanya melibatkan:
def authenticate_session(session):
"""Otentikasi sesi untuk akses B-PIPE."""
# Buka layanan otentikasi
if not session.openService("//blp/apiauth"):
print("Gagal membuka layanan //blp/apiauth")
return False
auth_service = session.getService("//blp/apiauth")
# Buat permintaan otorisasi
auth_request = auth_service.createAuthorizationRequest()
auth_request.set("uuid", "YOUR_UUID")
auth_request.set("applicationName", "YOUR_APP_NAME")
# Opsional: Tambahkan alamat IP untuk pencarian layanan direktori
ip_addresses = auth_request.getElement("ipAddresses")
ip_addresses.appendValue("YOUR_IP_ADDRESS")
# Kirim permintaan
identity = session.createIdentity()
session.sendAuthorizationRequest(auth_request, identity)
# Proses respons otorisasi
while True:
event = session.nextEvent(500)
if event.eventType() == blpapi.Event.RESPONSE or \
event.eventType() == blpapi.Event.PARTIAL_RESPONSE or \
event.eventType() == blpapi.Event.REQUEST_STATUS:
for msg in event:
if msg.messageType() == blpapi.Name("AuthorizationSuccess"):
print("Otorisasi berhasil")
return True
elif msg.messageType() == blpapi.Name("AuthorizationFailure"):
print("Otorisasi gagal")
return False
if event.eventType() == blpapi.Event.RESPONSE:
break
return False
Langkah 4: Membuat Permintaan Data Dasar
Setelah terhubung, Anda dapat mulai meminta data dari Bloomberg menggunakan berbagai jenis permintaan.
Membuka Layanan
Sebelum membuat permintaan, Anda perlu membuka layanan yang sesuai:
def open_service(session, service_name):
"""Buka layanan Bloomberg."""
if not session.openService(service_name):
print(f"Gagal membuka layanan {service_name}")
return None
return session.getService(service_name)
# Buka layanan data referensi
refdata_service = open_service(session, "//blp/refdata")
if refdata_service is None:
session.stop()
exit()
Permintaan Data Referensi
Permintaan data referensi memungkinkan Anda mengambil bidang statis atau terhitung untuk sekuritas.
def get_reference_data(refdata_service, securities, fields):
"""Ambil data referensi untuk sekuritas dan bidang yang ditentukan."""
# Buat permintaan
request = refdata_service.createRequest("ReferenceDataRequest")
# Tambahkan sekuritas ke permintaan
for security in securities:
request.append("securities", security)
# Tambahkan bidang ke permintaan
for field in fields:
request.append("fields", field)
# Opsional: Tambahkan penggantian
# overrides = request.getElement("overrides")
# override1 = overrides.appendElement()
# override1.setElement("fieldId", "SETTLE_DT")
# override1.setElement("value", "20230630")
print("Mengirim Permintaan Data Referensi:")
print(f" Sekuritas: {securities}")
print(f" Bidang: {fields}")
# Kirim permintaan
session.sendRequest(request)
# Proses respons
results = {}
done = False
while not done:
event = session.nextEvent(500) # Batas waktu dalam milidetik
for msg in event:
if msg.messageType() == blpapi.Name("ReferenceDataResponse"):
security_data_array = msg.getElement("securityData")
for security_data in security_data_array.values():
security = security_data.getElementAsString("security")
# Periksa kesalahan keamanan
if security_data.hasElement("securityError"):
error_info = security_data.getElement("securityError")
error_message = error_info.getElementAsString("message")
results[security] = {"error": error_message}
continue
# Proses data bidang
field_data = security_data.getElement("fieldData")
field_values = {}
# Ekstrak semua bidang yang tersedia
for field in fields:
if field_data.hasElement(field):
field_value = None
# Tangani berbagai jenis data
field_element = field_data.getElement(field)
if field_element.datatype() == blpapi.DataType.FLOAT64:
field_value = field_data.getElementAsFloat(field)
elif field_element.datatype() == blpapi.DataType.INT32:
field_value = field_data.getElementAsInt(field)
elif field_element.datatype() == blpapi.DataType.STRING:
field_value = field_data.getElementAsString(field)
elif field_element.datatype() == blpapi.DataType.DATE:
field_value = field_data.getElementAsDatetime(field).toString()
else:
field_value = str(field_data.getElement(field))
field_values[field] = field_value
else:
field_values[field] = "N/A"
results[security] = field_values
# Periksa kesalahan bidang
if security_data.hasElement("fieldExceptions"):
field_exceptions = security_data.getElement("fieldExceptions")
for i in range(field_exceptions.numValues()):
field_exception = field_exceptions.getValue(i)
field_id = field_exception.getElementAsString("fieldId")
error_info = field_exception.getElement("errorInfo")
error_message = error_info.getElementAsString("message")
# Tambahkan info kesalahan ke hasil
if "field_errors" not in results[security]:
results[security]["field_errors"] = {}
results[security]["field_errors"][field_id] = error_message
# Periksa apakah kita telah menerima respons lengkap
if event.eventType() == blpapi.Event.RESPONSE:
done = True
return results
# Contoh penggunaan
securities = ["AAPL US Equity", "MSFT US Equity", "IBM US Equity"]
fields = ["PX_LAST", "NAME", "MARKET_CAP", "PE_RATIO", "DIVIDEND_YIELD"]
reference_data = get_reference_data(refdata_service, securities, fields)
# Cetak hasil
for security, data in reference_data.items():
print(f"\nSekuritas: {security}")
if "error" in data:
print(f" Kesalahan: {data['error']}")
continue
for field, value in data.items():
if field != "field_errors":
print(f" {field}: {value}")
if "field_errors" in data:
print(" Kesalahan Bidang:")
for field, error in data["field_errors"].items():
print(f" {field}: {error}")
Langkah 5: Bekerja dengan Data Historis
Permintaan data historis memungkinkan Anda mengambil data deret waktu untuk satu atau beberapa sekuritas.
def get_historical_data(refdata_service, security, fields, start_date, end_date, periodicity="DAILY"):
"""Ambil data historis untuk sekuritas dan bidang yang ditentukan."""
# Buat permintaan
request = refdata_service.createRequest("HistoricalDataRequest")
# Atur parameter permintaan
request.set("securities", security)
for field in fields:
request.append("fields", field)
request.set("startDate", start_date)
request.set("endDate", end_date)
request.set("periodicitySelection", periodicity)
# Parameter opsional
# request.set("maxDataPoints", 100) # Batasi jumlah titik data
# request.set("returnEids", True) # Sertakan pengidentifikasi elemen
# request.set("adjustmentNormal", True) # Sesuaikan untuk tindakan korporasi normal
# request.set("adjustmentAbnormal", True) # Sesuaikan untuk tindakan korporasi abnormal
# request.set("adjustmentSplit", True) # Sesuaikan untuk pemecahan
print(f"Meminta data historis untuk {security} dari {start_date} hingga {end_date}")
# Kirim permintaan
session.sendRequest(request)
# Proses respons
time_series = []
done = False
while not done:
event = session.nextEvent(500)
for msg in event:
if msg.messageType() == blpapi.Name("HistoricalDataResponse"):
security_data = msg.getElement("securityData")
security_name = security_data.getElementAsString("security")
# Periksa kesalahan keamanan
if security_data.hasElement("securityError"):
error_info = security_data.getElement("securityError")
error_message = error_info.getElementAsString("message")
print(f"Kesalahan untuk {security_name}: {error_message}")
return []
# Proses data bidang
field_data = security_data.getElement("fieldData")
for i in range(field_data.numValues()):
field_datum = field_data.getValue(i)
data_point = {"date": field_datum.getElementAsDatetime("date").toString()}
# Ekstrak semua bidang yang diminta
for field in fields:
if field_datum.hasElement(field):
data_point[field] = field_datum.getElementAsFloat(field)
else:
data_point[field] = None
time_series.append(data_point)
# Periksa kesalahan bidang
if security_data.hasElement("fieldExceptions"):
field_exceptions = security_data.getElement("fieldExceptions")
for i in range(field_exceptions.numValues()):
field_exception = field_exceptions.getValue(i)
field_id = field_exception.getElementAsString("fieldId")
error_info = field_exception.getElement("errorInfo")
error_message = error_info.getElementAsString("message")
print(f"Kesalahan bidang untuk {field_id}: {error_message}")
# Periksa apakah kita telah menerima respons lengkap
if event.eventType() == blpapi.Event.RESPONSE:
done = True
return time_series
# Contoh penggunaan
security = "IBM US Equity"
fields = ["PX_LAST", "OPEN", "HIGH", "LOW", "VOLUME"]
start_date = "20220101"
end_date = "20221231"
historical_data = get_historical_data(refdata_service, security, fields, start_date, end_date)
# Cetak beberapa titik data pertama
print(f"\nData historis untuk {security}:")
for i, data_point in enumerate(historical_data[:5]):
print(f" {data_point['date']}:")
for field in fields:
print(f" {field}: {data_point.get(field)}")
print(f" ... ({len(historical_data)} total titik data)")
Langkah 6: Berlangganan Data Pasar Real-time
Untuk aplikasi yang memerlukan pembaruan real-time, Anda dapat berlangganan data pasar:
def subscribe_market_data(session, securities, fields):
"""Berlangganan data pasar real-time untuk sekuritas dan bidang yang ditentukan."""
# Buka layanan data pasar
if not session.openService("//blp/mktdata"):
print("Gagal membuka layanan //blp/mktdata")
return False
# Buat daftar langganan
subscriptions = blpapi.SubscriptionList()
# Tambahkan sekuritas ke langganan
for security in securities:
# Format bidang sebagai string yang dipisahkan koma
fields_str = ",".join(fields)
# Buat ID korelasi unik untuk setiap sekuritas
cid = blpapi.CorrelationId(security)
# Tambahkan ke daftar langganan
subscriptions.add(security, fields_str, "", cid)
# Berlangganan
session.subscribe(subscriptions)
print(f"Berlangganan data pasar untuk {len(securities)} sekuritas")
return subscriptions
def process_market_data(session, max_events=100):
"""Proses peristiwa data pasar yang masuk."""
# Lacak nilai terbaru
latest_values = {}
try:
counter = 0
while counter < max_events:
event = session.nextEvent(500)
if event.eventType() == blpapi.Event.SUBSCRIPTION_DATA:
for msg in event:
topic = msg.correlationId().value()
if topic not in latest_values:
latest_values[topic] = {}
# Proses semua bidang dalam pesan
for field in msg.asElement().elements():
field_name = field.name()
# Lewati bidang administratif
if field_name in ["TIMESTAMP", "MESSAGE_TYPE"]:
continue
# Ekstrak nilai berdasarkan jenis data
if field.datatype() == blpapi.DataType.FLOAT64:
value = field.getValueAsFloat()
elif field.datatype() == blpapi.DataType.INT32:
value = field.getValueAsInt()
elif field.datatype() == blpapi.DataType.STRING:
value = field.getValueAsString()
else:
value = str(field.getValue())
latest_values[topic][field_name] = value
print(f"{topic} {field_name}: {value}")
counter += 1
except KeyboardInterrupt:
print("Pemrosesan langganan terganggu")
return latest_values
# Contoh penggunaan
securities = ["IBM US Equity", "AAPL US Equity", "MSFT US Equity"]
fields = ["LAST_PRICE", "BID", "ASK", "VOLUME"]
subscriptions = subscribe_market_data(session, securities, fields)
if subscriptions:
latest_values = process_market_data(session, max_events=50)
# Cetak nilai terbaru untuk setiap sekuritas
print("\nNilai terbaru:")
for security, values in latest_values.items():
print(f" {security}:")
for field, value in values.items():
print(f" {field}: {value}")
# Berhenti berlangganan setelah selesai
session.unsubscribe(subscriptions)
Langkah 7: Bekerja dengan Jenis Data Kompleks dan Data Massal
Bloomberg API dapat menangani struktur data kompleks dan kumpulan data besar secara efisien.
Data Batang Intraday
Data batang intraday menyediakan informasi harga dan volume agregat selama interval tertentu:
def get_intraday_bars(refdata_service, security, event_type, interval, start_time, end_time):
"""Ambil data batang intraday."""
# Buat permintaan
request = refdata_service.createRequest("IntradayBarRequest")
# Atur parameter
request.set("security", security)
request.set("eventType", event_type) # TRADE, BID, ASK, BID_BEST, ASK_BEST, dll.
request.set("interval", interval) # Dalam menit: 1, 5, 15, 30, 60, dll.
request.set("startDateTime", start_time)
request.set("endDateTime", end_time)
# Kirim permintaan
session.sendRequest(request)
# Proses respons
bars = []
done = False
while not done:
event = session.nextEvent(500)
for msg in event:
if msg.messageType() == blpapi.Name("IntradayBarResponse"):
bar_data = msg.getElement("barData")
if bar_data.hasElement("barTickData"):
tick_data = bar_data.getElement("barTickData")
for i in range(tick_data.numValues()):
bar = tick_data.getValue(i)
# Ekstrak data batang
time = bar.getElementAsDatetime("time").toString()
open_price = bar.getElementAsFloat("open")
high = bar.getElementAsFloat("high")
low = bar.getElementAsFloat("low")
close = bar.getElementAsFloat("close")
volume = bar.getElementAsInt("volume")
num_events = bar.getElementAsInt("numEvents")
bars.append({
"time": time,
"open": open_price,
"high": high,
"low": low,
"close": close,
"volume": volume,
"numEvents": num_events
})
if event.eventType() == blpapi.Event.RESPONSE:
done = True
return bars
# Contoh penggunaan
security = "AAPL US Equity"
event_type = "TRADE"
interval = 5 # Batang 5 menit
start_time = "2023-06-01T09:30:00"
end_time = "2023-06-01T16:30:00"
intraday_bars = get_intraday_bars(refdata_service, security, event_type, interval, start_time, end_time)
# Cetak beberapa batang pertama
print(f"\nBatang {interval} menit intraday untuk {security}:")
for i, bar in enumerate(intraday_bars[:5]):
print(f" {bar['time']}:")
print(f" OHLC: {bar['open']}/{bar['high']}/{bar['low']}/{bar['close']}")
print(f" Volume: {bar['volume']} ({bar['numEvents']} peristiwa)")
print(f" ... ({len(intraday_bars)} total batang)")
Langkah 8: Fungsionalitas Tingkat Lanjut - Permintaan Data Massal dan Analisis Portofolio
Bloomberg API memungkinkan analisis canggih dan pengambilan data massal:
Analisis Portofolio
def run_portfolio_analysis(refdata_service, portfolio_data, risk_model="BPAM"):
"""Jalankan analisis portofolio menggunakan Bloomberg PORT API."""
# Buat permintaan
request = refdata_service.createRequest("PortfolioDataRequest")
# Atur parameter umum
request.set("riskModel", risk_model)
# Tambahkan posisi portofolio
positions = request.getElement("positions")
for position in portfolio_data:
pos_element = positions.appendElement()
pos_element.setElement("security", position["security"])
pos_element.setElement("weight", position["weight"])
# Tambahkan faktor risiko untuk dianalisis
analyses = request.getElement("analyses")
analyses.appendValue("RISK_FACTOR_EXPOSURES")
analyses.appendValue("TRACKING_ERROR_CONTRIBUTION")
# Kirim permintaan
session.sendRequest(request)
# Proses respons
# (Catatan: Penanganan respons aktual akan lebih kompleks)
results = {}
done = False
while not done:
event = session.nextEvent(500)
# Proses data peristiwa...
if event.eventType() == blpapi.Event.RESPONSE:
done = True
return results
Langkah 9: Penanganan Kesalahan dan Debugging
Aplikasi Bloomberg API yang kuat memerlukan penanganan kesalahan yang komprehensif:
def handle_bloomberg_exceptions(func):
"""Dekorator untuk menangani pengecualian Bloomberg API."""
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except blpapi.InvalidRequestException as e:
print(f"Kesalahan Permintaan Tidak Valid: {e}")
except blpapi.InvalidConversionException as e:
print(f"Kesalahan Konversi Jenis Tidak Valid: {e}")
except blpapi.NotFoundException as e:
print(f"Kesalahan Elemen Tidak Ditemukan: {e}")
except blpapi.Exception as e:
print(f"Kesalahan Bloomberg API: {e}")
except Exception as e:
print(f"Kesalahan tak terduga: {e}")
return None
return wrapper
@handle_bloomberg_exceptions
def get_safe_reference_data(refdata_service, securities, fields):
# Implementasi dengan penanganan kesalahan bawaan
pass
Langkah 10: Optimalisasi Kinerja dan Praktik Terbaik
Untuk sistem produksi yang menggunakan Bloomberg API:
Pengelompokan Permintaan
def batch_security_requests(securities, batch_size=50):
"""Kelompokkan daftar besar sekuritas menjadi grup yang lebih kecil."""
for i in range(0, len(securities), batch_size):
yield securities[i:i + batch_size]
# Proses daftar besar sekuritas dalam kelompok
all_securities = ["SECURITY1", "SECURITY2", ..., "SECURITY1000"]
all_results = {}
for batch in batch_security_requests(all_securities):
batch_results = get_reference_data(refdata_service, batch, fields)
all_results.update(batch_results)
Langkah 11: Membersihkan Sumber Daya
Selalu tutup koneksi dengan benar setelah selesai:
def clean_up(session, subscriptions=None):
"""Bersihkan sumber daya Bloomberg API dengan benar."""
try:
# Berhenti berlangganan dari langganan aktif apa pun
if subscriptions:
session.unsubscribe(subscriptions)
# Hentikan sesi
if session:
session.stop()
print("Sesi Bloomberg API ditutup")
return True
except Exception as e:
print(f"Kesalahan menutup sesi Bloomberg: {e}")
return False
# Di akhir aplikasi Anda
clean_up(session, subscriptions)
Kesimpulan
Bloomberg API dengan Python menyediakan akses yang kuat ke salah satu platform data keuangan terlengkap di dunia. Tutorial ini telah membahas aspek-aspek penting dalam bekerja dengan API, mulai dari koneksi dasar dan pengambilan data hingga langganan real-time tingkat lanjut dan analisis portofolio.
Poin-poin penting untuk diingat:
- Selalu inisialisasi dan tutup koneksi dengan benar
- Kelompokkan permintaan serupa untuk kinerja yang lebih baik
- Terapkan penanganan kesalahan yang komprehensif
- Pertimbangkan batas laju dan hak data
- Cache data statis bila sesuai
- Gunakan jenis data dan metode konversi yang sesuai
Untuk aplikasi tingkat perusahaan, pertimbangkan untuk menjelajahi penawaran B-PIPE Bloomberg, yang menyediakan opsi konektivitas khusus dan throughput yang lebih tinggi untuk sistem penting.
Saat Anda terus mengembangkan dengan Bloomberg API, lihat dokumentasi resmi Bloomberg BLPAPI untuk informasi terperinci tentang layanan, bidang, dan praktik terbaik yang tersedia. Bloomberg secara teratur memperbarui penawaran API mereka, jadi tetap mengikuti perkembangan terbaru akan memastikan Anda memaksimalkan alat akses data keuangan yang kuat ini.