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)

AttributeTypeDescription
tdate-time时间戳 (RFC-3339 格式,纳秒精度)
odouble开盘价
hdouble最高价
ldouble最低价
cdouble收盘价
vint64成交量
nint64该 K 线内的成交笔数
vwdouble成交量加权平均价 (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排序方式 (ascdesc)

响应数据结构 (Trades Schema)

AttributeTypeDescription
tdate-time时间戳 (纳秒精度)
xstring交易所代码 (可通过 Meta 接口查询)
pdouble成交价格
sint64成交数量
carray(string)成交条件集合 (可通过 Meta 接口查询)
iint64交易记录的系统唯一标识 ID
zstringTape (如: 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排序方式 (ascdesc)

响应数据结构 (Quotes Schema)

AttributeTypeDescription
tdate-time时间戳 (纳秒精度)
axstring卖方 (Ask) 交易所代码
apdouble卖出价 (Ask Price)
asint64卖出数量 (Ask Size)
bxstring买方 (Bid) 交易所代码
bpdouble买入价 (Bid Price)
bsint64买入数量 (Bid Size)
carray(string)报价条件集合
zstringTape

股票:最新报价 (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排序方式 (ascdesc)

股票:市场快照 (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/stream

WebSocket 接入说明

股票实时 K 线推送结构 (Bars - "b")

AttributeTypeDescription
Tstring消息类型,始终为 "b" (Bar)
Sstring股票代码
onumber开盘价
hnumber最高价
lnumber最低价
cnumber收盘价
vint成交量
vwnumber成交量加权平均价 (VWAP)
nint该 K 线内的成交笔数
tstring时间戳 (RFC-3339 格式)

股票实时成交推送结构 (Trades - "t")

AttributeTypeDescription
Tstring消息类型,始终为 "t" (Trade)
Sstring股票代码
iint交易 ID
xstring发生交易的交易所代码
pnumber成交价格
sint成交数量
carray(string)交易条件
tstring时间戳 (RFC-3339 格式,纳秒精度)
zstringTape

股票实时报价推送结构 (Quotes - "q")

AttributeTypeDescription
Tstring消息类型,始终为 "q" (Quote)
Sstring股票代码
axstring卖方 (Ask) 交易所代码
apnumber卖出价 (Ask Price)
asint卖出量 (Ask Size,以整手为单位)
bxstring买方 (Bid) 交易所代码
bpnumber买入价 (Bid Price)
bsint买入量 (Bid Size,以整手为单位)
carray(string)报价条件
tstring时间戳 (RFC-3339 格式,纳秒精度)
zstringTape

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已手动停止订阅。")

错误码定义

状态码定义说明
401UnauthorizedAPI Key 无效或未提供
429Rate LimitREST 请求频率过快 (限制: 500次/分钟)
1008Policy ViolationWebSocket 订阅了非白名单股票超限
502Unknown Error不明故障