smithery/tycallen

tushare-duckdb

Query Chinese stock data from local DuckDB cache. Includes Tushare Pro data and jquant_data_sync concept sector data.

Installation

$ npx skills add smithery/tycallen --skill tushare-duckdb

Similar popular skills

Related neighbors and high-traction skills in the same topics — useful to compare before installing.

More details

Agent compatibility

Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.

Claude Code Declared
Cursor Not declared
Codex Not declared
GitHub Copilot Not declared
Windsurf Not declared
Gemini CLI Not declared
Cline Not declared
OpenCode Not declared

Skill metadata

Parsed from SKILL.md frontmatter.

Declared agents claude-code

Package contents

Files included with this skill beyond the listing page.

  • skill md SKILL.md 14,680 B
  • docs SUMMARY.md 146 B

History

  1. First recorded snapshot · 0 installs

SKILL.md

<!-- INSTALLATION: Global: cp -r docs/skills/tushare-duckdb ~/.claude/skills/ Project: cp -r docs/skills/tushare-duckdb .claude/skills/ -->

tushare-duckdb

Local DuckDB cache layer for Tushare Pro data with integrated concept sector data from jquantdatasync.

Quick Start

Read Data (no network, concurrent-safe)

from tushare_db import DataReader

reader = DataReader(db_path="tushare.db")

# Single stock with forward adjustment
df = reader.get_stock_daily('000001.SZ', '20240101', adj='qfq')

# Multiple stocks
df = reader.get_multiple_stocks_daily(['000001.SZ', '600519.SH'], '20240101')

# Concept sector constituents (from jquant_data_sync)
df = reader.get_concept_stocks('20240115', concept_name='人工智能')

# Stock's concept sectors
df = reader.get_stock_concepts('20240115', ts_code='000001.SZ')

# Trade calendar
df = reader.get_trade_calendar('20240101', '20241231')

# Stock list
df = reader.get_stock_basic(list_status='L')

# Custom SQL
df = reader.query("SELECT * FROM daily WHERE ts_code = ?", ['000001.SZ'])

reader.close()

Download Data (requires TUSHARE_TOKEN env var)

from tushare_db import DataDownloader

downloader = DataDownloader(db_path="tushare.db", rate_limit_profile="standard")

# Basic data
downloader.download_trade_calendar()
downloader.download_stock_basic()

# Daily data for all stocks
downloader.download_all_stocks_daily(start_date='20200101')

# Daily update (single date)
downloader.download_daily_data_by_date('20241218')

downloader.close()

Query Margin Balance

from tushare_db import DataReader

reader = DataReader(db_path="tushare.db")

# 获取所有交易所的两融余额汇总
df = reader.get_margin(start_date='20240101', end_date='20241231')

# 获取上海交易所的两融余额
df = reader.get_margin(exchange_id='SSE', start_date='20240101')

reader.close()

Concept Sector Data (jquantdatasync)

External concept sector data integrated via DataReader:

from tushare_db import DataReader

reader = DataReader(db_path="tushare.db")

# Get concept constituents for a specific date (PIT)
df = reader.get_concept_stocks('20240115', concept_name='人工智能')
# Returns: ts_code, concept_name, in_date, out_date

# Get all concept sectors for a stock
df = reader.get_stock_concepts('20240115', ts_code='000001.SZ')
# Returns: concept_code, concept_name, in_date, out_date

# Get full cross-section for a date
df = reader.get_concept_cross_section('20240115')
# Returns all concept-stock relationships for the date

# Search concept sectors
df = reader.search_concepts('芯片')  # Fuzzy search

# List all concept sectors
df = reader.get_all_concepts()  # concept_code, concept_name

# Force refresh data from GitHub
reader.refresh_concept_data()

# Check cache status
info = reader.get_concept_cache_info()
reader.close()

Data Characteristics:

  • Source: jquantdatasync GitHub Releases
  • Format: SCD (Slowly Changing Dimension) with indate/outdate
  • Update: Daily auto-download with local caching
  • Cache Location: .conceptcache/allconceptspitscd.csv

Point-in-Time (PIT) Queries

For backtesting, always use PIT queries to avoid look-ahead bias:

from tushare_db import DataReader

reader = DataReader(db_path="tushare.db")

# ❌ Wrong: Current snapshot (causes look-ahead bias)
df = reader.get_index_member_all(l1_code='801010.SI', is_new='Y')

# ✅ Correct: PIT query as of historical date
df = reader.get_index_member_all(
    l1_code='801010.SI',
    trade_date='20230115'  # Only stocks in sector on this date
)

