2. 实盘接入准备:交易所API选择(REST/WebSocket),API密钥管理与安全规范

做市策略从回测走到实盘,第一步就是跟交易所“握手”。

这一步搞砸了,后面策略再牛也白搭。我见过不少新手,API密钥直接硬编码在代码里,结果被拖库,账户一夜归零。嗯,咱们今天就把这事聊透。

2.1 交易所API选型:REST vs WebSocket

说白了,交易所给你两个接口:一个是你主动去问(REST),一个是它主动告诉你(WebSocket)。

REST API 就像你每隔几秒给交易所打个电话:“现在价格多少?” “我的订单成交了没?”

  • 优点:简单、稳定、容易调试。你发一个HTTP请求,拿回JSON数据。
  • 缺点:有延迟。你打电话的时候,价格可能已经变了。
  • 适用场景:下单、撤单、查询账户余额。这些操作频率低,用REST完全够。

WebSocket API 就像你跟交易所开了一条专线,它实时往你这边推数据:“最新成交价!深度变化!你的订单状态更新!”

  • 优点:延迟极低,毫秒级推送。做市策略必须用这个拿行情。
  • 缺点:连接可能断,需要心跳检测和重连机制。代码复杂度高一些。
  • 适用场景:订阅行情(ticker、orderbook)、监听成交回报。

我的经验:做市策略,行情必须走WebSocket,下单走REST。为什么?

行情变化太快,REST轮询根本跟不上。我曾经在币安上试过用REST每100ms拉一次深度,结果发现数据总是落后200-300ms,做市单子全被吃掉了。后来换成WebSocket,延迟降到10ms以内,情况立刻好转。

下面这张图,是我个人习惯的API选型决策流程:

实盘API选型 操作类型? 行情数据 WebSocket 下单/查询 REST 混合使用(推荐) 行情WebSocket + 交易REST

2.2 API密钥管理与安全规范

这是做市策略的命门。密钥泄露,等于你把交易所账户的钥匙交给了黑客。

⚠️ 我曾经见过最惨的案例:有个团队把API密钥写死在GitHub公开仓库里,被机器人扫到,几分钟内账户里所有资产被转走。所以,密钥管理不是小事。

2.2.1 密钥的存储原则

  • 绝不硬编码:代码里不能出现任何密钥字符串。用环境变量或配置文件。
  • 环境变量:在服务器上通过 export API_KEY="xxx" 设置,代码里用 os.getenv("API_KEY") 读取。
  • 配置文件:使用 .env 文件,但一定要加入 .gitignore,绝不上传到版本控制。
# .env 文件示例(绝不上传Git)
EXCHANGE_API_KEY = "your_api_key_here"
EXCHANGE_SECRET_KEY = "your_secret_key_here"
EXCHANGE_PASSPHRASE = "your_passphrase_here"  # 部分交易所需要
# Python 读取示例
import os
from dotenv import load_dotenv

load_dotenv()  # 加载 .env 文件

API_KEY = os.getenv("EXCHANGE_API_KEY")
SECRET_KEY = os.getenv("EXCHANGE_SECRET_KEY")

if not API_KEY or not SECRET_KEY:
    raise ValueError("密钥未设置!请检查环境变量或 .env 文件")

2.2.2 权限最小化原则

交易所创建API密钥时,通常可以设置权限。你想想看,做市策略只需要交易和查询,为什么要给它提币权限?

权限类型 做市策略是否需要 说明
交易权限 ✅ 是 下单、撤单
查询权限 ✅ 是 查余额、查订单状态
提币权限 ❌ 否 绝对不要勾选!
API创建/删除 ❌ 否 防止被恶意操作

💡 我的习惯:每个策略单独创建一个API密钥,并设置IP白名单。这样即使密钥泄露,攻击者也只能从你指定的服务器IP发起请求。

2.2.3 签名与安全传输

交易所API请求通常需要签名。说白了,就是用你的密钥对请求参数进行加密,证明这个请求是你发的。

# 以HMAC-SHA256签名示例(Python)
import hmac
import hashlib
import time
import requests

def sign_request(secret_key, method, path, body=""):
    timestamp = str(int(time.time() * 1000))
    message = timestamp + method + path + body
    signature = hmac.new(
        secret_key.encode(),
        message.encode(),
        hashlib.sha256
    ).hexdigest()
    return timestamp, signature

# 使用示例
timestamp, signature = sign_request(
    SECRET_KEY, 
    "GET", 
    "/api/v1/account"
)

headers = {
    "API-Key": API_KEY,
    "Timestamp": timestamp,
    "Signature": signature
}

response = requests.get(
    "https://api.exchange.com/api/v1/account",
    headers=headers
)

⚠️ 注意:签名算法每个交易所略有不同。币安、OKX、Coinbase的签名方式都不一样。一定要仔细阅读官方文档。我当年在接入某二线交易所时,因为文档里一个时间戳格式写错了,调试了整整一个下午。

2.2.4 密钥轮换与监控

  • 定期轮换:建议每3个月更换一次API密钥。旧密钥及时删除。
  • 异常监控:设置告警,当API调用频率异常升高或出现未知IP时,立即通知你。
  • 冷热分离:做市策略用的密钥只放在交易服务器上。开发环境用测试网密钥,别混用。

2.3 实盘接入前的检查清单

别急着上线。先过一遍这个清单,能帮你省掉很多麻烦。

  1. 网络延迟测试:从你的服务器ping交易所API,延迟在50ms以内算合格。
  2. WebSocket连接测试:确认能稳定订阅行情,断线后能自动重连。
  3. 下单测试:先下一个小额订单(比如0.001 BTC),确认能成交、能撤单。
  4. 签名验证:用交易所提供的签名校验工具,确认你的签名算法正确。
  5. 密钥权限检查:登录交易所后台,确认API密钥只有交易和查询权限。
  6. IP白名单:只允许你的服务器IP访问。
  7. 日志记录:所有API请求和响应都要记录日志,方便排查问题。

最后说一句:实盘接入不是一锤子买卖。上线后前三天,我建议你每小时检查一次日志和账户状态。等稳定了,再慢慢放宽监控频率。

安全这件事,再怎么小心都不为过。


专注资料整理