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选型决策流程:
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 实盘接入前的检查清单
别急着上线。先过一遍这个清单,能帮你省掉很多麻烦。
- 网络延迟测试:从你的服务器ping交易所API,延迟在50ms以内算合格。
- WebSocket连接测试:确认能稳定订阅行情,断线后能自动重连。
- 下单测试:先下一个小额订单(比如0.001 BTC),确认能成交、能撤单。
- 签名验证:用交易所提供的签名校验工具,确认你的签名算法正确。
- 密钥权限检查:登录交易所后台,确认API密钥只有交易和查询权限。
- IP白名单:只允许你的服务器IP访问。
- 日志记录:所有API请求和响应都要记录日志,方便排查问题。
最后说一句:实盘接入不是一锤子买卖。上线后前三天,我建议你每小时检查一次日志和账户状态。等稳定了,再慢慢放宽监控频率。
安全这件事,再怎么小心都不为过。