# ✅ Correct: Concept sector PIT query
df = reader.get_concept_stocks('20230115', concept_name='人工智能')

Correct SQL for PIT joins:

-- For index_member_all
SELECT *
FROM my_data d
JOIN index_member_all im ON d.ts_code = im.ts_code
WHERE im.in_date <= d.trade_date
  AND (im.out_date IS NULL OR im.out_date > d.trade_date)

-- For concept sectors (from jquant_data_sync)
SELECT *
FROM my_data d
JOIN concept_data c ON d.ts_code = c.ts_code
WHERE c.in_date <= d.trade_date
  AND c.out_date >= d.trade_date

Manual PIT data backfill:

# If database lacks historical out_date data
python scripts/backfill_index_member_pit.py

Key Notes

  • Date format: YYYYMMDD string (e.g., '20240101')
  • Adjustment types:

- adjfactor table stores raw Tushare adjustment factors - qfq (forward): price (factor / latestfactor) — latest price = market price - hfq (backward): price factor — historical prices stay fixed - DataReader handles calculation automatically via adj='qfq' or adj='hfq'

  • Rate limit profiles: 'trial', 'standard', 'pro'

Implemented Tables

External Data Sources

Data Source Type Access Update Description
concept_data External DataReader.getconcept*() Daily auto-download A-share concept sectors from jquantdatasync

基础信息表(静态数据)

Table Tushare API Primary Keys 官方最早日期 说明
trade_cal trade_cal exchange, cal_date 19910404 交易日历,exchange='SSE'
stock_basic stock_basic ts_code - 股票列表
stock_company stock_company ts_code - 上市公司信息
index_basic index_basic ts_code - 指数列表
index_classify index_classify industry_code - 申万行业分类,src='SW2021'
indexmemberall indexmemberall tscode, l3code, in_date - 申万行业成分股(PIT支持)
hs_const hs_const tscode, indate 20141117 沪深港通成分
ths_index ths_index ts_code - 同花顺板块列表 (见下方说明)
ths_member ths_member tscode, concode - 同花顺板块成分股

日频时间序列表

Table Tushare API Primary Keys 官方最早日期 说明
daily daily tscode, tradedate 19910404 日线行情
adj_factor adj_factor tscode, tradedate 19910403 复权因子
daily_basic daily_basic tscode, tradedate 19910404 每日指标(PE/PB/市值)
stkauctiono stkauctiono tscode, tradedate - 股票开盘集合竞价数据
index_daily index_daily tscode, tradedate 19901219 指数日线
moneyflow moneyflow tscode, tradedate 20100104 个股资金流向
cyq_perf cyq_perf tscode, tradedate 20180102 筹码分布绩效
stkfactorpro stkfactorpro tscode, tradedate 20050104 技术因子(MACD/KDJ等)
limitlistd limitlistd tscode, tradedate, limit 20200102 涨跌停统计 (U/D/Z)
margin_detail margin_detail tscode, tradedate 20100331 融资融券明细
margin margin tradedate, exchangeid 20100331 两融余额汇总(市场级别,SSE/SZSE)
sw_daily sw_daily tscode, tradedate 20210104 申万指数日线 (SW2021版)
ths_daily ths_daily tscode, tradedate 20180102 同花顺板块日行情
moneyflow_dc moneyflow_dc tscode, tradedate 20230911 个股资金流(东财)
moneyflowinddc moneyflowinddc tradedate, tscode 20230912 行业资金流(东财)
dc_index dc_index tscode, tradedate 20241220 龙虎榜个股明细(东财)
dc_member dc_member tscode, tradedate, con_code 20241220 龙虎榜机构席位(东财)
top_list top_list tradedate, tscode, reason 20050101 龙虎榜个股上榜(净买入+上榜原因,同票多原因多行)
top_inst top_inst (无主键,按日先删后插) 20050101 龙虎榜营业部席位买卖明细(含多个「机构专用」席位)
hm_detail hm_detail tradedate, tscode, hmname, hmorgs 20220101 每日游资明细(游资经多个营业部)
hm_list hm_list name — 游资名录(维度表,无日期)
kpl_concept kpl_concept tscode, tradedate 20241014 开盘啦题材列表
kplconceptcons kplconceptcons tscode, concode, trade_date 20241014 开盘啦题材成分
index_weight index_weight indexcode, tradedate, con_code 20050930 指数成分权重(月度)

财务数据表(季度更新)

