원클릭으로
tushare-duckdb-sync-skill
从 Tushare Pro 同步数据到本地 DuckDB,支持全量/增量模式。包含环境初始化、数据同步、质检、文档生成完整流程。关键词: tushare, duckdb, 数据同步, ETL, 增量更新, 全量同步, 数据质检。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
从 Tushare Pro 同步数据到本地 DuckDB,支持全量/增量模式。包含环境初始化、数据同步、质检、文档生成完整流程。关键词: tushare, duckdb, 数据同步, ETL, 增量更新, 全量同步, 数据质检。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
| name | tushare-duckdb-sync-skill |
| description | 从 Tushare Pro 同步数据到本地 DuckDB,支持全量/增量模式。包含环境初始化、数据同步、质检、文档生成完整流程。关键词: tushare, duckdb, 数据同步, ETL, 增量更新, 全量同步, 数据质检。 |
| argument-hint | 输入 Tushare 文档地址或表名,可选同步模式(全量/增量)。 |
| user-invocable | true |
本目录是 skill 文档(教 AI Agent 如何完成同步)。如需直接运行的 cron 调度脚本(由本 skill 派生的产物),见
../tushare_duckdb_sync_scripts/。
自动完成从 Tushare 到本地 DuckDB 的数据同步,同时产出三份同等重要的资产:
table_sync_state)、数据质量快照、同步历史日志。数据没有元数据就无法被正确使用。同步没有状态记录就无法增量续传。 三者缺一,则同步工作不算完成。
本 Skill 采用「主工作流 + 子文件」组织,社区用户只需将 scripts/ 复制到工作区即可使用。
tushare_duckdb_sync_skills/
├── SKILL.md ← 本文件:编排工作流(Agent 阅读)
├── scripts/
│ ├── sync_table.py ← 自包含同步脚本(无项目内部依赖)
│ └── check_quality.py ← 自包含质检脚本
├── examples/
│ ├── stock_basic_overwrite.md ← 全量覆盖示例(none 维度)
│ └── daily_incremental.md ← 增量同步示例(trade_date 维度)
└── templates/
├── mapping_registry.json ← 映射注册表种子(空 tables 数组)
├── table_metadata.md ← 元数据文档模板
└── task_config.json ← 任务配置 JSON 模板
Agent 使用规则:
scripts/sync_table.py 复制到用户工作区,填入参数后执行。scripts/check_quality.py 复制到用户工作区执行。templates/table_metadata.md 为模板,逐项填写。examples/ 下的完整示例。进入工作流之前,必须先确认初始化状态。
询问用户:"是否已完成 Tushare-DuckDB 同步环境的初始化?"
要求用户给出文档目录路径(默认 ./docs/tushare_sync/),然后:
计划书.md 或 _index.md 恢复上下文。tables/ 下已有表文档,了解已同步表及其元数据覆盖情况。table_sync_state 表确认同步进度。询问用户,提供选项:
同时确认虚拟环境文件放置地址(默认选项:项目根目录下 .venv/)。
询问用户 DuckDB 文件路径,提供默认选项:
./duckdb/tushare.duckdb(相对项目根目录)询问用户文档根目录,提供默认选项:
./docs/tushare_sync/scripts/sync_table.py 和 scripts/check_quality.py 复制到用户工作区根目录(或用户指定位置)。{文档目录}/环境说明.md,记录 Python 环境、DuckDB 路径、脚本位置。{文档目录}/计划书.md,包含表格跟踪模板。tushare、duckdb、pandas、loguru。{文档目录}/tables/、{文档目录}/sql/、{文档目录}/archive/。templates/mapping_registry.json 复制到 {文档目录}/mapping_registry.json。这是空数据库的初始状态 — tables 数组为空,每同步一张新表后由 Agent 追加条目。询问用户输入 Tushare Pro Token(注册 https://tushare.pro 后在个人主页获取)。
验证 Token 有效性(调用 trade_cal 接口测试)。运行时通过 TUSHARE_TOKEN 环境变量传入。
Token 处理约定(必须 human-in-loop)
Agent 不得擅自扫描工作区、Shell 历史或系统目录去“猜测” Token 来源。进入任何同步动作前,必须满足以下二选一:
TUSHARE_TOKEN,任务结束后不写回仓库。./.env.tushare、./.env.local、~/.config/tushare/token.env。后续同步可只从这个已约定位置读取,再显式导出 TUSHARE_TOKEN 后执行脚本。补充规则:
TUSHARE_TOKEN,也应向用户确认“是否继续复用当前环境变量”。.env*、配置文件或钥匙串。sync_table.py 本身只消费 TUSHARE_TOKEN 环境变量,不负责自动发现 .env 文件;从固定位置加载 Token 属于调用方工作流的一部分。要求用户提供 Tushare 官方文档 URL,格式如:
https://tushare.pro/document/2?doc_id=32使用 fetch_webpage 从文档页面 逐列提取 以下信息(这是元数据的唯一源头,必须完整采集):
trade_date / 按报告期 period / 无维度 none)如果 Tushare 文档页面无法访问或解析不完整,必须告知用户并暂停,不得跳过元数据采集。
当网页无法访问(登录墙、网络故障、页面改版)时,Agent 应切换到手动采集模式:
手动输入的元数据同样写入表文档和映射注册表,与网页采集的数据享有相同地位。
在执行任何数据同步之前,先完成元数据文档。 这确保即使同步中断,元数据也已就绪供后续使用。
在 {文档目录}/tables/{表中文名}.md 创建文档。
使用模板:以 templates/table_metadata.md 为基础,必须包含全部章节。
参考示例:阅读 examples/stock_basic_overwrite.md 或 examples/daily_incremental.md 了解正确的填写方式。
字段详情的填写规则:
DuckDB 类型:从实际 DuckDB 表的 information_schema.columns 查询,不是从文档猜测。若表尚不存在则标注 (待建表确认)。Tushare 原始类型:从 Tushare 文档提取(str / float / int)。数据角色:必须为以下之一 — 标识、维度、度量、辅助。中文说明:优先使用 Tushare 文档原文,不得省略或改写。量化用途:Agent 根据列含义判断,可选类别:
唯一标识、时间维度、OHLC 行情、成交量价、资金流向、财务指标、技术因子、持仓明细、状态标记、分类维度、辅助信息。取值范围/格式:记录数据格式(如日期格式)、已知枚举值(如 P=暂停上市, D=退市)、常见数值范围。注意事项:记录类型转换、特殊取值、精度问题等。若无特殊情况写 —。按以下优先级自动判断:
table_sync_state 表:如果目标 source_table 存在已同步记录 → 增量模式。{文档目录}/tables/{表名}.md → 辅助判断。20100101)。none 维度表(如 stock_basic),直接 overwrite,同步完成后自动重建 PK 和索引。trade_date 维度表,设置 sync_all=true 以支持断点续传。period 维度表,设置 sync_all=true,起始期默认 20100331。start_date 设为已同步最大日期的下一天。sync_all=false(拉取 start_date 到今天的全部维度值)。mode=append。trade_date 维度的盘后行情、资金流、因子类接口,默认以 Asia/Shanghai 18:00 作为当天数据的安全发布时间。end_date,Agent 或脚本必须把有效截止日收敛到 上一个开放交易日,而不是盲目拉今天。allow_empty_result 把空结果记成功。查阅映射注册表:读取 {文档目录}/mapping_registry.json,检查目标表是否已有映射记录。
endpoint、method、dimension_type、pk 等参数。命名规则:
source_table:通常与 Tushare 接口名一致(如 daily、moneyflow)。若用户已有 table_sync_state 历史记录,必须与之一致。target_table:遵循 {类别}_{业务名} 格式(如 stk_daily、fin_balance)。参见 DuckDB Schema 设计规范。Tushare API 调用规则(从文档推断):
method=query,即 pro.query('{endpoint}', ...)。_vip 后缀 endpoint(如 income → income_vip)。pro.query() 返回空但直接方法调用 pro.{endpoint}() 有数据 → 切换 method 为 {endpoint}(如 suspend_d、fina_indicator_vip)。同步完成后,必须将新表的映射关系追加到
{文档目录}/mapping_registry.json(见 Step 7)。 这是新用户从空目录逐步积累本地知识的唯一途径。
单表同步(直接命令行):
TUSHARE_TOKEN=xxx python sync_table.py \
--endpoint {endpoint} \
--duckdb-path {duckdb_path} \
--target-table {target_table} \
--mode {overwrite|append} \
--dimension-type {none|trade_date|period} \
--start-date {YYYYMMDD} \
--sleep 0.3
批量同步(任务文件):
TUSHARE_TOKEN=xxx python sync_table.py \
--tasks-file tasks.json \
--duckdb-path {duckdb_path}
任务文件格式参见 templates/task_config.json。
sync_table.py是自包含脚本,不依赖本项目其它模块。Agent 只需填入参数即可执行。
执行前置要求:
社区脚本的默认安全行为:
trade_date 且未传 end_date 时,18:00 前自动只同步到上一个开放交易日。--allow-empty-result。max_retries),失败后单独重跑该表。--sleep(默认 0.3s)。_coerce_dates 自动转换。Asia/Shanghai 18:00,或是否需要把 end_date 改成上一个开放交易日。
table_sync_state是增量续传的基础,是三项资产之一(运维记录),必须及时更新。
sync_table.py 在 dimension_type != "none" 时自动写入 table_sync_state。
补充规则:对增量维度,空 payload 默认写 is_sync=0,避免把“上游未发布”误写成“成功同步”。
对于 none 维度表,手动执行:
INSERT INTO table_sync_state
(source_table, dimension_type, dimension_value, is_sync, error_message, updated_at)
VALUES ('{source_table}', 'none', '{today}', 1, '', NOW());
table_sync_state 表结构:
| 列名 | 类型 | 说明 |
|---|---|---|
| source_table | VARCHAR | Tushare 接口名 / 历史表名 |
| dimension_type | VARCHAR | trade_date / period / none |
| dimension_value | VARCHAR | 具体日期值(如 20260416) |
| is_sync | INTEGER | 1=成功, 0=失败 |
| error_message | VARCHAR | 失败原因(成功时为空) |
| updated_at | TIMESTAMP | 写入时间 |
质检结果直接写入元数据文档的「数据质量快照」段落,使之成为该表的持久化质量档案。
使用 check_quality.py 对每张新同步的表执行质检:
python check_quality.py \
--duckdb-path {duckdb_path} \
--table {target_table} \
--pk {pk_col1,pk_col2} \
--date-col {date_col} \
--format markdown
脚本执行以下检查项:
| 检查项 | 通过条件 |
|---|---|
| 行数 | > 0(除已知空表) |
| PK 唯一 | 0 重复行 |
| PK 非空 | 每列 NULL 数 = 0 |
| 日期范围 | max ≥ 最新交易日 |
| NaN 污染 | VARCHAR 列无字面量 'nan' / 'NaN' |
| 股票覆盖 | 记录 DISTINCT ts_code 数 |
| 交易日覆盖 | 记录 DISTINCT date 数 |
| 度量列空值率 | 标记 > 50% 的列 |
检查完成后:
--format markdown 输出写入文档的「数据质量快照」表格(覆盖旧值)。对于增量连续性检查(缺失交易日),Agent 需额外对比
trade_cal表手动验证。
同步完成后,回到 Step 2 创建的文档,更新:
information_schema.columns 补全实际类型。{文档目录}/mapping_registry.json 的 tables 数组追加一条记录:
{
"source_table": "{source_table}",
"target_table": "{target_table}",
"endpoint": "{endpoint}",
"dimension_type": "{none|trade_date|period}",
"method": "{query 或 方法名}",
"pk": "{pk_col1,pk_col2}",
"doc_id": "{doc_id}",
"note": "{备注}"
}
映射注册表是跨会话持久化的本地知识,确保下次同步或增量更新时 Agent 无需重新推断参数。
✅ {表中文名} ({target_table}) 同步完成
- 模式: {增量/全量}
- 新增: {loaded_rows} 行
- 总计: {total_rows} 行
- 数据范围: {min_date} ~ {max_date}
- 质检: 通过
- 元数据文档: {文档路径} ✓({n} 列全覆盖)
- 同步状态: table_sync_state ✓
每次同步任务结束前,按顺序逐项检查。任何一项缺失,任务不算完成。
tables/{表名}.md 已创建/更新数据角色、量化用途、取值范围/格式、注意事项table_sync_state 已写入最新同步状态mapping_registry.json 已包含本次同步表的映射条目三项全部通过后方可输出任务纪要。
{类别}_{业务名},如 stk_moneyflow、fin_balance、idx_daily_dc。DATE 类型(非 VARCHAR),同步脚本自动转换。PRIMARY KEY(通常为 ts_code + trade_date 或 ts_code + end_date)。idx_{table}_{col}。(ts_code, trade_date) 物理排序以优化范围查询。{docs}/sql/,展示给用户确认后执行。{文档目录}/archive/ 下按年月归档。新用户从空目录开始:初始化时
mapping_registry.json的tables数组为空。 每同步一张表,Agent 自动向其追加一条映射记录。随着使用积累,注册表逐步成长为该用户的完整映射知识库。
Agent 在构建同步参数时按以下优先级查阅映射:
{文档目录}/mapping_registry.json — 用户本地注册表(首选,最准确)。以下为已验证的常用表映射,仅供 Agent 在用户注册表无对应记录时参考。 同步完成后仍须将实际使用的参数写入
mapping_registry.json。
| source_table | target_table | endpoint | 维度 | method | pk | doc_id |
|---|---|---|---|---|---|---|
| stock_basic | stk_info | stock_basic | none | query | ts_code | 25 |
| daily | stk_daily | daily | trade_date | query | ts_code,trade_date | 27 |
| dc_daily | idx_daily_dc | dc_daily | trade_date | query | ts_code,trade_date | — |
| dc_index | idx_quote_dc | dc_index | trade_date | query | ts_code,trade_date | — |
| dc_member | idx_member_daily | dc_member | trade_date | query | ts_code,trade_date | — |
| idx_factor_pro | idx_factor_pro | idx_factor_pro | trade_date | query | ts_code,trade_date | — |
| stk_factor_pro | stk_factor_pro | stk_factor_pro | trade_date | query | ts_code,trade_date | — |
| moneyflow | stk_moneyflow | moneyflow | trade_date | query | ts_code,trade_date | 32 |
| moneyflow_ths | stk_moneyflow_ths | moneyflow_ths | trade_date | query | ts_code,trade_date | — |
| cyq_perf | stk_cyq_perf | cyq_perf | trade_date | query | ts_code,trade_date | — |
| margin_detail | stk_margin | margin_detail | trade_date | query | ts_code,trade_date | — |
| suspend_d | stk_suspend | suspend_d | trade_date | suspend_d | ts_code,trade_date | — |
| stock_st | stk_st_daily | stock_st | trade_date | stock_st | ts_code,trade_date | — |
| namechange | stk_name_history | namechange | none | namechange | ts_code | — |
| bse_mapping | stk_bse_mapping | bse_mapping | none | bse_mapping | ts_code | — |
| balancesheet | fin_balance | balancesheet_vip | period | query | ts_code,end_date | — |
| cashflow | fin_cashflow | cashflow_vip | period | query | ts_code,end_date | — |
| income | fin_income | income_vip | period | query | ts_code,end_date | — |
| fina_indicator | fin_indicator | fina_indicator_vip | period | fina_indicator_vip | ts_code,end_date | — |
| express | fin_express | express_vip | period | query | ts_code,end_date | — |
| forecast | fin_forecast | forecast_vip | period | query | ts_code,end_date | — |
| top10_holders | fin_top10_holders | top10_holders | period | query | ts_code,end_date | — |
| top10_floatholders | fin_top10_float_holders | top10_floatholders | period | query | ts_code,end_date | — |
| stk_ah_comparison | stk_ah_comparison | stk_ah_comparison | trade_date | query | ts_code,trade_date | — |
table_sync_state 中无记录但目标表已有数据 → 以目标表实际 max_date 为基准做增量。七看八问·八问 Q1:行业前景与市场规模。Use when: 八问Q1, 行业前景, 行业周期, 市场规模, 产业政策, 申万分类。调用 company-analysis-mcp 工具自动评级。
七看八问·八问 Q2:竞争优势与护城河。Use when: 八问Q2, 竞争优势, 护城河, 品牌壁垒, 技术壁垒, 成本优势, 毛利率, 主营结构。调用 company-analysis-mcp 工具自动评级。
七看八问·八问 Q3:管理团队与股权结构。Use when: 八问Q3, 管理团队, 高管变动, 股权结构, 持股集中度, 实控人质押。调用 company-analysis-mcp 工具自动评级。
七看八问·八问 Q4:财务真实性与会计质量。Use when: 八问Q4, 财务真实性, 会计洞穴, 净现比, 审计意见, 问询函, 立案, ST更名。调用 company-analysis-mcp 工具自动评级。
七看八问·八问 Q5:市场地位与客户集中度。Use when: 八问Q5, 市场地位, 市占率, 前五大客户, 同行对比, 龙头, 伪龙头。调用 company-analysis-mcp 工具自动评级。
七看八问·八问 Q6:业务模式与第二曲线。Use when: 八问Q6, 业务模式, 商业模式, 第二曲线, 单一产品依赖, 业务分部, 主营构成多期对比。调用 company-analysis-mcp 工具自动评级。