2026 免费行情数据 API 接入指南(Python/Java)

一、免费行情数据 API 的优势与缺点

1.1 核心优势

  1. 接入成本低:无需高额预算,个人开发者、量化学习者、小型项目可零成本完成行情对接,适用于技术验证、策略原型开发、教学实训等场景。
  2. 跨语言兼容:主流免费行情 API 均提供标准 REST、WebSocket 接口,适配 Python、Java、Go 等主流开发语言,技术门槛低。
  3. 接口标准化:统一 JSON 数据格式,字段定义规范,无需额外做复杂数据格式适配,可快速完成数据解析与业务开发。
  4. 场景适配灵活:同时支持历史 K 线、实时 Tick、盘口数据,兼顾历史回测、实时盯盘、简易行情看板等多样化需求。

1.2 现存缺点

  1. 调用限制:多数免费版本存在 QPS、单日调用频次限制,高频压测、全市场批量订阅易触发限流。
  2. 无官方 SLA 保障:不提供企业级稳定性承诺,高峰时段可能出现连接波动、数据延迟,不建议直接用于生产级实盘交易。
  3. 高级功能受限:深度逐笔数据、机构盘口、毫秒级高精度行情等增值能力,通常仅对付费版本开放。
  4. 技术支持薄弱:免费用户一般无专属技术运维,接口异常、报错问题需开发者自行排查。

补充说明:本文示例所用接口提供7 天全功能免费试用,试用期间开放全市场数据访问权限,同时支持 WebSocket 高并发压测,可满足全流程技术验证与压力测试需求。

二、Python 实战:获取并解析行情数据

本章节为核心实战内容,基于长连接 WebSocket 与短连接 REST 两种主流方式,实现实时行情订阅历史 K 线查询,包含环境配置、完整代码、字段解析、异常处理,代码可直接运行调试。

2.1 环境准备

  1. 运行环境:Python 3.7 及以上版本
  2. 依赖库安装

bash

# WebSocket长连接、JSON解析、网络请求依赖
pip install websocket-client requests json
  1. 前置准备:注册账号并申请专属token,接口请求、订阅均需携带身份凭证。

2.2 实战一:WebSocket 实时行情订阅(主流实时方案)

该方案采用服务端主动推送模式,低延迟持续获取盘口价格、成交量、逐笔成交等实时数据,适用于量化策略、实时监控系统。

完整可运行代码

python

import websocket
import json
import threading

# 基础配置
WS_URL = "wss://api.alltick.co/stock"  # 行情WebSocket接口地址
TOKEN = "your_token"  # 替换为个人申请的token
# 订阅标的列表,可按需添加全市场标的
SYMBOL_LIST = ["600036.SS", "000001.SZ", "AAPL.US"]

# 全局变量:存储最新行情数据
latest_market_data = {}

def on_open(ws):
    """连接建立成功回调:发送订阅指令"""
    print("WebSocket连接建立成功,开始订阅行情...")
    # 构造订阅报文
    sub_msg = {
        "token": TOKEN,
        "action": "subscribe",
        "symbols": SYMBOL_LIST
    }
    ws.send(json.dumps(sub_msg))

def on_message(ws, message):
    """接收行情数据回调:数据解析与存储"""
    try:
        data = json.loads(message)
        # 过滤有效Tick行情数据
        if "tick" in data:
            tick_info = data["tick"]
            symbol = tick_info.get("symbol")
            latest_market_data[symbol] = {
                "price": tick_info.get("price"),
                "volume": tick_info.get("volume"),
                "timestamp": tick_info.get("timestamp"),
                "bid_price": tick_info.get("bid_price"),
                "ask_price": tick_info.get("ask_price")
            }
            # 打印解析后的标准化行情数据
            print(f"【{symbol}】时间戳:{tick_info['timestamp']} "
                  f"最新价:{tick_info['price']} 成交量:{tick_info['volume']}")
    except Exception as e:
        print(f"数据解析异常:{str(e)}")

def on_error(ws, error):
    """连接异常回调"""
    print(f"WebSocket通信异常:{str(error)}")

def on_close(ws, close_code, close_msg):
    """连接关闭回调"""
    print(f"WebSocket连接关闭,状态码:{close_code} 描述:{close_msg}")

def run_websocket():
    """启动WebSocket长连接"""
    ws_app = websocket.WebSocketApp(
        url=WS_URL,
        on_open=on_open,
        on_message=on_message,
        on_error=on_error,
        on_close=on_close
    )
    # 永久运行长连接,自动重连
    ws_app.run_forever(reconnect=5)

if __name__ == "__main__":
    # 子线程启动长连接,不阻塞主线程
    thread = threading.Thread(target=run_websocket, daemon=True)
    thread.start()
    # 主线程持续运行,维持程序进程
    while True:
        pass

代码说明

  1. 采用异步线程运行 WebSocket,避免长连接阻塞主线程;
  2. 内置异常捕获,规避脏数据、报文格式错误导致程序崩溃;
  3. 统一解析价格、成交量、买卖盘、时间戳等核心字段,适配后续数据分析、策略计算;
  4. 支持多标的批量订阅,修改SYMBOL_LIST即可扩展监控范围。

