在量化交易系统的工程实践中,维护一个“历史日K线数据库”是进行回测与多因子选股的基础。
然而,很多开发者在部署这个同步任务时,常常会遇到一个很尴尬的资源浪费问题:
本文将手把手带大家实现一个部署在腾讯云 SCF 上的 Python 行情数据定时同步服务,并自动落库至云数据库中。
本方案采用全 Serverless 化的轻量级云原生架构:
┌─────────────────┐ ┌─────────────────┐ ┌────────────────────────┐ ┌─────────────────┐
│ 腾讯云定时触发器 │ ───> │ 腾讯云函数 (SCF) │ ───> │ QuantDash 数据源 (API) │ ───> │ 腾讯云数据库 CDB│
│ (Timer Trigger) │ │ (Python 运行环境) │ │ (获取 A/港/美 历史日K线)│ │ (MySQL/PG 存储) │
└─────────────────┘ └─────────────────┘ └────────────────────────┘ └─────────────────┘在腾讯云云函数环境中,我们需要编写符合 SCF 规范的 main_handler 入口函数。由于 QuantDash 提供了干净的 to_dataframe=True 支持,我们无需繁琐的 JSON 解析,直接结合 SQLAlchemy 即可完成高效的批量落库。
以下是核心 Python 脚本(index.py):
import os
import sys
import pandas as pd
from sqlalchemy import create_engine
from quantdash import QuantDash
# 获取环境变量(建议将敏感配置信息放在云函数环境变量中)
API_KEY = os.environ.get("QUANTDASH_API_KEY")
DB_HOST = os.environ.get("DB_HOST")
DB_PORT = os.environ.get("DB_PORT", "3306")
DB_USER = os.environ.get("DB_USER")
DB_PASS = os.environ.get("DB_PASS")
DB_NAME = os.environ.get("DB_NAME")
# 1. 初始化数据库连接引擎 (以 MySQL 为例)
db_url = f"mysql+pymysql://{DB_USER}:{DB_PASS}@{DB_HOST}:{DB_PORT}/{DB_NAME}?charset=utf8mb4"
engine = create_engine(db_url)
# 2. 初始化 QuantDash 客户端
qd = QuantDash(api_key=API_KEY)
def sync_daily_data(symbols: list):
"""
获取指定标的的最新日K线并增量写入云数据库
"""
for symbol in symbols:
try:
print(f"开始同步标的数据: {symbol}")
# 拉取最新 2 天的日K线(覆盖当天和前一交易日,避免因时差或收盘结算延迟导致漏数据)
df = qd.klines.get(
symbol=symbol,
period="1d",
count=2,
to_dataframe=True
)
if df.empty:
print(f"[{symbol}] 未获取到行情数据,跳过")
continue
# 标准化字段为小写
df.columns = [col.lower() for col in df.columns]
# 增加一个标识标的代码的列
df["symbol"] = symbol
# 使用 Pandas 的 to_sql 增量写入云数据库
# 'append' 模式可以避免覆盖历史数据
# 如果需要去重,建议在数据库表结构中将 (symbol, time) 设为唯一联合索引,并捕获 DuplicateKey 异常
df.to_sql(
name="stock_daily_kline",
con=engine,
if_exists="append",
index=False
)
print(f"[{symbol}] 同步成功,成功写入 {len(df)} 条记录。")
except Exception as e:
print(f"[{symbol}] 同步异常: {e}")
def main_handler(event, context):
"""
腾讯云 SCF 云函数标准入口
"""
print("=== 开始运行每日行情同步任务 ===")
# 需要监控并同步的跨市场标的池
watch_pool = [
"600519.SH", # 贵州茅台
"000001.SZ", # 平安银行
"00700.HK", # 腾讯控股
"AAPL.US" # 苹果
]
sync_daily_data(watch_pool)
return {
"status": "success",
"message": "Daily kline sync completed successfully."
}为了让代码在云端稳定运行,我们需要在部署时注意以下云原生工程细节:
由于代码中引入了 quantdash, pandas, sqlalchemy, pymysql 等第三方库,我们需要解决环境依赖问题。
A股通常在下午 15:00 收盘,港股在 16:00 收盘,而美股(冬令时)在次日凌晨 05:00 收盘。 我们可以为不同的市场设置不同的触发定时器。 例如,针对 A股和港股的数据,我们可以添加一个 Timer 触发器,Cron 表达式配置为:
0 30 16 * * MON-FRI *(代表周一至周五,每天下午 16:30 自动触发执行一次同步任务)
相比于传统的轻量应用服务器或 CVM 方案,采用 SCF + QuantDash 的云原生方案具备以下显著优势:
评估维度 | 传统 CVM / Lighthouse 方案 | 腾讯云 SCF + QuantDash 方案 |
|---|---|---|
计算成本 | 固定月租(如 30-100 元/月) | 几乎为 0 元 (SCF 享有每月免费额度,单次运行1分钟费用极微) |
运维门槛 | 需要维护 Linux 系统、安全组、定时任务 crontab、防网络黑客 | 零运维,云端全托管,安全组与 VPC 隔离防范攻击 |
接入摩擦 | 需要自行编写复杂的网络重试和底层协议转化 | 利用 QuantDash 规范的 REST API / SDK 快速落库 |
将传统量化数据拉取任务改造为 Serverless 架构,是金融科技工程化落地的典型场景。通过腾讯云无服务器云函数(SCF)与标准化的金融数据源(QuantDash)的有机结合,我们不仅合理规避了不必要的算力闲置浪费,还让整个数据收集管道变得更加弹性、安全与健壮。
参考文档:https://docs.quantdash.net/
提示:本文方案及代码仅供云技术方案开发和交流使用,不构成任何投资建议。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。