← 返回博客列表

【智兔数服|A股分钟级高频数据完全手册 #29】高频因子与回测数据管线实战:分钟级因子计算与防未来函数(29–42地图)

2026年11月13日 09:55 · 智兔数服 · A股分钟级高频数据完全手册

摘要:【智兔数服|A股分钟级高频数据完全手册 #29】高频因子与回测数据管线实战:分钟级因子计算与防未来函数(29–42地图) 系列:《A股分钟级高频数据完全手册》|连载项目 · 纯 GET 取数 · 仅依

系列:《A股分钟级高频数据完全手册》|连载项目 · 纯 GET 取数 · 仅依赖 requests · Pro 版分钟级高频

① 你将得到什么

前面 28 篇把数据从取到落库、到指标都讲透了,但数据不等于策略。本篇是第三周期主推:把分钟级数据串成一条回测管线——取数→清洗→计算分钟级因子(如 1 分钟收益率、滚动偏离)→严格防未来函数(只用 t 时刻及之前的数据)→输出可回测因子序列。同时导览 29–42 的实时高频全家桶。

本篇产出:① 一条可复用的分钟级回测数据管线代码(因子计算 + 防未来函数校验);② 本周期 29–42 的 14 篇地图(资金流/涨跌停/股池/全市场实时);③ 防未来函数的核心原则与自查方法。

读完这篇,你应当能独立把本篇端点数据拉下来、落本地,并跑出一份可用的加工分析表。

② 取数约定

一个端点拉数据,返回里字段名可能中英文混用(不同接口版本、不同数据源习惯不同)。演示用 你的token 占位,代码里 MOCK=True 时回放演示数据,接真实 token 把 MOCK 改成 False 即可,无需改动其他逻辑。

所有请求走 https://api.zhituapi.com + ?token=,纯 GET、仅依赖 requests,不依赖任何付费 SDK。字段口径以接口实际返回为准,本文用 _hit_key 做了大小写/中英文容错;落地前建议先用 print(r[0].keys()) 核对一次你账号下的真实字段名。

落地建议:把每天拉到的数据按 代码 + 日期 做主键写入本地 SQLite/CSV,避免重复插入;历史回看靠本地累积,而非反复调接口。本篇示例代码已包含字段容错映射与本地加工函数,你只需把 print 替换为写入语句。

③ 端点分组地图

篇 主接口 内容
29(本篇) 因子 / 回测管线 高频因子与分钟级回测数据管线:因子计算与防未来函数
30 /hs/history/transaction/{code} 个股当日资金流 + VWAP
31 /hs/history/transaction/{date}/{code} 历史资金流截面
32 /hs/stopprice/history/{code} 涨跌停价序列
33 /hs/lup/limit/{code} 连板与炸板情绪
34 /hs/lup/auction/{code} 集合竞价表现
35 /hs/pool/ztgc/{date} 涨停股池
36 /hs/pool/dtgc/{date} 跌停股池
37 /hs/pool/qsgc/{date} 强势股池
38 /hs/pool/cxgc/{date} 次新股池
39 /hs/pool/zbgc/{date} 炸板股池
40 /hs/public/realall 全市场实时(公开)
41 /hs/public/ssjymore 实时多选(公开)
42 /hs/custom/realall 全市场实时(券商)

本篇涉及字段(落地建表参考):时间、收、成交量、因子值。

返回结构为 JSON 数组(或含数组字段的对象),每条记录即一根分钟 bar / 一笔明细;字段映射函数已按上述字段做容错映射,直接复用即可。

④ 核心模板函数(自包含·可跑)

import requests, time, copy
from urllib.parse import quote

BASE = "https://api.zhituapi.com"
# 将 "你的token" 替换成您自己的智兔API token(官网注册后在「控制台 / 接口管理」页获取,免费额度即可起步)。
TOKEN = "你的token"

# ---------- 字段容错与类型归一 ----------
def _hit_key(d, *cands, default=None):
    """字段容错:接口偶发大小写/中英文混用时,按顺序取第一个非空值"""
    if not isinstance(d, dict):
        return default
    for c in cands:
        if c in d and d[c] not in (None, "", "-", "null"):
            return d[c]
    low = {str(k).lower(): v for k, v in d.items()}
    for c in cands:
        v = low.get(str(c).lower())
        if v not in (None, "", "-", "null"):
            return v
    return default

def _to_float(v, default=None):
    try:
        if v in (None, "", "-", "null", "None"):
            return default
        return float(v)
    except (TypeError, ValueError):
        return default

# ---------- 统一请求:token 鉴权 + 重试退避(MOCK 开关) ----------
MOCK = True
DEMO_DATA = {}

def _get(path, params=None, timeout=10, retries=2, backoff=0.6, default=None):
    """返回 JSON;MOCK=True 时回放 DEMO_DATA;否则真实 GET 并带 token 鉴权、重试 retries 次"""
    if MOCK:
        return copy.deepcopy(DEMO_DATA.get(path, {} if default is None else default))
    q = {"token": TOKEN}
    if params:
        q.update(params)
    last = ""
    for i in range(retries + 1):
        try:
            r = requests.get(BASE + path, params=q, timeout=timeout)
            if r.status_code == 200:
                try:
                    return r.json()
                except ValueError:
                    return default
            last = "HTTP %s %s" % (r.status_code, (r.text or "").strip()[:80])
        except Exception as e:
            last = "%s: %s" % (type(e).__name__, e)
        if i < retries:
            time.sleep(backoff * (i + 1))
    return {"_error": last}


