掘金量化下载维护日K级数据
- 2026-10-17 16:55:00
掘金量化下载维护日K级数据

各类代码教程与视频演示放于宽客堂量化平台https://quantkt.com 
量化学习交流群和相关教程联系平台管理员quantkt获取
对应平台帖 https://quantkt.com/forumDetail?id=201264
由于日K级数据不大,每次获取都是个股全历史,所以这里不需要考虑增量更新,每次直接刷新即可。
运行后即可获取上交和深交的股票历史日K数据。

- stock_code
:股票代码,000001.SZ 代表深交所 000001。 - name
:该交易日对应的股票名称,注意掘金这里没有找到历史更名记录,所以这里统一按最新的个股名称命名了(如果对于命名准确性有更高要求,可以参考其它数据或者找到个股历史更名表用脚本进行修改)。 - trade_date
:交易日,格式 YYYYMMDD。 - open
:当日开盘价。 - high
:当日最高价。 - low
:当日最低价。 - close
:当日收盘价。 - vol
:成交量,单位股。 - amount
:成交额,单位元。 - pre_close
:前一交易日收盘价,用于计算涨跌幅。
整体逻辑
使用get_instrumentinfos接口获取A股个股名称列表,遍历获取的个股。使用history获取历史数据,frequency调整为1d,表示日k数据。
使用df.to_csv即可将获取的dataframe保存到本地。
执行效果

参考代码DEMO
# coding: utf-8from __future__ import print_function, absolute_importfrom gm.api import *import osimport timeimport pandas as pdBASE_DIR = os.path.dirname(os.path.abspath(__file__))SAVE_DIR = os.path.join(BASE_DIR, 'history_data')def init(context):if not os.path.exists(SAVE_DIR): os.makedirs(SAVE_DIR)print('保存目录: {}'.format(SAVE_DIR))# ---------- 获取全市场股票及名称 ---------- info_df = get_instrumentinfos( exchanges=['SZSE', 'SHSE'], sec_types=1,df=True )if info_df is None or len(info_df) == 0:print('未获取到任何股票')return symbols = info_df['symbol'].values name_map = dict(zip(info_df['symbol'], info_df.get('sec_name', ''))) total = len(symbols)print('共获取 {} 只股票,开始下载...'.format(total)) ok_cnt = 0 fail_list = []for idx, symbol in enumerate(symbols): try: file_code = gm_symbol_to_file_code(symbol) # SZSE.000001 -> 000001.SZif file_code is None:continue file_name = '{}_history_data.csv'.format(file_code) file_path = os.path.join(SAVE_DIR, file_name)# 断点续传,如果需要跳过已经有的文件,则打开下文注释# if os.path.exists(file_path):# ok_cnt += 1# continuedf = history( symbol=symbol, frequency='1d', start_time='1990-01-01', end_time='2099-12-31',# fields='symbol, frequency, open, high, low, close, volume, amount, pre_close, position, bob, eob',# adjust=ADJUST_PREV,df=True )ifdf is None or len(df) == 0:print('[{}/{}] {} 无数据'.format(idx + 1, total, symbol)) fail_list.append(symbol)continue# ---------- 转换 ----------# 1. symbol -> stock_code,内容改成 000001.SZdf = df.rename(columns={'symbol': 'stock_code'})df['stock_code'] = file_code# 2. volume -> voldf = df.rename(columns={'volume': 'vol'})# 3. 用 eob 生成 trade_date(20010413 格式)if'eob'in df.columns:df['trade_date'] = pd.to_datetime(df['eob']).dt.strftime('%Y%m%d')# 4. 删除 bob、eob、frequency、positiondf = df.drop(columns=[c for c in ['bob', 'eob', 'frequency', 'position'] if c in df.columns])# 5. 加 name 列df['name'] = name_map.get(symbol, '')# 6. 按 trade_date 升序df = df.sort_values('trade_date').reset_index(drop=True)# 7. 调整列顺序:stock_code, name, trade_date 放前面 front_cols = ['stock_code', 'name', 'trade_date'] other_cols = [c for c in df.columns if c not in front_cols]df = df[front_cols + other_cols] df.to_csv(file_path, index=False, encoding='utf-8-sig') ok_cnt += 1print('[{}/{}] {} -> {} 行 {}'.format( idx + 1, total, symbol, len(df), file_name)) time.sleep(0.05) except Exception as e:print('[{}/{}] {} 下载失败: {}'.format(idx + 1, total, symbol, e)) fail_list.append(symbol)print('=' * 60)print('下载完成: 成功 {} / {}'.format(ok_cnt, total))if fail_list:print('失败 {} 只:'.format(len(fail_list)))for s in fail_list:print(' ', s)def gm_symbol_to_file_code(symbol):"""SZSE.000001 -> 000001.SZ SHSE.600000 -> 600000.SH"""if'.' not in symbol:return None market, code = symbol.split('.', 1)if market == 'SZSE':return'{}.SZ'.format(code)elif market == 'SHSE':return'{}.SH'.format(code)elif market == 'BJSE':return'{}.BJ'.format(code)else:return Noneif __name__ == '__main__': run( strategy_id='strategy_id', filename='main.py', mode=MODE_BACKTEST, token='your_token', backtest_start_time='2024-01-01 09:00:00', backtest_end_time='2024-12-31 15:30:00', backtest_initial_cash=1000000, backtest_commission_ratio=0.0001, backtest_slippage_ratio=0.0001 )注意点,该学习脚本提供了上交和深交的数据,暂时不下载北交数据。
掘金该数据对应的name列为当前最新的个股名称,没有考虑改名历史,如果有历史需要,可自行获取个股改名历史进行个股历史名称维护。
现阶段渠道开户和量化QMT/掘金量化/PTrade福利(万0.8,etf万0.5)解锁平台会员,获取量化系统教程与各类量化框架

本文来自网友投稿或网络内容,如有侵犯您的权益请联系我们删除,联系邮箱:wyl860211@qq.com 。