首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将BQL Bloomberg excel公式用于python API (xbbg或blpapi)?

如何将BQL Bloomberg excel公式用于python API (xbbg或blpapi)?
EN

Stack Overflow用户
提问于 2021-08-20 06:55:21
回答 1查看 506关注 0票数 1

有没有办法在BLPAPI或XBBG API中使用Python中的BQL公式,而不是遍历一堆报价器,以使用BDP或BDS公式检索标准普尔500指数的所有股票的数据?(我怀疑这将很快达到当天的数据限制,因为我想检查一堆不同的索引)。

我发现了一篇来自2019年的文章,其中建议使用BQNT,但我更倾向于避免使用BQNT,链接在这里:How to implement BQL Bloomberg excel formula to python API (blpapi)?

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-01 13:14:12

在这些评论之后,我尝试了一个从Python驱动Excel的概念验证。这个快速的脏脚本在后台打开Excel,将一个BQL公式放入一个单元格中,轮询返回值,并填充一个DataFrame:

代码语言:javascript
运行
复制
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()

输出:

代码语言:javascript
运行
复制
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进行其他操作时会发生什么!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68858073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档