2.3 实战二:REST 接口查询历史 K 线数据

短连接 REST 适用于历史数据拉取、策略回测场景,按需单次请求指定周期 K 线,无需维持长连接。

完整可运行代码

python

import requests
import json

# 基础配置
REST_URL = "https://api.alltick.co/stock/kline"
TOKEN = "your_token"  # 替换为个人token

def get_history_kline(symbol, kline_type=1, count=20):
    """
    查询历史K线数据
    :param symbol: 证券代码
    :param kline_type: K线类型 1-日线 2-周线 3-月线
    :param count: 获取K线数量
    :return: 解析后的K线列表
    """
    params = {
        "token": TOKEN,
        "symbol": symbol,
        "kline_type": kline_type,
        "count": count
    }
    try:
        response = requests.get(REST_URL, params=params, timeout=10)
        result = response.json()
        if result.get("code") == 200:
            kline_data = result.get("data", [])
            print(f"【{symbol}】历史K线数据查询成功,共{len(kline_data)}条")
            # 遍历解析K线:开盘价、收盘价、最高价、最低价、成交量
            for line in kline_data:
                time_stamp = line.get("ts")
                open_p = line.get("open")
                close_p = line.get("close")
                high_p = line.get("high")
                low_p = line.get("low")
                vol = line.get("volume")
                print(f"时间:{time_stamp} 开:{open_p} 收:{close_p} 高:{high_p} 低:{low_p} 量:{vol}")
            return kline_data
        else:
            print(f"接口请求失败:{result.get('msg')}")
            return []
    except requests.exceptions.RequestException as e:
        print(f"网络请求异常:{str(e)}")
        return []

if __name__ == "__main__":
    # 查询单只证券20条日线数据
    get_history_kline(symbol="600036.SS", kline_type=1, count=20)

代码说明

  1. 增加超时时间配置,防止接口无响应导致程序挂起;
  2. 校验接口返回状态码,区分正常数据与异常提示;
  3. 标准化解析 K 线核心字段,可直接用于量化回测、指标计算。

三、Java 实战:前端实时动态看板

本章节基于 Java 实现后端行情服务,结合 WebSocket 向前端推送实时数据,搭建前后端联动的动态行情看板。技术栈:Java 8 + SpringBoot + WebSocket + Maven,实现后端数据转发、前端可视化展示全流程。

3.1 环境与项目配置

  1. 运行环境:JDK 8+、Maven 3.6+
  2. Maven 核心依赖(pom.xml)

xml

<!-- SpringBoot 基础依赖 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.15</version>
</parent>

<dependencies>
    <!-- WebSocket 依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>
    <!-- HTTP 请求依赖,调用行情API -->
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
    </dependency>
    <!-- JSON 解析依赖 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.83</version>
    </dependency>
    <!-- 前端页面依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

3.2 实战步骤 1:Java 后端对接行情 API + 转发 WebSocket

实现 Java 后端连接行情 API、接收实时数据,并通过内置 WebSocket 将数据推送到前端页面,完成数据中转。

3.2.1 WebSocket 配置类

java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

/**
 * WebSocket 开启配置
 */
@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

3.2.2 行情 API 连接与消息转发核心类

java

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import org.springframework.stereotype.Component;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 行情看板WebSocket服务端 + 对接第三方行情API
 */
@Component
@ServerEndpoint("/market/board")
public class MarketBoardWebSocket {
    // 行情API地址与Token
    private static final String API_WS_URL = "wss://api.alltick.co/stock";
    private static final String TOKEN = "your_token"; // 替换为个人token
    // 存储前端连接会话
    private static final ConcurrentHashMap<String, Session> SESSION_MAP = new ConcurrentHashMap<>();
    // 第三方行情API客户端
    private static WebSocketClient apiClient;

    static {
        // 初始化并连接行情API
        initMarketApiClient();
    }

