问题描述
解决方案
在 QMT 量化交易平台中,获取某只股票在特定时间段内的龙虎榜数据,可以使用 ContextInfo.get_longhubang() 接口。
该接口返回一个 pandas.DataFrame 对象,其中包含了上榜原因、成交额、以及买卖席位的详细信息。
核心代码实现
以下是一个完整的策略示例代码,展示了如何在策略初始化时获取“平安银行(000001.SZ)”在指定时间段内的龙虎榜数据并打印结果。
# -*- coding: gbk -*-
def init(ContextInfo):
# 1. 设置需要查询的股票代码列表
stock_list = ['000001.SZ']
# 2. 设置查询的起始时间和结束时间 (格式:YYYYMMDD)
start_time = '20230101'
end_time = '20230630'
# 3. 调用接口获取龙虎榜数据
# 注意:该函数返回的是一个 pandas DataFrame
lhb_data = ContextInfo.get_longhubang(stock_list, start_time, end_time)
# 4. 打印结果
if lhb_data is not None and not lhb_data.empty:
print("获取到的龙虎榜数据如下:")
print(lhb_data)
# 示例:访问第一条记录的买入席位详情
# 注意:'buyTraderBooth' 和 'sellTraderBooth' 字段中的内容本身也是 DataFrame
if 'buyTraderBooth' in lhb_data.columns:
first_record_buy_seats = lhb_data.iloc[0]['buyTraderBooth']
print("-" * 30)
print("第一条记录的买入席位详情:")
print(first_record_buy_seats)
else:
print("未查询到指定时间段内的龙虎榜数据。")
def handlebar(ContextInfo):
# 本示例仅在 init 中演示数据获取,handlebar 中无需操作
pass
函数详解:ContextInfo.get_longhubang
1. 参数说明
- stock_list (
list): 股票代码列表,例如['600000.SH', '000001.SZ']。 - startTime (
string): 起始时间,格式为'YYYYMMDD',例如'20230101'。 - endTime (
string): 结束时间,格式为'YYYYMMDD',例如'20231231'。
2. 返回值说明
返回值为 pandas.DataFrame,主要包含以下字段:
| 字段名 | 含义 | 数据类型 |
|---|---|---|
| reason | 上榜原因 | String |
| close | 收盘价 | Float |
| spreadRate | 涨跌幅 | Float |
| TurnoverVolune | 成交量 | Float |
| Turnover_Amount | 成交金额 | Float |
| buyTraderBooth | 买方席位详情 | DataFrame (嵌套) |
| sellTraderBooth | 卖方席位详情 | DataFrame (嵌套) |
3. 席位详情结构
buyTraderBooth 和 sellTraderBooth 字段中存储的是嵌套的 DataFrame,包含以下列:
traderName: 交易营业部名称buyAmount: 买入金额buyPercent: 买入金额占总成交占比sellAmount: 卖出金额sellPercent: 卖出金额占总成交占比totalAmount: 该席位总成交金额rank: 席位排行direction: 买卖方向
Q&A
Q: get_longhubang 接口返回的数据为空是什么原因?
A: 可能的原因包括:
- 该股票在指定的时间段内没有上过龙虎榜。
- 本地数据未补充完整。请在 QMT 客户端界面的“数据管理”中下载完整的历史行情和专业数据。
- 股票代码或时间格式输入错误(例如使用了非
'YYYYMMDD'的格式)。
Q: 如何获取龙虎榜中买一席位的名称?
A: 返回的数据中 buyTraderBooth 是一个嵌套的 DataFrame。你可以通过索引访问。例如,假设 df 是龙虎榜数据:
# 获取第一行数据的买方席位DataFrame
buy_seats_df = df.iloc[0]['buyTraderBooth']
# 获取买一席位(假设按rank排序,通常第一行即为买一)
if not buy_seats_df.empty:
buy_one_name = buy_seats_df.iloc[0]['traderName']
Q: 这个接口支持回测模式吗?
A: 支持。get_longhubang 接口在回测模式和实盘/模拟模式下均可使用,但必须确保本地已下载了对应的历史数据。