
之前文章写了 通达信TdxQuant 实战:一招搞定“外部调用”与“数据清洗”两大痛点 , 问我分钟级别数据的同学有好几位, 这里简单聊一聊。
我们需要提前下载好 分钟级别数据下载到本地,代码很简单, 我们只需要把1d改成1m就可以了。
tq.get_market_data的period到底支持哪些周期类型呢?
文档里没描述, 我最初也不知道啊, 不妨碍我试一下。 报错提示
period支持 ['5m', '15m', '30m', '1h', '1d', '1w', '1mon', '1m', '10m', '45d', '1q', '1y'])。
这个就是答案了。各类分钟、小时、天、月、年等。 和迅投miniqmt类似, 少了tick数据。 暂时不太清楚 tick数据传递什么周期。
另外一些同学问是否支持指数,当然支持的呀。 比如 上证指数、沪深300, 把stock_list换成 '000001.SH','000300.SH' 就可以了啊。
import sys
import os
import pandas as pd
import numpy as np
from datetime import datetime
tdx_install_path = r"D:\lwj\new_tdx" # 你的通达信安装根目录
pyplugins_user_path = os.path.join(tdx_install_path, "PYPlugins", "user")
sys.path.insert(0, pyplugins_user_path)
# 【重要】切换工作目录到通达信根目录,防止初始化找不到日志文件或报错
os.chdir(tdx_install_path)
from tqcenter import tq
# 初始化tq
tq.initialize(__file__)
def raw_data_to_dataframe_complete(raw_data):
"""
将tq.get_market_data返回的原始数据完整转换为DataFrame
支持多股票、多字段的完整转换
"""
# 检查数据是否为空
if not raw_data:
print("原始数据为空")
return pd.DataFrame()
# 获取所有字段
fields = list(raw_data.keys())
# 获取第一个字段的DataFrame来提取股票代码信息
first_field = fields[0]
first_df = raw_data[first_field]
if isinstance(first_df, pd.DataFrame) and hasattr(first_df, 'columns'):
# 获取所有股票代码
stock_codes = first_df.columns.tolist()
# 创建合并后的DataFrame
df_list = []
for stock_code in stock_codes:
stock_data = {}
# 提取每个字段下该股票的数据
for field in fields:
field_data = raw_data[field]
if isinstance(field_data, pd.DataFrame) and stock_code in field_data.columns:
stock_data[field] = field_data[stock_code].values
elif isinstance(field_data, pd.Series):
# 如果是Series,尝试通过索引获取
stock_data[field] = field_data.values
else:
stock_data[field] = np.nan # 填充缺失值
# 创建该股票的DataFrame
if stock_data[first_field] is not np.nan:
stock_df = pd.DataFrame(stock_data)
stock_df['股票代码'] = stock_code
# 添加日期索引
if hasattr(first_df, 'index'):
stock_df['日期'] = first_df.index
else:
stock_df['日期'] = range(len(stock_df))
df_list.append(stock_df)
# 合并所有股票的数据
if df_list:
final_df = pd.concat(df_list, ignore_index=True)
# 重新排序列
col_order = ['股票代码', '日期'] + fields
final_df = final_df[col_order]
return final_df
return pd.DataFrame()
def main():
stock_list = ["600519.SH",'000001.SZ'] # 贵州茅台,平安银行
start_time = "20260127" # 数据起始日期
end_time = datetime.now().strftime("%Y%m%d") # 数据结束日期(当前日期)
# 2. 获取并整理收盘价数据
raw_data = tq.get_market_data(
stock_list=stock_list,
start_time=start_time,
end_time=end_time,
period='1m',
dividend_type='front',
field_list=['Open', 'High', 'Low', 'Close', 'Amount'],
fill_data=True
)
print(raw_data)
# 转换为标准DataFrame格式
df_standard = raw_data_to_dataframe_complete(raw_data)
print("\n标准格式DataFrame:")
print(df_standard)
if __name__ == "__main__":
main()至于分钟数据支持多长时间, 取决于你本地下载了多少数据。 分钟数据有点占用空间,这里你可以自己试一下。
通达信分钟数据和 迅投miniqmt 有点不一样 。 通达信盘中是不支持下载分钟数据的,需要盘后才能下载。 这个没有迅投miniqmt友好, 如果你依赖盘中分钟数据,那可能需要迅投miniqmt了。或者借助通达信的实时数据完成自己的逻辑计算。
这里说下通达信实时数据方式:
market_snapshot= tq.get_market_snapshot(stock_code='600519.SH')
print(market_snapshot)
print(market_snapshot['Amount'])打印数据:
{'Amount': '1013501.94', 'Average': '1329.74', 'Before5MinNow': '1323.03', 'Buyp': ['1323.69', '0.00', '0.00', '0.00', '0.00'], 'Buyv': ['126', '0', '0', '0', '0'], 'CJBS': '0', 'ErrorId': '0', 'InOutFlag': '2', 'Inside': '49242', 'ItemNum': '4625', 'Jjjz': '0.00', 'LastClose': '1343.01', 'Max': '1346.71', 'Min': '1322.01', 'Now': '1323.69', 'NowVol': '660', 'Open': '1343.04', 'Outside': '26976', 'RefreshNum': '0', 'Sellp': ['1323.70', '0.00', '0.00', '0.00', '0.00'], 'Sellv': ['11', '0', '0', '0', '0'], 'TickDiff': '-0.08', 'Volume': '76218', 'ZAFPre3': '0.00', 'Zangsu': '0.00', 'xsflag': '2'}
1013501.94
通达信实时数据源挺不错的,有5档数据, 类似迅投miniqmt的get_full_tick方法。
最后说下, 把通达信quant数据源作为常用数据源, 还不错。
如果我的分享对你有所帮助, 不吝啬给个点赞呗