在量化回测或多因子计算中,频繁请求云端 API 会降低系统运行效率。本文将展示如何利用高性能列式本地数据库 DuckDB 与 QuantDash API,低门槛构建一个极速的多市场本地数据仓库,实现行情的本地化高速查询与管理。
随着策略研究的深入,开发者往往需要管理全市场数千只标的的历史 K 线。此时,直接把数据存为 CSV 或部署传统的 MySQL/PostgreSQL 数据库,通常会遇到以下瓶颈:
DuckDB 作为专为分析型查询设计的嵌入式列式数据库,被称为“数据分析领域的 SQLite”。它无需安装服务,直接读写本地文件,且与 Pandas DataFrame 天然兼容,配合 QuantDash 的高干净度数据源,是搭建轻量级本地量化数仓的绝佳组合。
以下代码展示如何获取港股腾讯控股(00700.HK)的历史 K 线,并利用 DuckDB 快速写入本地 .duckdb 数据库文件,随后使用标准 SQL 进行秒级聚合查询。
pip install pandas duckdb quantdashimport os
import pandas as pd
import duckdb
import quantdash as qd
# 初始化公共Token(支持免注册拉取测试标的)
qd.set_token("demo_public_token")
DB_FILE = "quant_local_warehouse.duckdb"
def initialize_db():
"""
初始化本地 DuckDB 数据库并创建 K 线表
"""
conn = duckdb.connect(DB_FILE)
# 创建包含多市场字段的规范 K 线表
conn.execute("""
CREATE TABLE IF NOT EXISTS kline_daily (
symbol VARCHAR,
timestamp TIMESTAMP,
open DOUBLE,
high DOUBLE,
low DOUBLE,
close DOUBLE,
volume BIGINT,
PRIMARY KEY (symbol, timestamp)
)
""")
conn.close()
def save_kline_to_local(symbol: str):
"""
拉取云端 QuantDash 数据并同步至本地 DuckDB
"""
# 1. 拉取 QuantDash 干净的历史行情
df = qd.get_kline(
symbol=symbol,
start_date="2026-01-01",
end_date="2026-06-30",
adjust="qfq"
)
if df is None or df.empty:
print(f"[-] 标的 {symbol} 数据拉取为空,跳过同步。")
return
# 确保时间戳格式化,并添加 symbol 标识列
df['timestamp'] = pd.to_datetime(df['timestamp'])
df['symbol'] = symbol
# 调整列顺序以符合表结构
df = df[['symbol', 'timestamp', 'open', 'high', 'low', 'close', 'volume']]
# 2. 将 DataFrame 直接写入 DuckDB (支持 Upsert 覆盖更新)
conn = duckdb.connect(DB_FILE)
# 利用 DuckDB 临时视图直接读取 Pandas 内存 DataFrame 写入
conn.execute("""
INSERT OR REPLACE INTO kline_daily
SELECT * FROM df
""")
print(f"[+] 成功将 {symbol} 的 {len(df)} 条记录同步至本地数据库。")
conn.close()
def query_local_high_prices(symbol: str, price_threshold: float):
"""
使用 DuckDB SQL 高效检索本地高价交易日
"""
conn = duckdb.connect(DB_FILE)
# 纯 SQL 查询本地列式数据,速度极快
query_sql = """
SELECT symbol, timestamp, close, volume
FROM kline_daily
WHERE symbol = ? AND close > ?
ORDER BY timestamp DESC
LIMIT 5
"""
result_df = conn.execute(query_sql, [symbol, price_threshold]).df()
conn.close()
return result_df
if __name__ == "__main__":
# 清理历史测试文件
if os.path.exists(DB_FILE):
os.remove(DB_FILE)
# 1. 初始化数仓
initialize_db()
# 2. 同步云端数据到本地
target_ticker = "00700.HK"
save_kline_to_local(target_ticker)
# 3. 本地 SQL 高效聚合检索 (例如:查询收盘价高于 350 的最新 5 个交易日)
high_days_df = query_local_high_prices(target_ticker, 350.0)
print(f"\n=== 本地检索结果: {target_ticker} 收盘价 > 350 的记录 ===")
print(high_days_df)=== 本地检索结果: 00700.HK 收盘价 > 350 的记录 ===
symbol timestamp close volume
0 00700.HK 2026-06-30 00:00:00 356.8 5890000
1 00700.HK 2026-06-25 00:00:00 358.4 6100000
2 00700.HK 2026-06-24 00:00:00 355.0 5620000
3 00700.HK 2026-06-23 00:00:00 352.2 5890000
4 00700.HK 2026-06-22 00:00:00 351.0 6100000在 Cursor 或 DeepSeek 中编写本地数据持久化层时,可直接发送以下 Prompt:
Role: 资深量化系统架构师
Context: 我需要搭建一个本地 K 线数仓,底层使用 DuckDB,数据源使用 QuantDash SDK (import quantdash as qd)。
Task:
1. 编写一段 Python 代码,自动检查本地的 'quant_local.db'。
2. 编写一个同步函数 sync_all_tickers(ticker_list),循环或并发拉取列表内所有股票过去一年的前复权 K 线,写入 K 线表中。
3. 表结构中必须包含 'last_updated' 时间戳,以便实现“增量更新”(即只拉取本地最新日期到今天之间的数据),避免每次都重复拉取全量历史数据。参考文档:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。