问题描述
数据字典_指数数据.md 中关于 get_market_data_ex 的返回值描述是:
{field1: DataFrame, index=stock_list, columns=time_list}
这与 xtdata.md 原文描述的 _ex 版本({stock_code: DataFrame},每股一个 DataFrame)明显矛盾。前者是 get_market_data(v2)的格式,后者才是 _ex(v3)的格式。
解决方案
您好!您的理解是非常准确的。在 QMT 平台中,get_market_data_ex 的返回值格式确实是 {stock_code: DataFrame},即以股票代码为键,以包含该股票历史数据的 DataFrame 为值的字典。
文档中出现的 {field1: DataFrame, index=stock_list, columns=time_list} 描述,实际上是旧版 get_market_data 函数在获取多股多期数据时的一种数据结构表现形式(或者说是早期版本文档的遗留错误)。
为了让您在编写策略时更加清晰,以下是这两个接口在返回值上的核心区别与详细解析:
1. get_market_data_ex 的真实返回值结构(推荐使用)
根据 QMT 官方 API 文档,ContextInfo.get_market_data_ex 的返回值为:
- 数据类型:
dict(字典) - 字典结构:
{code1: data1, code2: data2, ...} - Key (键):
str类型,合约代码(如'000300.SH')。 - Value (值):
pandas.DataFrame类型,该合约的数据集。- Index (行索引):字符串格式的时间序列(如
'20231010'或'20231010093000')。 - Columns (列索引):数据字段(如
'open','high','low','close')。
- Index (行索引):字符串格式的时间序列(如
代码示例:
def handlebar(ContextInfo):
if not ContextInfo.is_last_bar():
return
# 获取沪深300和平安银行的日线数据
data_dict = ContextInfo.get_market_data_ex(
fields=['open', 'high', 'low', 'close'],
stock_code=['000300.SH', '000001.SZ'],
period='1d',
count=5
)
# 解析返回值
for stock_code, df in data_dict.items():
print(f"股票代码: {stock_code}")
print(df) # 打印出该股票的 DataFrame,行是时间,列是 OHLC
# 获取最新收盘价
if not df.empty:
latest_close = df['close'].iloc[-1]
print(f"最新收盘价: {latest_close}")
2. 旧版 get_market_data 的返回值结构(不建议使用)
旧版的 get_market_data 接口设计较为复杂,其返回值类型会根据传入参数(股票数量、时间范围)的不同而发生变化:
- 1只股票,1个时间点:返回单个数值。
- 1只股票,1个时间点,多个字段:返回
pandas.Series。 - 1只股票,多个时间点:返回
pandas.DataFrame(Index 为时间,Columns 为字段)。 - 多只股票,1个时间点:返回
pandas.DataFrame(Index 为股票代码,Columns 为字段)。 - 多只股票,多个时间点:返回
pandas.Panel(三维数组,Items 为股票代码,Major_axis 为时间,Minor_axis 为字段)。由于 Pandas 较新版本已废弃 Panel,这会导致兼容性问题。
总结与建议
- 文档勘误:您指出的矛盾确实存在,部分第三方整理的文档或旧版文档可能混淆了这两个接口的返回值。请以
{stock_code: DataFrame}为准来处理get_market_data_ex的数据。 - 全面拥抱
_ex版本:由于旧版get_market_data返回值类型不固定且依赖已废弃的Panel结构,强烈建议在所有新策略中统一使用get_market_data_ex。它的返回值结构稳定(永远是字典嵌套 DataFrame),非常利于 Pandas 的向量化处理和数据清洗。