从数据获取到策略回测全指南,零基础搭建分钟级量化系统
最近在知乎看到很多朋友在问"如何获取A股历史分笔数据"、"哪里能下载完整的日内行情"。作为经历过数据荒的老量化人,今天想分享一套自己正在用的解决方案,或许能帮你少走弯路。
高频数据获取的正确姿势
很多新手会从Tushare、AKShare等开源库起步,但实盘时会发现两个致命问题:一是行情延迟高,二是分钟数据颗粒度不足。去年做日内统计套利时,我发现真正有效的策略需要至少包含每分钟均价和成交量分布的数据。
这里分享一个亲测可用的HTTP接口模板:
# 获取平安银行近30日分时数据(示例代码)
end_date = datetime.now().strftime("%Y-%m-%d")
api_url = f"http://[服务器地址]/sql?mode=minute&code=000001&end_day={end_date}&limit=30&token=[你的令牌]"
返回的JSON数据结构很有意思:不仅包含每分钟的价量信息,还有前日收盘价作为基准参考。这对于计算日内相对收益率特别有用,比单纯看K线更直观。
历史数据批量获取方案
做策略回测最头疼的就是数据清洗。有次为了测试跨年周期策略,我整理了2008年至今的A股全市场数据包(含主板/科创板/创业板),发现几个关键点:
- 数据必须包含集合竞价阶段(很多免费数据源会缺失开盘前5分钟)
 - 指数数据需要和个股保持时间戳对齐
 - 复权处理要提供多套方案(前复权/后复权)
 
通过下面的下载模板可以直接获取整年数据:
http://jvquant.com/query/history?stamp=[时间戳]&token=[账户Token]&year=[年份].zip
实测2020年全市场数据约1.2G,包含6000+标的的分钟级行情。建议用wget命令后台下载,避免网络波动中断。
实战:搭建本地回测系统
有了高质量数据后,建议采用分层架构:
- 数据层:使用ClickHouse存储分钟数据
 - 计算层:用C++开发核心算法
 - 展示层:Python+Dash构建可视化面板
 
重点说下数据预处理技巧。将下载的ZIP包解压后,可以用Pandas做快速清洗:
# 读取单日分时数据示例
df = pd.read_parquet('20230105.parquet')
df['vwap'] = df['成交额'] / df['成交量'] # 计算量价均值
对于Tick级策略,建议把数据按交易日拆分成多个Parquet文件,读取效率比CSV快20倍以上。
进阶:实时行情对接
当策略需要实盘运行时,WebSocket接口的稳定性至关重要。建议在服务器部署双网卡,分别连接交易所和风控系统。这里有个避坑经验:务必验证时区参数,曾经因为UTC时间配置错误导致早盘交易异常。
高频交易者可以关注Level2行情中的订单薄变化,不过要注意不同市场的推送频率差异。沪深的Level2数据每秒推送3次,而港股通的推送频率可能达到10次/秒。
#!python3
# -*- coding:utf-8 -*-
import time
import websocket
import zlib
# 发送订阅
def on_open(ws):
    ws.send("all=lv2_600519,lv1_000001")
# 接收推送
def on_message(ws, message, type, flag):
    # 命令返回文本消息
    if type == websocket.ABNF.OPCODE_TEXT:
        print(time.strftime('%H:%M:%S', time.localtime(time.time())), "Text响应:", message)
    # 行情推送压缩二进制消息,在此解压缩
    if type == websocket.ABNF.OPCODE_BINARY:
        rb = zlib.decompress(message, -zlib.MAX_WBITS)
        print(time.strftime('%H:%M:%S', time.localtime(time.time())), "Binary响应:", rb.decode("utf-8"))
def on_error(ws, error):
    print(error)
def on_close(ws, code, msg):
    print(time.strftime('%H:%M:%S', time.localtime(time.time())), "连接已断开")
wsUrl = "ws://<服务器地址>/?token=<jvQuant token>"
ws = websocket.WebSocketApp(wsUrl,
                            on_open=on_open,
                            on_data=on_message,
                            on_error=on_error,
                            on_close=on_close)
ws.run_forever()
历史数据福利
需要2008年至今全市场历史行情的朋友,可以直接访问:
→ A股全历史分钟数据下载页
这个数据源最实用的地方在于支持按自然日下载,回测小周期策略时不用每次都加载全年数据。最近他们好像新增了盘口快照回放功能,下次再和大家分享如何利用Level2数据捕捉主力资金动向。
                    
                
                
            
        
浙公网安备 33010602011771号