:指数分时数据解析与清洗)
A股量化数据工程从 REST 接口到策略信号第 2 篇指数分时数据解析与清洗前言第 1 篇接好了指数列表与实时行情但实时只给「当前快照」。要做择时、算分时均线必须拿到连续的分时序列。本篇用hsindex/latest最新分时与hsindex/history历史分时拉取序列并讲解分时数据最常见的清洗动作缺值补齐、按时间排序、与分时 MA 对齐。一、接口原始字段梳理1指数最新分时接口接口地址https://api.biyingapi.com/hsindex/latest/{指数代码.市场}/{级别}/{LICENCE}?lt{数量}字段说明t时间o开h高l低c收该分钟 / 该级别收盘v成交量a成交额元 ¥pc涨跌幅2指数历史分时接口接口地址https://api.biyingapi.com/hsindex/history/{指数代码.市场}/{级别}/{LICENCE}?st{start}et{end}字段同最新分时按st/et区间返回。3指数分时 MA 接口接口地址https://api.biyingapi.com/hsindex/history/ma/{指数代码.市场}/{级别}/{LICENCE}?st{start}et{end}字段说明t时间ma3, ma5, ma10, ma15, ma20, ma30, ma60, ma120, ma200, ma250各周期均线缺数据周期为null提示级别参数level取d日线级分时等三个接口必须一致否则序列对不齐。二、自研衍生统计指标分时缺口识别相邻两根t间隔异常如跨午休、停牌标记为缺口避免均线计算串段。MA 回填接口给的ma*在序列头部为null用本地滑动窗口重算ma5/ma10补齐前段保证全序列可用。量价背离轻量pc创新高但v未放大记一次背离信号。以上指标接口不会直接返回全部基于原始字段业务代码运算。三、数据表设计CREATETABLEIFNOTEXISTSindex_minute(dmTEXT,tTEXT,oREAL,hREAL,lREAL,cREAL,vREAL,aREAL,pcREAL,ma5REAL,ma10REAL,PRIMARYKEY(dm,t));四、完整代码importrequestsimportsqlite3importtime LICENCEYOUR_LICENCEBASEhttps://api.biyingapi.comDB_PATHquant.dbdefbiying_api_get_retry(url,timeout15,max_retry3):foriinrange(max_retry):try:rrequests.get(url,timeouttimeout)r.raise_for_status()returnr.json()exceptExceptionase:ifimax_retry-1:raisetime.sleep(1i)deffetch_index_latest(code,market,leveld,lt5):最新分时t/o/h/l/c/v/a/pc。urlf{BASE}/hsindex/latest/{code}.{market}/{level}/{LICENCE}?lt{lt}databiying_api_get_retry(url)returndata.get(data,[])ifisinstance(data,dict)else[]deffetch_index_history(code,market,level,st,et):历史分时区间st/et 为 YYYYMMDD。urlf{BASE}/hsindex/history/{code}.{market}/{level}/{LICENCE}?st{st}et{et}databiying_api_get_retry(url)returndata.get(data,[])ifisinstance(data,dict)else[]deffetch_index_ma(code,market,level,st,et):分时 MAt/ma3..ma250。urlf{BASE}/hsindex/history/ma/{code}.{market}/{level}/{LICENCE}?st{st}et{et}databiying_api_get_retry(url)returndata.get(data,[])ifisinstance(data,dict)else[]deffill_ma_local(rows,windows(5,10)):接口 MA 头部为 null 时本地滑动窗口补齐 ma5/ma10。closes[r.get(c)forrinrows]forwinwindows:keyfma{w}fori,rinenumerate(rows):ifr.get(key)isNoneandi1w:segcloses[i1-w:i1]ifall(xisnotNoneforxinseg):r[key]round(sum(seg)/w,4)returnrowsdefdetect_gap(rows,max_gap_sec3600):相邻 t 间隔超阈值记为缺口返回缺口索引列表。gaps[]foriinrange(1,len(rows)):try:t0time.mktime(time.strptime(rows[i-1][t],%Y-%m-%d %H:%M:%S))t1time.mktime(time.strptime(rows[i][t],%Y-%m-%d %H:%M:%S))ift1-t0max_gap_sec:gaps.append(i)exceptException:passreturngapsdefsave_minute(dm,rows):cols[dm,t,o,h,l,c,v,a,pc,ma5,ma10]consqlite3.connect(DB_PATH)forrinrows:r[dm]dm vals[r.get(c)forcincols]ph,.join(?*len(cols))con.execute(fINSERT OR REPLACE INTO index_minute({,.join(cols)}) VALUES({ph}),vals)con.commit();con.close()if__name____main__:code,market,level000001,SH,d# 拉最近 5 根最新分时latestfetch_index_latest(code,market,level,lt5)latestfill_ma_local(latest)save_minute(f{code}.{market},latest)print(f最新分时{len(latest)}根缺口索引:,detect_gap(latest))print(首根:,latest[0]iflatestelseNone)五、关键业务说明级别参数一致性latest/history/history/ma的level必须一致否则序列对不齐。时间格式t多为YYYY-MM-DD HH:MM:SS排序前统一转时间戳跨午休自然形成缺口属正常不是脏数据。MA 双来源优先用接口ma*头部null用本地fill_ma_local补齐二者可交叉校验。六、拓展练习用fetch_index_history拉一整天分时画c的分钟走势标出缺口位置。把ma5/ma10本地计算结果与接口ma5/ma10对比验证一致性。对pc与v做量价背离统计输出背离次数。下篇预告A股量化数据工程从 REST 接口到策略信号第 3 篇指数技术指标自研MA、KDJ、BOLL、MACD下一篇基于本篇的分时序列手算 KDJ / BOLL / MACD接口也提供hsindex/history/kdj等可作对照把「数据」推进到「信号」。免责申明本篇全部代码、接口调用仅作为量化编程学习演示仅为数据演示不构成投资建议。市场有风险投资需谨慎。