# ---------- 本篇技术深入:分钟级因子计算 + 防未来函数 ----------
def _mk_demo(n=12):
    rows = []
    for i in range(n):
        base = 10.0 + i * 0.1
        rows.append({"t":"2024-01-10 09:%02d:00" % (31 + i), "c":"%.2f" % (base + 0.05),
                     "v":"%d" % (10000 + i * 500)})
    return rows

DEMO_DATA = {"/hs/pro/history/000001.SZ/1/12": _mk_demo(12)}

def fetch_bars(n=12):
    return _get("/hs/pro/history/000001.SZ/1/%d" % n, default=[])

def calc_factor(bars):
    # bars: 按时间升序的分钟 bar 列表;因子只用 t 时刻及之前的数据(防未来函数)
    out = []
    closes = [_to_float(_hit_key(b, "c", "close")) for b in bars]
    for i, b in enumerate(bars):
        cur = closes[i]
        if i == 0:
            ret = 0.0
        else:
            prev = closes[i-1]
            ret = (cur/prev - 1) if prev else 0.0
        window = closes[max(0, i-5):i]  # 只用历史窗口,不含未来
        ma5 = sum(window)/len(window) if window else cur
        dev = (cur/ma5 - 1) if ma5 else 0.0
        out.append({"t": _hit_key(b, "t", "time"), "ret": round(ret, 4), "dev": round(dev, 4)})
    return out

def run_check():
    bars = fetch_bars()
    fac = calc_factor(bars)
    assert len(fac) == 12
    assert all("ret" in f and "dev" in f for f in fac)
    assert _to_float("1.5") == 1.5 and _to_float("-") is None
    # 防未来函数:第 i 个因子的 dev 不依赖第 i+1 之后的收盘价
    closes = [_to_float(_hit_key(b, "c", "close")) for b in bars]
    for i in range(len(bars)):
        w = closes[max(0, i-5):i]
        ma5 = sum(w)/len(w) if w else closes[i]
        assert abs(fac[i]["dev"] - round((closes[i]/ma5 - 1) if ma5 else 0, 4)) < 1e-9
    print("校验通过")

if __name__ == "__main__":
    run_check()
    for f in calc_factor(fetch_bars()):
        print(f)

代码讲解:① SCAFFOLD 提供字段容错 _hit_key 与带 token 鉴权、重试退避的请求 _get,MOCK 开关让你无需 token 就能验证逻辑;② 本篇导览本周期 14 篇地图(见 §③),并给出当篇技术深入的完整代码(落库 / 因子计算等实质内容,函数命名见代码块);③ 技术深入代码在本地做加工(如落库去重、因子计算与防未来函数),不消耗接口额度;④ run_check() 用断言自检,可放进 CI 持续校验。

⑤ 跑通示例(演示数据)

把上面代码保存为 hf_29.py,MOCK=True 直接跑(Python3 + requests 即可,无需其他依赖)。

预期输出:先打印 校验通过(本篇技术深入的字段容错、取数封装与逻辑自检),随后打印技术深入部分的运行结果(如落库条数 / 因子数组等)。这说明 ①token 鉴权封装可用 ②本篇端点 / 逻辑可跑通 ③关键断言成立。关掉 MOCK、填入真实 token 即可对接生产;把演示写入替换成你的存储即可落地。

⑥ 编号坑

  • 防未来函数是回测生命线:第 i 根 bar 的因子只能用到 i 及之前的数据,绝不能用 i+1 之后的收盘/指标。
  • 因子计算里任何 rolling/window 必须 shift 对齐,窗口右端点不超过当前 bar。
  • 分钟级因子对复权极敏感,回测前统一复权口径,别把不复权价喂给收益率因子。
  • 实时高频数据有延迟与丢包,回测要加滑点/手续费近似,别把理想成交当真实。
  • 因子要横截面标准化(z-score)再入组合,别直接按原始值排序。
  • 管线要可重跑:本地落库后回测只读本地,不反复调接口,省钱也快。
  • MOCK 演示数据虚构,实盘因子要先小样本核对数值与边界。
  • 回测结果不代表实盘,因子要样本外验证再上实盘。

⑦ 小结与下篇预告

回测管线 + 防未来函数是把数据变策略的关键。下一篇 #30 进入实时高频全家桶,用个股资金流向接口算主力净流入与 VWAP。

本篇是《A股分钟级高频数据完全手册》第 29/42 篇。建议按系列顺序读:主推篇把体系与地基搭好,后面的单点篇(如 #02 起)都是换端点、加加工。

下一篇预告:【A股分钟级高频数据完全手册 #30】个股资金流向数据接口:主力净流入与VWAP实战

⑧ 免责声明

本文代码仅用于接口调用与本地数据落库的技术演示,所有示例数据均为演示数据(MOCK 开关开启),不构成任何投资建议。股市有风险,入市需谨慎;实盘使用前请在小资金下充分验证接口稳定性与字段口径。


免费领取证书
数据来自 智兔数服(www.zhituapi.com):零 SDK、纯 GET、免费版即可起步。

领取路径:进入 www.zhituapi.com → 点击「Token服务」→「Token获取」→「免费版」(邮箱验证 3 步即可拿到 token)。

把代码里的 你的token 换成你拿到的真实 token,上面的脚本就能直接拉取 Pro 版分钟级行情、实时盘口与逐笔成交数据,照着本系列 42 篇即可从零搭好属于你自己的分钟级高频数据底座。

想亲自试一下?免费获取证书