新手做量化交易,应该从哪些金融数据 API 开始学?

发布时间:2026/9/28 19:05:09
新手做量化交易,应该从哪些金融数据 API 开始学? 新手最常问的问题是哪个 API 最好用但这个问题问早了。你真正该问的是以我现在的水平下一个该练什么数据 API 的学习是有顺序的——顺序错了你会把时间全花在调试接口参数上而真正该练的数据处理功夫一点没长。这篇文章把它拆成五级台阶每级都给出可验收的练手任务和对应平台。一、先纠正一个认知你缺的不是 API是数据处理的功夫很多人上手第一天就去研究怎么拿到全市场 Tick 数据结果拿到几十万行数据之后发现自己连groupby都写不顺更别说算复权、拼多表。一个残酷但有用的判断标准如果给你一份现成的 CSV 行情文件你不能在半小时内算出 5 日/20 日均线并画出金叉点那么现在学任何 API 都是浪费时间。数据的获取只是一次性的工程问题数据的处理才是量化里反复要用的能力。先把后者练出来前者学起来会快得多——因为你会清楚地知道我需要什么字段而不是别人说这个接口很全。二、五级台阶从能跑通一行代码到数据不再断先看全貌。这张图是整篇文章的骨架后面逐级展开图 1五级台阶全貌每级都有可验收的练手任务注意其中一个判断第一个接口要选参数最少的那个。新手最容易掉进的坑是——一上手就选一个带七八个参数的接口把时间耗在猜参数上而不是理解数据。三、逐级展开阶段 0 · 先把工具捂热1–2 周不碰任何接口。先把这三样练熟Python 基础语法、pandas读写与筛选、matplotlib画图。练手任务找一份现成的行情 CSV读进 DataFrame按日期排序画一张收盘价折线图。python import pandas as pd import matplotlib.pyplot as plt # 让 matplotlib 正常显示中文 plt.rcParams[font.sans-serif] [Microsoft YaHei] plt.rcParams[axes.unicode_minus] False df pd.read_csv(sample_kline.csv, parse_dates[date]) df df.sort_values(date).reset_index(dropTrue) print(df.head()) print(df.dtypes) # ← 养成习惯先看类型日期是不是真的 datetime plt.figure(figsize(12, 4)) plt.plot(df[date], df[close]) plt.title(收盘价走势) plt.tight_layout() plt.show() 验收标准日期列是datetime64而不是object。这一点没做到后面所有按日期筛选的代码都会出问题。阶段 1 · 从没有参数的接口起步1 周第一个接口要选参数最少的。股票列表、交易日历、指数代码——这类接口的目的不是取到什么数据而是先跑通发请求 → 拿 JSON → 转 DataFrame这条链路。StockAPI 的 A 股列表接口就是个好起点它的请求参数表格是空的一个参数都不用传请求频率限制也很宽松2 次/天因为文档明确建议用户只在本地留一份图 2A 股列表接口——请求参数为空最适合作为第一个练手的接口python import requests import pandas as pd # 第一个接口不需要任何参数 resp requests.get(https://www.stockapi.com.cn/v1/base/all, timeout10) body resp.json() print(返回码:, body[code], | 状态:, body[msg]) # 20000 表示成功 df pd.DataFrame(body[data]) print(df.head()) print(f全市场共 {len(df)} 只标的) # 落成 CSV这正是接口文档建议的做法 df.to_csv(all_a_stocks.csv, indexFalse, encodingutf-8-sig) 练手任务把全市场 A 股代码存成本地 CSV然后统计沪市多少只、深市多少只、科创板多少只。验收标准你能说出为什么这个接口限制 2 次/天却毫无影响——因为它是静态数据每天同步一次就够真正该被调用的是本地 CSV。第二个接口可以换成交易日历它只多一个参数但会让你第一次接触到按日期查询这个模式图 3交易日历接口——参数比上一个多但仍足够简单阶段 2 · 历史 K 线 复权2 周★ 核心台阶这是整个学习路径里最重要的一级。必须在这级把三件事搞清楚OHLCV 各字段的含义——开盘、最高、最低、收盘、成交量三种复权口径的区别——前复权、后复权、不复权为什么复权错了回测就全废。前复权以最新价格为基准回溯调整历史价格所以你看到的历史曲线会随每一次新的除权除息而整体变化后复权以最早价格为基准向前推算历史序列一旦生成就不会再变。两者没有对错用途不同看盘用前复权长期收益分析用后复权。StockAPI 的日/周/月 K 线接口把口径直接写在文档里——数据为前复权交易日 16:00 更新图 4K 线接口文档复权口径和更新时间都标在接口说明里练手任务拉一只票 10 年日线找出一次送股日对比前复权与不复权序列在该日前后的跳空差异并解释为什么前复权序列是平滑的。验收标准你能向别人讲清楚为什么我用前复权数据做的回测过半年再跑结果会变。阶段 3 · 指标与信号生成2 周从原始 K 线走到交易信号。这一级有个关键要求先手算一遍再调现成接口。自己用 pandas 算过 MA你才会知道返回值该长什么样。之后无论接口给你什么格式——是嵌套的Object[]还是扁平数组——你都能一眼看出对不对。算出来之后再拿接口返回值对账。StockAPI 把常用指标都做成了独立接口KDJ 这类指标还允许自定义周期参数图 5指标类接口周期与计算参数都可以传练手任务用收盘价自算 5 日 / 20 日均线标出全部金叉死叉点再调接口拿一次 MA逐行比对两者的差异。验收标准如果两者对不上你能定位到是复权口径不同、周期参数不同还是停牌日的处理方式不同——这比对上了更有价值。阶段 4 · 实时行情与限频现实1 周盘中数据是另一套逻辑讲究低延迟、稳定轮询、断线恢复。你会第一次撞上限频这堵墙。这一级最重要的收获不是技术而是认知你会亲手体会到为什么免费接口做不了生产。当你的盯盘脚本因为超频而静默返回空数据时你就真正理解了商业接口在卖什么。python import time import requests import pandas as pd watch [600519, 000858, 300750] rows [] for _ in range(3): # 只轮询 3 轮避免触发限频 for code in watch: try: r requests.get(https://www.stockapi.com.cn/v1/base/wudang, params{code: code}, timeout5).json() # 注意接口文档标注该接口仅在 9:25-15:00 有数据 rows.append({code: code, resp_code: r.get(code)}) except requests.RequestException as e: rows.append({code: code, resp_code: type(e).__name__}) time.sleep(3) # 行情本身就是几秒一个快照1 秒轮询是浪费 print(pd.DataFrame(rows)) 练手任务写一个盯盘脚本每 3 秒刷新自选股连续跑满一个交易日不掉线并把每次失败的原因记录下来。阶段 5 · 落库与容错工程化持续从能拿到走到一直拿到。这四件事做完你的数据层才算毕业静态数据落库——股票列表、交易日历、指数成分每天同步一次到本地增量更新——只拉上次更新时间之后的数据而不是每次全量重拉指数退避重试——失败后按 1s、2s、4s 退避而不是硬扛错误码分类——把额度用完参数错误网络超时分开处理因为它们的应对方式完全不同。python import sqlite3 import pandas as pd import requests conn sqlite3.connect(market.db) def incremental_update(code, tablekline): 增量拉取只取本地已有的最后一天之后的数据。 cur conn.execute(fSELECT MAX(date) FROM {table} WHERE code ?, (code,)) last cur.fetchone()[0] start last or 2016-01-01 body requests.get( https://www.stockapi.com.cn/v1/base/day, params{code: code, startDate: start, endDate: 2026-09-25, calculationCycle: 100}, timeout10, ).json() if body.get(code) ! 20000: # 分类处理额度耗尽不该重试参数错误不该重试网络问题才该重试 print(f{code} 拉取失败: {body.get(code)} {body.get(msg)}) return 0 df pd.DataFrame(body[data]) if df.empty: return 0 df.to_sql(table, conn, if_existsappend, indexFalse) return len(df) ⚠️ 上面的示例里响应字段名以官网「响应参数」表格标注为准——不同接口的命名不统一写代码前先核对一遍别照抄任何博客。练手任务把全市场日线落到 SQLite写一个每天自动跑的增量更新脚本断网重连后能自己补上缺口。四、一次请求要跨过五道关认识到这一层你才真正理解接口这个抽象背后有多少坑。新手以为调接口 拿数据实际上中间隔着五个会静默失败的地方图 6五道关其中只有第 1 关通常会给你明确的错误码为什么说静默失败最可怕这五关里只有鉴权那一关通常会返回一个明确的错误码。限流、格式、时间窗这三关的失败形式往往是HTTP 200但是空数据或者数字对不上——代码不会报错回测照跑直到你发现结论是错的。所以正确的学习姿势是每接入一个新接口先按这五关逐条验证一遍再写进业务代码。五、各阶段该用哪个平台不同平台适合不同的学习阶段。下面这几张是各家的官方页面可以自己去看。阶段 1–2 的首选BaoStock。免注册、匿名登录、三种复权口径可传参日线数据扎实。它的知识库把「每日更新」「A股K线数据」「指数数据」的 API 说明分门别类放在一起图 7BaoStock 官方知识库入口阶段 2–3 的补充Tushare Pro。它的接口分类导航本身就适合当接口地图来读能帮你建立金融数据到底有哪些维度的整体认知。另外它的股票代码规范.SH/.SZ/.BJ/.HK值得早点记住图 8Tushare 的数据接口分类与代码后缀规范找另类数据AkShare。但要理解它的工作机制。翻它的文档每个接口下面都写着一行「目标地址」——指向的是交易所或门户网站的页面图 9AkShare 文档里的目标地址——它的数据来自抓取网页这就是为什么 AkShare 适合盘后做研究而不适合放进每天定时跑的生产脚本源站改一次前端结构接口就失效。阶段 1、4、5 的通行做法REST JSON 接口。比如前面反复用到的 A 股列表、K 线、盘口接口都属于这一类。它的文档是每个接口一张说明表的形式官方整理了一份把全部84 个接口平铺的总览页每个带 ID 和版本号图 10接口总览页可作为接口地图通读一遍stockapi提供了 Python、Java、PHP、C、C#、C、Node.js 七种语言的对接示例——新手可以直接对照自己常用的语言抄第一段代码图 11多语言对接示例七种语言任选六、新手最容易踩的五个坑1. 一开始就追求全市场 Tick 级数据。Tick 数据量级是日线的几百倍你还没有能力处理它。先用日线把全流程走通再考虑提高频率。2. 把数据拉下来就以为是自己的了。存成 CSV 不等于拥有数据。CSV 无法响应交易所的事后修正比如配股除权日调整你手里的文件会慢慢变成过期信息。3. 不设min_periods。df[close].rolling(20).mean()默认会给你前 19 行的部分计算结果看着像均线其实是垃圾值。不加min_periods是新手最常见的隐性 bug。4. 用sleep(1)硬扛限频。先搞清楚接口的频率上限是多少再设计轮询间隔。行情本身几秒才更新一次快照1 秒轮询除了浪费额度没有任何收益。5. 直接照抄博客里的字段名。包括这篇。字段名以官方「响应参数」表格为准——不同接口的命名不统一抄错一个字段名close会静默变成别的列而且不报错。风险提示本文涉及的接口信息均取自各平台公开文档回测结果基于历史数据历史表现不代表未来收益。本文不构成任何投资建议。