Table Tushare API Primary Keys 官方最早日期 说明
finaindicatorvip finaindicatorvip tscode, enddate 19901231 财务指标
income income_vip tscode, enddate, report_type 19941231 利润表
balancesheet balancesheet_vip tscode, enddate, report_type 19891231 资产负债表
cashflow cashflow_vip tscode, enddate, report_type 19980331 现金流量表
forecast forecast_vip tscode, anndate, end_date, type - 业绩预告
express express_vip tscode, anndate, end_date - 业绩快报
dividend dividend tscode, enddate 19901231 分红送股

基金数据表

Table Tushare API Primary Keys 官方最早日期 说明
fund_basic fund_basic ts_code - 基金列表 (E=场内 O=场外)
fund_daily fund_daily tscode, tradedate 20050104 场内基金日线行情
fund_nav fund_nav tscode, navdate 20000101 基金净值 (单位/累计/复权)
fund_div fund_div tscode, anndate 19991231 基金分红
fund_portfolio fund_portfolio tscode, enddate, symbol 20000101 基金持仓 (十大重仓股)
fund_share fund_share tscode, tradedate 20050104 基金份额变动
fund_manager fund_manager tscode, begindate, name 19991231 基金经理
fund_adj fund_adj tscode, tradedate 20050104 基金复权因子
fund_company fund_company name - 基金公司信息
etf_basic etf_basic ts_code - ETF基本信息
etf_share etfsharesize tscode, tradedate 20100101 ETF份额规模
etf_index etf_index ts_code - ETF基准指数

沪深港通数据表

Table Tushare API Primary Keys 官方最早日期 说明
moneyflow_hsgt moneyflow_hsgt trade_date 20141117 沪深港通资金流向 (北向/南向)
hsgt_top10 hsgt_top10 tradedate, tscode, market_type 20141117 沪深股通十大成交股
ggt_top10 ggt_top10 tradedate, tscode, market_type 20141117 港股通十大成交股
ggt_daily ggt_daily trade_date 20141117 港股通每日成交统计
hk_hold hk_hold code, trade_date, exchange 20141117 沪深港通持股明细

股东数据表(季度更新)

Table Tushare API Primary Keys 官方最早日期 说明
top10_floatholders top10_floatholders tscode, enddate, holder_name 20071231 前十大流通股东
stk_holdernumber stk_holdernumber tscode, enddate 20160115 股东户数
stk_rewards stk_rewards tscode, enddate, name 20140101 高管薪酬和持股

同花顺板块说明

ths_index 表包含以下类型的板块指数,本项目仅实现部分类型:

类型 说明 数量 实现状态
I 行业板块 1077 ✅ 已实现
N 概念板块 411 ✅ 已实现
R 地域板块 33 ✅ 已实现
BB 宽基指数 46 ✅ 已实现
S 特色指数 126 ❌ 未实现 (技术面筛选,使用少)
ST 风格指数 21 ❌ 未实现 (可用其他方式构建)
TH 同花顺特色 10 ❌ 未实现 (专有指数,可替代性强)

For column details and parameter meanings, invoke /tushare-finance <api_name>.

Special Notes

Update Frequency

Table Frequency Notes
concept_data Daily Auto-downloaded from GitHub Release, cached locally
index_weight Monthly Updated on the last trading day of each month; query using month-end dates
finaindicatorvip Quarterly Financial indicator data; use end_date as the reporting period (e.g., 20231231)
income Quarterly Income statement data; use end_date as the reporting period
balancesheet Quarterly Balance sheet data; use end_date as the reporting period
cashflow Quarterly Cash flow statement data; use end_date as the reporting period
forecast Quarterly Earnings forecast (预增/预减/扭亏); use end_date as the reporting period
express Quarterly Earnings express (业绩快报); use end_date as the reporting period
dividend Quarterly/Annual Dividend data; use end_date as the reporting period
fund_portfolio Quarterly Fund holdings data; use end_date as the reporting period
trade_cal Static Trading calendar; query using cal_date field

Date Field Notes

  • Daily data tables: Use trade_date field for queries
  • Financial data tables: Use end_date field (reporting period), not announcement date
  • Fund NAV tables: Use nav_date field
  • Membership tables (hsconst, indexmemberall): Contains indate/out_date fields for tracking historical changes
  • Concept sectors: Use PIT queries with indate/outdate range

Important Query Tips

  1. index_weight: Only query for month-end dates (e.g., 20240131, 20240229); daily data is not available
  2. Financial reports: When querying quarterly data, use the period-end date (e.g., 20240331 for Q1 2024)
  3. tradecal: Use isopen='1' to filter trading days only
  4. hsconst: Contains historical records; filter by indate and out_date to get valid constituents for a specific date
  5. Concept sectors: Always use PIT queries (e.g., getconceptstocks('20240115', concept_name='AI')) to avoid look-ahead bias