在设计分布式量化交易系统(如多策略并行、多容器运行)时,我们经常会遇到一个棘手的网络吞吐瓶颈:多个独立的策略进程盘中需要高频获取同一批热门股票的最新价格。
如果每个策略进程(例如 5 个回测容器、3 个实盘容器)都直接独立向外部金融数据 API 发起 HTTP 请求:
为了解决这个架构痛点,本文将介绍如何基于 FastAPI + Redis,在云端(如腾讯云 CVM 或轻量应用服务器)搭建一个轻量级的内部行情缓存代理网关(Cache Gateway)。所有内部策略进程统一向该网关请求数据,通过 Cache-Aside(旁路缓存)模式大幅降低公网回源频率。
架构的逻辑非常简单直观:
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 策略容器 A │ │ 策略容器 B │ │ 策略容器 C │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ │ │
└─────────────┬─────┴───────────────────┘
│ (内网 HTTP 请求)
▼
┌──────────────┐ 读取缓存 (0.1ms) ┌──────────────┐
│ 行情代理网关 ├─────────────────────────►│ 腾讯云Redis │
│ (FastAPI) │◄─────────────────────────┤ (TencentDB) │
└──────┬───────┘ 未命中则写入缓存 └──────────────┘
│
│ 缓存失效 / 未命中时回源 (公网 REST API)
▼
┌──────────────┐
│ QuantDash API│
└──────────────┘在云服务器中,我们通过 Python 快速构建这个微服务。
pip install fastapi uvicorn redis quantdashimport os
import json
import redis
from fastapi import FastAPI, HTTPException
from quantdash import QuantDash
app = FastAPI(title="Internal Quant Data Cache Gateway")
# 1. 连接本地或腾讯云 TencentDB for Redis
REDIS_HOST = os.getenv("REDIS_HOST", "127.0.0.1")
REDIS_PORT = int(os.getenv("REDIS_PORT", 6379))
r = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, decode_responses=True)
# 2. 初始化外部行情源 QuantDash 客户端
QD_API_KEY = os.getenv("QUANTDASH_API_KEY", "your_api_key_here")
qd = QuantDash(api_key=QD_API_KEY)
# 定义盘中热行情缓存生存时间(TTL = 2秒)
CACHE_TTL_SECONDS = 2
@app.get("/v1/quote/{symbol}")
def get_quote_with_cache(symbol: str):
"""
获取实时行情接口 (Cache-Aside 模式)
"""
cache_key = f"realtime_quote:{symbol.upper()}"
# 尝试一:读取 Redis 缓存(内网连接,时延 < 1ms)
try:
cached_data = r.get(cache_key)
if cached_data:
return {
"status": "success",
"source": "local_redis_cache",
"data": json.loads(cached_data)
}
except Exception as redis_err:
# 降级处理:若 Redis 宕机,记录日志并继续通过 API 回源,保证业务不中断
print(f"Redis Connection Error: {redis_err}")
# 尝试二:缓存未命中,回源公网 QuantDash API
try:
# 获取单只标的的盘中实时行情数据 (SDK 默认支持 A/港/美 统一代码)
quote_res = qd.quotes.get(symbols=[symbol])
if not quote_res:
raise HTTPException(status_code=404, detail=f"Symbol {symbol} not found.")
# 适配返回数据结构(QuantDash quotes 返回通常为字典或列表)
single_quote = quote_res[0] if isinstance(quote_res, list) else quote_res
# 异步/同步写入 Redis 并设置 2s 自动过期
try:
r.setex(cache_key, CACHE_TTL_SECONDS, json.dumps(single_quote))
except Exception as redis_err:
print(f"Redis Write Error: {redis_err}")
return {
"status": "success",
"source": "quantdash_origin_api",
"data": single_quote
}
except Exception as api_err:
raise HTTPException(
status_code=500,
detail=f"Failed to fetch data from origin API: {str(api_err)}"
)我们来算一笔“技术账”,看看这个简单的缓存层能为云上系统带来多大改观。
你部署了 10 个策略容器,每个容器盘中每 1 秒就需要读取一次 00700.HK 的最新价。
若要在腾讯云生产环境中落地该架构,建议结合以下云原生最佳实践:
微服务设计的一大原则是“单一职责”。通过将行情获取职责收敛到独立的缓存网关,不仅能帮我们省下可观的外部 API 调用费,还为下游策略逻辑屏蔽了复杂的网络回源和错误处理,是中大型云上量化交易系统不可或缺的一环。
如果你也正处于多策略扩展的阶段,建议尽早用这套低成本方案将数据读取层解耦。
参考文档:https://quantdash.net/
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。