    /**
     * 初始化行情API WebSocket客户端
     */
    private static void initMarketApiClient() {
        try {
            URI uri = new URI(API_WS_URL);
            apiClient = new WebSocketClient(uri) {
                @Override
                public void onOpen(ServerHandshake handshakedata) {
                    // 连接成功,发送订阅指令
                    JSONObject subMsg = new JSONObject();
                    subMsg.put("token", TOKEN);
                    subMsg.put("action", "subscribe");
                    subMsg.put("symbols", new String[]{"600036.SS", "000001.SZ"});
                    this.send(subMsg.toJSONString());
                    System.out.println("Java后端已连接行情API,完成标的订阅");
                }

                @Override
                public void onMessage(String message) {
                    // 接收行情数据,转发至所有前端看板
                    forwardDataToFront(message);
                }

                @Override
                public void onClose(int code, String reason, boolean remote) {
                    System.out.println("行情API连接关闭,准备重连");
                    reconnect();
                }

                @Override
                public void onError(Exception ex) {
                    ex.printStackTrace();
                }
            };
            apiClient.connect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 数据转发:推送给所有在线前端页面
     */
    private static void forwardDataToFront(String data) {
        SESSION_MAP.forEach((id, session) -> {
            try {
                if (session.isOpen()) {
                    session.getBasicRemote().sendText(data);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    }

    /**
     * 重连机制
     */
    private static void reconnect() {
        try {
            Thread.sleep(3000);
            initMarketApiClient();
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }

    // ========== 前端WebSocket回调 ==========
    @OnOpen
    public void onOpen(Session session) {
        SESSION_MAP.put(session.getId(), session);
        System.out.println("前端看板接入,当前在线数:" + SESSION_MAP.size());
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        // 前端无上行数据,无需处理
    }

    @OnClose
    public void onClose(Session session) {
        SESSION_MAP.remove(session.getId());
        System.out.println("前端看板断开,当前在线数:" + SESSION_MAP.size());
    }
}

3.3 实战步骤 2:前端动态看板页面

编写简单 HTML 页面,连接 Java 后端 WebSocket,实时渲染行情数据,实现动态刷新看板效果。

html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>实时行情动态看板</title>
    <style>
        table {width: 80%; margin: 50px auto; border-collapse: collapse;}
        th,td {border: 1px solid #ccc; padding: 10px; text-align: center;}
        th {background-color: #f5f5f5;}
    </style>
</head>
<body>
    <h2 style="text-align: center">股票实时行情看板</h2>
    <table>
        <tr>
            <th>证券代码</th>
            <th>最新价格</th>
            <th>成交量</th>
            <th>买一价</th>
            <th>卖一价</th>
            <th>更新时间</th>
        </tr>
        <tbody id="marketTable"></tbody>
    </table>

    <script>
        // 连接Java后端WebSocket
        let ws = new WebSocket("ws://localhost:8080/market/board");
        const tableDom = document.getElementById("marketTable");
        // 缓存行情数据
        let marketCache = {};

        ws.onmessage = function (event) {
            let data = JSON.parse(event.data);
            if (data.tick) {
                let tick = data.tick;
                marketCache[tick.symbol] = tick;
                // 刷新页面表格
                refreshTable();
            }
        };

        // 刷新看板表格
        function refreshTable() {
            tableDom.innerHTML = "";
            for (let key in marketCache) {
                let item = marketCache[key];
                let tr = document.createElement("tr");
                tr.innerHTML = `
                    <td>${item.symbol}</td>
                    <td>${item.price}</td>
                    <td>${item.volume}</td>
                    <td>${item.bid_price}</td>
                    <td>${item.ask_price}</td>
                    <td>${item.timestamp}</td>
                `;
                tableDom.appendChild(tr);
            }
        }
    </script>
</body>
</html>

3.4 项目运行与效果验证

  1. 启动 SpringBoot Java 项目,后端自动连接行情 API 并完成标的订阅;
  2. 打开 HTML 前端页面,页面自动连接 Java 后端 WebSocket;
  3. 看板表格持续动态刷新价格、成交量等数据,实现实时可视化效果。

四、常见问题 FAQ

Q1:调用接口返回权限错误、鉴权失败?

A1:检查token是否填写正确,确认账号状态正常;免费试用期间 token 有效期为 7 天,过期需重新申请。同时核对接口地址、请求报文格式,避免参数缺失。

Q2:WebSocket 连接频繁断开、重连失败?

A2:1. 检查本地网络环境,公网波动会导致长连接中断;2. 控制订阅标的数量,全市场批量订阅易触发免费版限流;3. 代码增加自动重连逻辑,参考文中 Java/Python 示例。

Q3:免费试用期间可以进行压测吗?

A3:7 天全功能免费试用阶段,完全支持 WebSocket 并发压测、全市场数据测试,可用于接口性能验证、系统压力评估;试用结束后将恢复免费版基础调用限制。

Q4:REST 接口查询历史数据返回空数据?

A4:核对证券代码格式(区分沪深、美股市场代码规则)、K 线类型参数;同时检查调用频次,短时间高频请求会触发限流,建议增加本地数据缓存。

Q5:数据解析出现字段缺失?

A5:不同数据类型(Tick/K 线 / 盘口)返回字段存在差异,按照官方文档解析对应字段;过滤心跳包、应答包等非行情报文,只处理tickkline类型数据。

五、总结

本文分别基于 Python、Java 两大主流开发语言,完成免费行情数据 API 的全流程接入,覆盖实时数据采集、历史数据查询、前后端动态看板三大典型场景,代码可直接用于学习、原型开发、策略验证。

本次示例所使用的接口拥有 7 天全功能免费试用权益,试用阶段无功能阉割,支持全市场数据访问与 WebSocket 压测,是开发者做技术验证、压力测试的优选方案。

免费行情 API 适用于学习研究、项目原型、非核心业务场景;若需落地企业级实盘交易、高并发生产系统,建议评估付费版本,获取更高稳定性、专属技术支持与完整高级数据能力。

参考文档:https://apis.alltick.co/
GitHub:https://github.com/alltick/alltick-realtime-forex-crypto-stock-tick-finance-websocket-api

0
0
0
0
评论
未登录
暂无评论