一、免费行情数据 API 的优势与缺点
1.1 核心优势
- 接入成本低:无需高额预算,个人开发者、量化学习者、小型项目可零成本完成行情对接,适用于技术验证、策略原型开发、教学实训等场景。
- 跨语言兼容:主流免费行情 API 均提供标准 REST、WebSocket 接口,适配 Python、Java、Go 等主流开发语言,技术门槛低。
- 接口标准化:统一 JSON 数据格式,字段定义规范,无需额外做复杂数据格式适配,可快速完成数据解析与业务开发。
- 场景适配灵活:同时支持历史 K 线、实时 Tick、盘口数据,兼顾历史回测、实时盯盘、简易行情看板等多样化需求。
1.2 现存缺点
- 调用限制:多数免费版本存在 QPS、单日调用频次限制,高频压测、全市场批量订阅易触发限流。
- 无官方 SLA 保障:不提供企业级稳定性承诺,高峰时段可能出现连接波动、数据延迟,不建议直接用于生产级实盘交易。
- 高级功能受限:深度逐笔数据、机构盘口、毫秒级高精度行情等增值能力,通常仅对付费版本开放。
- 技术支持薄弱:免费用户一般无专属技术运维,接口异常、报错问题需开发者自行排查。
补充说明:本文示例所用接口提供7 天全功能免费试用,试用期间开放全市场数据访问权限,同时支持 WebSocket 高并发压测,可满足全流程技术验证与压力测试需求。
二、Python 实战:获取并解析行情数据
本章节为核心实战内容,基于长连接 WebSocket 与短连接 REST 两种主流方式,实现实时行情订阅与历史 K 线查询,包含环境配置、完整代码、字段解析、异常处理,代码可直接运行调试。
2.1 环境准备
- 运行环境:Python 3.7 及以上版本
- 依赖库安装
bash
# WebSocket长连接、JSON解析、网络请求依赖
pip install websocket-client requests json
- 前置准备:注册账号并申请专属
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
代码说明
- 采用异步线程运行 WebSocket,避免长连接阻塞主线程;
- 内置异常捕获,规避脏数据、报文格式错误导致程序崩溃;
- 统一解析价格、成交量、买卖盘、时间戳等核心字段,适配后续数据分析、策略计算;
- 支持多标的批量订阅,修改
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)
代码说明
- 增加超时时间配置,防止接口无响应导致程序挂起;
- 校验接口返回状态码,区分正常数据与异常提示;
- 标准化解析 K 线核心字段,可直接用于量化回测、指标计算。
三、Java 实战:前端实时动态看板
本章节基于 Java 实现后端行情服务,结合 WebSocket 向前端推送实时数据,搭建前后端联动的动态行情看板。技术栈:Java 8 + SpringBoot + WebSocket + Maven,实现后端数据转发、前端可视化展示全流程。
3.1 环境与项目配置
- 运行环境:JDK 8+、Maven 3.6+
- 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 项目运行与效果验证
- 启动 SpringBoot Java 项目,后端自动连接行情 API 并完成标的订阅;
- 打开 HTML 前端页面,页面自动连接 Java 后端 WebSocket;
- 看板表格持续动态刷新价格、成交量等数据,实现实时可视化效果。
四、常见问题 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 线 / 盘口)返回字段存在差异,按照官方文档解析对应字段;过滤心跳包、应答包等非行情报文,只处理tick、kline类型数据。
五、总结
本文分别基于 Python、Java 两大主流开发语言,完成免费行情数据 API 的全流程接入,覆盖实时数据采集、历史数据查询、前后端动态看板三大典型场景,代码可直接用于学习、原型开发、策略验证。
本次示例所使用的接口拥有 7 天全功能免费试用权益,试用阶段无功能阉割,支持全市场数据访问与 WebSocket 压测,是开发者做技术验证、压力测试的优选方案。
免费行情 API 适用于学习研究、项目原型、非核心业务场景;若需落地企业级实盘交易、高并发生产系统,建议评估付费版本,获取更高稳定性、专属技术支持与完整高级数据能力。
参考文档:https://apis.alltick.co/
GitHub:https://github.com/alltick/alltick-realtime-forex-crypto-stock-tick-finance-websocket-api
