API 开发者文档
如需美股历史行情回放与复盘工具,欢迎访问 ReplayEdge,让市场研究与交易复盘更加直观高效。
Market Data API 为开发者提供专业、稳定的美股市场数据服务,覆盖历史 K 线、逐笔成交、实时报价和市场快照等内容。您可以通过 REST API 查询历史数据,也可以通过 WebSocket 实时订阅行情,快速将市场数据接入量化研究、行情展示和交易分析等应用。
需要更便宜的 Massive 官方数据?欢迎访问 www.massiveprivateserver.site 拼车,$45/月 享官方全量 API 与 Flatfile 下载。
如有相关问题、服务咨询或购买需求,请联系:general.kim.vpn@gmail.com
鉴权说明
API 使用私有密钥进行鉴权。REST 请求需在 Header 中包含 X-API-KEY,WebSocket 需在连接后发送认证 JSON 包。
# REST Header 示例
headers = { "X-API-KEY": "bc_xxxxxxxxxxxx" }
# WebSocket 认证包示例
auth_payload = { "key": "bc_xxxxxxxxxxxx" }
Part 1. 历史数据查询 (REST API)
Base URL:
http://bcprivateserver.site/api/v1股票接口系列 (Stocks)
股票:历史 K 线 (Bars)
GET
/market/stocks/bars
请求参数
| 参数名 | 必填 | 描述与格式 |
|---|---|---|
| tickers | 是 | 股票代码列表,逗号分隔 (如: AAPL,TSLA) |
| interval | 是 |
支持的聚合跨度格式: • [1-59]Min (分钟)• [1-23]Hour (小时)• 1Day (天)• 1Week (周)• [1-12]Month (月)
|
| start_time | 否 | 起始时间。过滤等于或晚于此时间的数据 (RFC-3339 格式) |
| end_time | 否 | 结束时间。过滤等于或早于此时间的数据 (RFC-3339 格式) |
| max_rows | 否 | 返回条数限制 (默认 1000, 最大 10000) |
| price_adjust | 否 | 复权调整类型。可选值: raw (默认), split, dividend, all |
| page_token | 否 | 分页凭证。用于获取下一页数据 |
| data_feed | 否 | 数据源。可选值: iex, sip, boats, otc |
| order | 否 | 排序方式。可选值: asc (默认升序), desc (降序) |
响应数据结构 (Bars Schema)
| Attribute | Type | Description |
|---|---|---|
| t | date-time | 时间戳 (RFC-3339 格式,纳秒精度) |
| o | double | 开盘价 |
| h | double | 最高价 |
| l | double | 最低价 |
| c | double | 收盘价 |
| v | int64 | 成交量 |
| n | int64 | 该 K 线内的成交笔数 |
| vw | double | 成交量加权平均价 (VWAP) |
股票:最新 K 线 (Latest Bars)
GET
/market/stocks/bars/latest
获取指定股票当前交易日(或最近一个交易日)的最新一根分钟级 K 线数据。
请求参数
| 参数名 | 必填 | 描述与格式 |
|---|---|---|
| tickers | 是 | 股票代码列表,逗号分隔 |
| data_feed | 否 | 数据源 (如: iex, sip, boats, otc) |
股票:历史逐笔成交 (Trades)
GET
/market/stocks/trades
请求参数
| 参数名 | 必填 | 描述与格式 |
|---|---|---|
| tickers | 是 | 股票代码列表,逗号分隔 |
| start_time | 否 | 起始时间 (RFC-3339 格式) |
| end_time | 否 | 结束时间 (RFC-3339 格式) |
| max_rows | 否 | 单次最大请求量 (默认 1000, 最大 10000) |
| page_token | 否 | 分页凭证 |
| data_feed | 否 | 数据源 (如: iex, sip, boats, otc) |
| order | 否 | 排序方式 (asc 或 desc) |
响应数据结构 (Trades Schema)
| Attribute | Type | Description |
|---|---|---|
| t | date-time | 时间戳 (纳秒精度) |
| x | string | 交易所代码 (可通过 Meta 接口查询) |
| p | double | 成交价格 |
| s | int64 | 成交数量 |
| c | array(string) | 成交条件集合 (可通过 Meta 接口查询) |
| i | int64 | 交易记录的系统唯一标识 ID |
| z | string | Tape (如: A, B, C) |
股票:最新成交 (Latest Trades)
GET
/market/stocks/trades/latest
获取指定股票的全市场最新一笔成交记录。
请求参数
| 参数名 | 必填 | 描述与格式 |
|---|---|---|
| tickers | 是 | 股票代码列表,逗号分隔 |
| data_feed | 否 | 数据源 (如: iex, sip, boats, otc) |
股票:历史逐笔报价 (Quotes)
GET
/market/stocks/quotes
获取历史全市场最优买卖报价(NBBO)的变动记录。
请求参数
| 参数名 | 必填 | 描述与格式 |
|---|---|---|
| tickers | 是 | 股票代码列表,逗号分隔 |
| start_time | 否 | 起始时间 (RFC-3339 格式) |
| end_time | 否 | 结束时间 (RFC-3339 格式) |
| max_rows | 否 | 单次最大请求量 (默认 1000, 最大 10000) |
| page_token | 否 | 分页凭证 |
| data_feed | 否 | 数据源 (如: iex, sip, boats, otc) |
| order | 否 | 排序方式 (asc 或 desc) |
响应数据结构 (Quotes Schema)
| Attribute | Type | Description |
|---|---|---|
| t | date-time | 时间戳 (纳秒精度) |
| ax | string | 卖方 (Ask) 交易所代码 |
| ap | double | 卖出价 (Ask Price) |
| as | int64 | 卖出数量 (Ask Size) |
| bx | string | 买方 (Bid) 交易所代码 |
| bp | double | 买入价 (Bid Price) |
| bs | int64 | 买入数量 (Bid Size) |
| c | array(string) | 报价条件集合 |
| z | string | Tape |
股票:最新报价 (Latest Quotes)
GET
/market/stocks/quotes/latest
获取指定股票全市场实时的最新最优买卖报价(NBBO)。
请求参数
| 参数名 | 必填 | 描述与格式 |
|---|---|---|
| tickers | 是 | 股票代码列表,逗号分隔 |
| data_feed | 否 | 数据源 (如: iex, sip, boats, otc) |
股票:集合竞价 (Auctions)
GET
/market/stocks/auctions
检索指定股票每日的开盘竞价 (Open Auction) 与 收盘竞价 (Closing Auction) 数据。
请求参数
| 参数名 | 必填 | 描述与格式 |
|---|---|---|
| tickers | 是 | 股票代码列表,逗号分隔 |
| start_time | 否 | 起始时间 (RFC-3339 格式) |
| end_time | 否 | 结束时间 (RFC-3339 格式) |
| max_rows | 否 | 限制返回天数 (默认 1000) |
| page_token | 否 | 分页凭证 |
| data_feed | 否 | 数据源 (如: iex, sip, boats, otc) |
| order | 否 | 排序方式 (asc 或 desc) |
股票:市场快照 (Snapshots)
GET
/market/stocks/snapshots一次性获取包含最新成交、最新报价、分钟线、当日线、前一日线在内的全景快照数据。
请求参数
| 参数名 | 必填 | 描述与格式 |
|---|---|---|
| tickers | 是 | 股票代码列表,逗号分隔(若已在 URL 路径中指定 ticker 则可忽略此参数) |
| data_feed | 否 | 数据源 (如: iex, sip, boats, otc) |
股票:元数据字典 (Meta Conditions & Exchanges)
GET
/market/stocks/meta/exchanges
分页处理 (Next Page Token)
当单次查询结果超过 max_rows 时,响应体中会包含 next_page_token。将此值作为下一次请求的 page_token 参数即可获取后续数据。
Python REST 实例代码
1. 获取股票历史 K 线
import requests
url = "http://bcprivateserver.site/api/v1/market/stocks/bars"
headers = { "X-API-KEY": "YOUR_API_KEY" }
params = {
"tickers": ["QQQ", "AAPL"], #可以一次请求多个股票代码
"interval": "1Day",
"start_time": "2016-01-01T00:00:00Z"
}
response = requests.get(url, headers=headers, params=params)
print(response.json())
Part 2. 实时数据流 (WebSocket API)
Stream URL:
ws://bcprivateserver.site/streamWebSocket 接入说明
股票实时 K 线推送结构 (Bars - "b")
| Attribute | Type | Description |
|---|---|---|
| T | string | 消息类型,始终为 "b" (Bar) |
| S | string | 股票代码 |
| o | number | 开盘价 |
| h | number | 最高价 |
| l | number | 最低价 |
| c | number | 收盘价 |
| v | int | 成交量 |
| vw | number | 成交量加权平均价 (VWAP) |
| n | int | 该 K 线内的成交笔数 |
| t | string | 时间戳 (RFC-3339 格式) |
股票实时成交推送结构 (Trades - "t")
| Attribute | Type | Description |
|---|---|---|
| T | string | 消息类型,始终为 "t" (Trade) |
| S | string | 股票代码 |
| i | int | 交易 ID |
| x | string | 发生交易的交易所代码 |
| p | number | 成交价格 |
| s | int | 成交数量 |
| c | array(string) | 交易条件 |
| t | string | 时间戳 (RFC-3339 格式,纳秒精度) |
| z | string | Tape |
股票实时报价推送结构 (Quotes - "q")
| Attribute | Type | Description |
|---|---|---|
| T | string | 消息类型,始终为 "q" (Quote) |
| S | string | 股票代码 |
| ax | string | 卖方 (Ask) 交易所代码 |
| ap | number | 卖出价 (Ask Price) |
| as | int | 卖出量 (Ask Size,以整手为单位) |
| bx | string | 买方 (Bid) 交易所代码 |
| bp | number | 买入价 (Bid Price) |
| bs | int | 买入量 (Bid Size,以整手为单位) |
| c | array(string) | 报价条件 |
| t | string | 时间戳 (RFC-3339 格式,纳秒精度) |
| z | string | Tape |
WebSocket 实时订阅实例代码
import asyncio
import websockets
import json
from datetime import datetime
# ================= 配置区 =================
WS_URL = "ws://bcprivateserver.site/stream"
MY_API_KEY = "bc_xxxxxxxxxxxx"
SUB_CONFIG = {
"action": "subscribe",
"stocks": {
# 订阅股票实时 K 线数据 (Real-time Bars)
"bars":["MSFT", "TSLA"]
}
}
async def market_data_stream():
print(f"正在连接行情网关: {WS_URL}")
try:
async with websockets.connect(WS_URL) as websocket:
print("连接成功,开始身份验证...")
# 1. 身份验证
await websocket.send(json.dumps({"key": MY_API_KEY}))
# 2. 接收欢迎信息
welcome_msg = await websocket.recv()
print(f"服务器返回: {welcome_msg}")
# 3. 发送订阅指令
await websocket.send(json.dumps(SUB_CONFIG))
print(f"订阅指令已发送: {SUB_CONFIG}")
print("-" * 80)
# 4. 持续接收数据
while True:
message = await websocket.recv()
data_list = json.loads(message)
for item in data_list:
msg_type = item.get("T")
symbol = item.get("S")
time_str = item.get("t")
# 股票 / ETF K线
if msg_type == "b":
print(
f"[K线] {symbol:<6} | "
f"开:{item.get('o'):<8} 高:{item.get('h'):<8} "
f"低:{item.get('l'):<8} 收:{item.get('c'):<8} "
f"量:{item.get('v'):<8} 时间:{time_str}"
)
elif msg_type == "t":
print(
f"[成交] {symbol:<20} | "
f"价格:{item.get('p'):<8} 数量:{item.get('s'):<6} "
f"交易所:{item.get('x'):<4} 时间:{time_str}"
)
elif msg_type == "q":
bid_price = item.get("bp")
bid_size = item.get("bs")
ask_price = item.get("ap")
ask_size = item.get("as")
spread = None
if bid_price and ask_price:
spread = round(ask_price - bid_price, 4)
print(
f"[报价] {symbol:<20} | "
f"Bid:{bid_price} x {bid_size} | "
f"Ask:{ask_price} x {ask_size} | "
f"Spread:{spread} | 时间:{time_str}"
)
# 系统通知
elif msg_type == "success":
print(f"系统通知: {item.get('msg')}")
# 错误
elif msg_type == "error":
print(f"错误提示: {item.get('msg')}")
print("服务器可能已断开连接。")
except websockets.ConnectionClosed:
print("连接已被服务器关闭。")
except Exception as e:
print(f"发生异常: {e}")
if __name__ == "__main__":
try:
asyncio.run(market_data_stream())
except KeyboardInterrupt:
print("\n已手动停止订阅。")
错误码定义
| 状态码 | 定义 | 说明 |
|---|---|---|
| 401 | Unauthorized | API Key 无效或未提供 |
| 429 | Rate Limit | REST 请求频率过快 (限制: 500次/分钟) |
| 1008 | Policy Violation | WebSocket 订阅了非白名单股票超限 |
| 502 | Unknown Error | 不明故障 |