【问题标题】:How to use the BQL Bloomberg excel formula for python API (xbbg or blpapi)?如何为 python API(xbbg 或 blpapi)使用 BQL Bloomberg excel 公式?
【发布时间】:2021-08-20 06:55:21
【问题描述】:

有没有办法在 BLPAPI 或 XBBG API 中使用 Python 中的 BQL 公式,而不是使用 BDP 或 BDS 公式循环通过一堆代码来检索 S&P500 的所有股票的数据? (我怀疑这将很快达到当天的数据限制,因为我想检查一堆不同的指标)。

我发现了一个 2019 年的帖子,其中建议使用 BQNT,但我宁愿避免使用 BQNT,链接在这里:How to implement BQL Bloomberg excel formula to python API (blpapi)?

提前致谢!

【问题讨论】:

  • Bloomberg 仍未公开 BQL 的 API,因此无法从 Python 访问其功能(通过其专有的 BQNT 除外)。一种方法可能是从 Python 驱动 Excel:通过 Excel BQL 函数获取数据并提取到 Python。我没试过这个。但是逐个获取股票信息可能不会超过任何限制:客户想要同时监控多个股票市场(甚至在 BQL 之前)是很常见的事情。我已经使用 API 20 年了,并且没有达到任何限制(至少在 FI 中)。
  • 您好 DS_London,非常感谢您的建议!

标签: python bloomberg blpapi


【解决方案1】:

除了 cmets,我还尝试了一个从 Python 驱动 Excel 的概念验证。这个 quick'n'dirty 脚本在后台打开 Excel,将 BQL 公式放入单元格,轮询返回值,并填充 DataFrame:

import pandas as pd
import time

import win32com.client as wc

#Get a dispatch interface for the Excel app
_xl = wc.Dispatch("Excel.Application")
#Ensure the Bloomberg addin is loaded
_xl.Workbooks.Open('c:\\blp\\API\\Office Tools\\BloombergUI.xla')

#Create a new workbook
wb = _xl.Workbooks.Add()
ws = wb.Sheets(1)
cl = ws.Cells(1,1) #Cell A1 on Sheet 1

#Define BQL query, and set cell formula
qry ='=@BQL.Query("get(YIELD) for(filter(bonds([\'IBM US Equity\']),CPN_TYP==Fixed and CRNCY==USD))")' 
cl.Formula=qry
_xl.Calculate()

#Check the cell's value: it will likely be #N/A ...
res = cl.Value
nLoop = 0
nTimeout = 100 #ie 10 seconds

#Loop until either get a non-# return or timeout
while res[0]=='#' and nLoop<=nTimeout:
    time.sleep(0.1) #100 ms
    res = cl.Value
    nLoop += 1

if res[0] == '#':
    print('Timed out')
    return

print('Results after {0:} secs'.format(nLoop/10.0))

#The Bloomberg addin will have changed the original BQL formula
#and added a 'cols=x,rows=y' parameter at the end
#This tells us the size of the data
#as BQL doesn't seem to have the option to return a dynamic array
f = cl.Formula
rc = f.split(',')[-1].split(';')
cols  = int(rc[0].split('=')[1])
s = rc[1].split('=')[1]
rows = int(s[0:len(s)-2])

#Retrieve the values from this new range
data = ws.Range(cl,ws.Cells(rows,cols)).Value

#Convert to DataFrame
df=pd.DataFrame(data[1:],columns=data[0])
print(df)

#Tidy up
_xl.DisplayAlerts = False
wb.Close()  
_xl.Quit()

输出:

Results after 1.4 secs
               ID     YIELD
0   DD103619 Corp  1.012017
1   BJ226366 Corp  1.921489
2   DD103620 Corp  3.695580
3   ZS542668 Corp  2.945504
4   BJ226369 Corp  2.899166
5   ZS542664 Corp  1.109456
6   BJ226365 Corp  1.350594
7   ZS542666 Corp  2.732168
8   ZS542661 Corp  0.147570
9   ZS542663 Corp  0.621825
10  EJ772545 Corp  0.391708
11  EJ222340 Corp  2.846866
12  ZS542665 Corp  1.842695
13  EJ299219 Corp  0.224708
14  DD108917 Corp  3.733077
15  AM269440 Corp  0.189621
16  QJ633474 Corp  0.295588
17  BJ226367 Corp  2.727445
18  EC767655 Corp  2.241108
19  EI062653 Corp  2.728811
20  JK138051 Corp  1.077776
21  DD115180 Corp  1.604258
22  DD112334 Corp  1.527195
23  EK063561 Corp  0.570778
24  AM269866 Corp  1.329918
25  JK138053 Corp  2.915085
26  EH589075 Corp  3.110513

如果我要在生产环境中执行此操作,我会将整个内容封装在一个类中,以避免每次我想执行查询时停止和启动 Excel。另外,我还没有测试用户已经为其他东西运行 Excel 会发生什么!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多