返回列表 发布新帖

量化研究--QMT下载全部的股票历史数据

10 0

风险提示:本内容为量化技术及平台操作的纯知识分享,不构成任何投资建议,不推荐任何具体证券或交易时机。部分内容可能理解包含错误,请自行核实。市场有风险,投资需谨慎

最近小伙伴问我,本地的qmt使用不方便,需要历史行情数据做研究,问我怎么样找数据源,目前市场的数据源很大,但是有的收费,可以利用qmt的数据,把历史行情数据保存到本地,比如csv,xlsx。json等都可以,可以给策略读取做研究交易

c983c53bdfa79c98400b38c4c423acc6.png

用来计算技术指标,因子等分析,数据导出到本地可以多线程计算比如qmt平台快

ccfef307c7d7699abc5f0182c1fb88e1.png

722f73f0795fd34e6939055894722d1c.png

第一步下载全市场的股票数据需要读取市场板块的成分股,qmt界面的左边板块都可以读取

f5dc1fd3701d04464d2e77639b5ea616.png

使用这个接口数据读取

74a3528e71052e579d1f6078a4ac6f27.png

第二步建立保存数据的文件夹,可以的话会自动建立,需要最近设置一下保存路径比如桌面

63a0f888dd129b95e1bf7a8caa0d6bbd.png

第三步,下载历史数据函数,因为订阅太慢,所以我没有订阅,直接读取本地保存的数据导出

bcacbe42dab68c097e91382ecce1a7d2.png

需要先补充一下历史数据,在qmt的界面操作上面,点击数据管理

fa370daf17b502a504ca9191ade3780c.png

选择直接需要的周期下载就可以,比如全部

96e85d6b7bbdd56c9d81ac990e63d34a.png

读取本地的下载数据导出

a670144d688f591007ce2a4678a77163.png

使用这个函数读取

09021658be2fab9ae244dfe3bbdc2067.png

没有问题的话把策略挂模型交易,点击下载就可以

a58e23c6728ab61fc4c914486224d066.png

开始下载数据

49120379c708ec276837112291b99281.png

保存的数据结果

40c61fa995899ad957292d2e22b24dba.png

随便打开一个数据看看,重点是要补充下载好数据,如果是订阅的方式下载不需要

e12acdb1293cf4cbf818cb3c7ee7cd7b.png

a0c10c9c8d7bf12c08dbbec9e3cc308f.png

不懂的问我就可以,加我备注入群可以加入量化交流群

6009be4caa0812bc9908c22b7b67683e.jpg

需要开户的也可以找我,专业的量化技术支持服务

代码思路参考

#coding:gbk
'''
作者:小果
微信:xg_quant
全市场A股历史数据下载器
功能:读取全部A股板块成分股,循环下载每只股票的历史日线数据,保存为xlsx文件
'''
import pandas as pd
import os
import datetime
def init(c):
    c.account = '55001947'
    download_all_a_stock_data(c)
def download_all_a_stock_data(c):
    """
    下载全部A股历史日线数据
    参数 c: ContextInfo 对象(QMT回调传入)
    """
    # ========== 设置 ==========
    save_path = r'C:\Users\lxg123456\Desktop\data'
    
    # 创建文件夹
    if not os.path.exists(save_path):
        os.makedirs(save_path)
        print(f"已创建文件夹: {save_path}")
    
    # ========== 1. 获取全部A股股票池 ==========
    current_time = int(datetime.datetime.now().timestamp() * 1000)
    print("正在获取全部A股板块成分股...")
    
    stock_list = c.get_stock_list_in_sector('沪深A股')
    
    # 如果"全部A股"拿不到,尝试"沪深A股"
    if not stock_list or len(stock_list) == 0:
        print("'全部A股'板块未找到,尝试'沪深A股'...")
        stock_list = c.get_stock_list_in_sector('沪深A股')
    
    # 过滤:只保留正常A股(6位数字.市场标识)
    stock_list = [s for s in stock_list if s.count('.') == 1 and s.split('.')[0].isdigit()]
    
    print(f"共获取到 {len(stock_list)} 只A股\n")
    
    # ========== 2. 循环下载每只股票 ==========
    success = 0
    fail = 0
    
    for i, stock in enumerate(stock_list, 1):
        file_path = os.path.join(save_path, f"{stock}.xlsx")
        print(f"[{i}/{len(stock_list)}] 下载 {stock} ...", end="")
        
        try:
            # 获取历史日线数据
            data = c.get_market_data_ex(
                [],                 # 获取全部字段
                [stock],            # 股票代码
                period='1d',        # 日线
                start_time='19900101',  # 从1990年开始
                end_time='20500101',    # 到足够远的时间
                count=-1,           # 全部数据
                dividend_type='front',  # 前复权
                fill_data=True,
                subscribe=False
            )
            
            if stock in data and data[stock] is not None:
                df = data[stock]
                if not df.empty:
                    df.to_excel(file_path)
                    success += 1
                    print(f" 完成 ({len(df)}条)")
                else:
                    fail += 1
                    print(" 数据为空")
            else:
                fail += 1
                print(" 无数据")
                
        except Exception as e:
            fail += 1
            print(f" 失败 - {e}")
    
    # ========== 3. 打印结果 ==========
    print(f"\n{'='*50}")
    print(f"下载完成!")
    print(f"总计: {len(stock_list)} 只股票")
    print(f"成功: {success} 只")
    print(f"失败: {fail} 只")
    print(f"数据保存在: {save_path}")
    print(f"{'='*50}")
def handlebar(c):
    pass

回复

您需要登录后才可以回帖 登录 | 立即注册

客服专线

400-080-8112

用思考的速度交易,用真诚的态度合作,我们是认真的!
  • 关注公众号
  • 添加微信客服
Copyright © 2001-2026 迅投QMT社区 版权所有 All Rights Reserved. 京ICP备2025122616号-3
关灯 快速发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表