3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 QMT 平台中使用 get_market_data_ex 接口获取长周期(如月线 1mon、季线 1q、半年线 1hy)数据失败,通常是由以下两个原因导致的:
1w),但对更长周期的自动合成支持可能不完善。get_market_data_ex 的 period 参数主要明确支持 'tick'、分钟线(如 '1m', '5m')、日线('1d')等。对于 '1mon' 等长周期,建议通过日线数据自行合成,这样既准确又灵活。既然您已经下载了日线数据,最稳妥且高效的方法是:获取日线数据(1d),然后使用 Python 的 pandas 库将其重采样(Resample)为月线、季线等任意周期数据。
以下是具体的代码示例:
#coding:gbk
import pandas as pd
def init(ContextInfo):
pass
def handlebar(ContextInfo):
if not ContextInfo.is_last_bar():
return
BY_DAIMA = ["000059.SZ"]
# 1. 获取足够数量的日线数据(例如获取过去500个交易日的日线)
daily_data = ContextInfo.get_market_data_ex([], BY_DAIMA, '1d', '', '', 500, 'front', False, False)
if BY_DAIMA[0] in daily_data and not daily_data[BY_DAIMA[0]].empty:
df = daily_data[BY_DAIMA[0]]
# 2. 将索引(字符串格式的日期)转换为 datetime 格式
df.index = pd.to_datetime(df.index)
# 3. 使用 pandas 的 resample 方法重采样为月线 ('M' 代表月末)
# 定义各字段的合成规则:开盘价取月初,最高价取当月最高,最低价取当月最低,收盘价取月末,成交量/额求和
mon_df = df.resample('M').agg({
'open': 'first',
'high': 'max',
'low': 'min',
'close': 'last',
'volume': 'sum',
'amount': 'sum'
})
# 4. 剔除没有交易的月份(例如停牌导致全月无数据)
mon_df = mon_df.dropna()
# 打印合成后的月线数据
print("合成的月线数据:")
print(mon_df.tail())
# 获取月线收盘价列表
MON_Close_list = mon_df['close'].tolist()
print("月线收盘价列表长度:", len(MON_Close_list))
else:
print("未获取到日线数据,请检查数据下载情况。")
使用上述 resample 方法,您只需修改重采样的频率字符串即可轻松获得其他周期数据:
resample('M') 改为 resample('Q')resample('M') 改为 resample('6M')resample('M') 改为 resample('Y')这种方法不仅解决了接口直接获取不到数据的问题,还能确保复权方式(如前复权)在长周期上的计算完全符合您的策略逻辑。