> Source: https://ashareapi.com/docs/migrate-from-tushare/  ·  Markdown version for LLMs / AI agents

迁移指南

# 从 Tushare 迁移到 ashareapi
 多数 Tushare 调用有对应端点：迁移 = 换 URL + 改 4 个字段名。下面是逐项对照表、可运行的改写示例，以及迁移不了的部分（我们不掩饰）。

 一句话结论
 **行情 / K线 / 财务三表 / 财务指标 / 资金流 / 龙虎榜 / 融资融券 / 大宗 / 分红 / 股东 / 可转债条款 / ETF / 新股 / 业绩事件** 都有对应端点，换 URL 即可；**分钟级、新闻/公告/研报全文、指数日线、交易日历** 我们不提供 —— 这几项请继续用 Tushare，两边**可以同时用**。

## 能迁 / 不能迁
 能迁（换 URL 即可）

-
 行情快照 · 日/周/月 K 线

-
 利润表 / 资产负债表 / 现金流量表（多期）

-
 主力资金流（当日 / 5 / 10 / 20 日）

-
 龙虎榜（机构 / 游资 / 活跃席位分榜）· 融资融券 · 大宗交易

-
 分红送转 · 十大股东 · 股东户数 · 嵌码分布

-
 可转债条款 · ETF 概览 · 新股日历 · 业绩与解禁等事件标签

-
 今日无需注册就能调（免费端点连 Key 都不要）

 不能迁（请继续用 Tushare）

-
 **分钟级**行情（历史分钟 / 实时分钟）

-
 **新闻 / 公告 / 研报全文**与政策库（我们只提供研报**脱水摘要**）

-
 **指数日线**（我们有市场画像与估值分位，不是指数 K 线）

-
 **交易日历**（我们有「财经日历」= 宏观数据发布排期，两者不是一回事）

-
 全量标的列表批量导出（我们只提供按关键词检索）

## 四步改完
 1 把 ts_code 改成带前缀的 code
 Tushare 用后缀式（600667.SH），我们用**前缀式**（sh600667）。港股 00700.HK → hk00700；美股 AAPL → usAAPL。

```
# Tushare # 我们
# 600667.SH → sh600667
# 000001.SZ → sz000001
# 830799.BJ → bj830799
# 00700.HK → hk00700
# AAPL → usAAPL

# 一行转换（Python）
def to_code(ts_code: str) -> str:
 """600667.SH → sh600667（A股）· 00700.HK → hk00700 · AAPL → usAAPL"""
 if "." not in ts_code:
 return "us" + ts_code.upper()
 num, mkt = ts_code.split(".")
 return {"SH": "sh", "SZ": "sz", "BJ": "bj", "HK": "hk"}[mkt] + num
```

 2 换 URL：接口按对照表映射
 pro.daily → /v1/kline；pro.moneyflow → /v1/fund；pro.fina_indicator → /v1/finance（详见下一节对照表）。

```
# Tushare
# pro.daily(ts_code="600667.SH", start_date="20260101", end_date="20260921")
# 我们（无区间参数：取最近 N 根，回来自己按 date 过滤）
curl "https://api.ashareapi.com/v1/kline?code=sh600667&period=day&count=30"
```

 3 改 4 个字段名
 只有四个常用字段名不同（close→last · trade_date→date · 后缀码→前缀码 · 代码字段），其余（open / high / low / volume / amount）同名同义。

```
{
 "ok": true, "endpoint": "kline", "tier": "free",
 "elapsed_ms": 615, "source": "multi",
 "data": [
 {"date": "2026-09-21", "open": "20.64", "last": "20.30",
 "high": "20.78", "low": "20.12",
 "volume": "2213526", // 手（与 Tushare vol 同为手）
 "amount": "4510589168", // 元
 "turnover": "10.58"} // 换手率（%）
 ]
}
```

 4 包一层：统一信封 + 限流处理
 所有端点返回同一个信封（ok / endpoint / tier / elapsed_ms / source / data）。429 = 超频；上游失败则 ok=false 且**不扣次数**。

```
import requests

BASE = "https://api.ashareapi.com/v1"
H = {} # 免费端点：无需 Key
# 付费端点加上（推荐请求头，密钥不进日志）：
# H = {"Authorization": "Bearer ct-你的Key"}

def get(path: str, **params):
 r = requests.get(f"{BASE}/{path}", params=params, headers=H, timeout=30)
 if r.status_code == 429: # 匿名 5 次/分；解一次 PoW 挑战可到 60 次/分
 raise RuntimeError("rate limited — 降频，或见 /v1/challenge")
 r.raise_for_status()
 body = r.json()
 if not body.get("ok"):
 raise RuntimeError(f"upstream failed (not counted): {body}")
 return body["data"]
```

## 接口对照表
 左列是 Tushare 官方文档里的接口名；右列是等价（或最接近）的端点。**没有等价端点的不硬凑**，见备注。
 |
| | Tushare Pro | ashareapi | 备注

| | pro.stock_basic | GET /v1/search | 按名称/代码检索与消歧；**不提供全量列表批量导出**

| | pro.daily / weekly / monthly | GET /v1/kline | period=day|week|month，count 取最近 N 根（无区间参数）

| | pro.daily_basic | GET /v1/snapshot（PE/PB/换手/市值/股本 + 涨停价，一次给全） | **这条基本 1:1 对应**（仅 A 股；要 PE/PB 之外的历史序列用 /v1/screen 估值因子）

| | pro.fina_indicator | GET /v1/finance | 三大报表多期（num 控制期数），ROE / 毛利率等在返回里

| | pro.income / balancesheet / cashflow | GET /v1/finance | 三表一次返回，不需要三次调用

| | pro.moneyflow | GET /v1/fund | 主力资金（当日/5/10/20 日净流入 + 全市场排名）

| | pro.top_list / pro.top_inst | GET /v1/lhb | type=institution 机构 / hotmoney 游资 / activeseat 活跃席位

| | pro.margin_detail | GET /v1/margin-trade | 融资余额 / 买入 / 偿还 / 融券

| | pro.block_trade | GET /v1/block-trade | 成交价 / 折溢价 / 成交量 / 买卖方

| | pro.dividend | GET /v1/dividend | years 控年份（默认 3 年）

| | pro.top10_holders / top10_floatholders | GET /v1/shareholder | 十大股东 + 股东户数 + 机构持仓

| | pro.stk_holdernumber | GET /v1/shareholder | 股东户数（筹码集中度）

| | pro.cb_daily / cb_basic | GET /v1/bond | **条款为主**：转股价 / 强赎触发 / 双低 / 溢价率；不提供转债日线序列

| | pro.fund_daily / fund_basic（ETF） | GET /v1/etf | 行情 / 规模 / 溢折率 / 资金流

| | pro.new_share | GET /v1/ipo | 发行 / 申购 / 中签 / 上市日历（days 控天数）

| | pro.forecast / express | GET /v1/events | 42 类事件标签（业绩 / 解禁 / 回购 / 定增 / 大宗…）

| | pro.concept / ths_index / ths_member | GET /v1/sector · /v1/sector-valuation | 板块行情榜与板块估值（含历史分位）；**成分股名单没有独立端点**

| | pro.moneyflow_hsgt / hsgt_top10 | GET /v1/fund | 个股维度含两融与机构席位；**没有全市场北向资金分时**

| | pro.trade_cal（交易日历） | ❌ | 我们的 /v1/calendar 是**财经日历**（宏观数据发布排期），不是交易日历

| | pro.index_daily（指数日线） | ❌ | 提供 /v1/market-overview（大盘画像 / 风格轮动 / 估值分位），不是指数 K 线

| | pro.news / anns_d / report_rc | ❌ | 不做新闻与公告全文；研报只有**脱水摘要**（/v1/dehydrated，需 Key）

| | 分钟线 / 实时分钟 | ❌ | 不做分钟级数据

 pro.stock_basic
 GET /v1/search
 按名称/代码检索与消歧；**不提供全量列表批量导出**

 pro.daily / weekly / monthly
 GET /v1/kline
 period=day|week|month，count 取最近 N 根（无区间参数）

 pro.daily_basic
 GET /v1/snapshot（PE/PB/换手/市值/股本 + 涨停价，一次给全）
 **这条基本 1:1 对应**（仅 A 股；要 PE/PB 之外的历史序列用 /v1/screen 估值因子）

 pro.fina_indicator
 GET /v1/finance
 三大报表多期（num 控制期数），ROE / 毛利率等在返回里

 pro.income / balancesheet / cashflow
 GET /v1/finance
 三表一次返回，不需要三次调用

 pro.moneyflow
 GET /v1/fund
 主力资金（当日/5/10/20 日净流入 + 全市场排名）

 pro.top_list / pro.top_inst
 GET /v1/lhb
 type=institution 机构 / hotmoney 游资 / activeseat 活跃席位

 pro.margin_detail
 GET /v1/margin-trade
 融资余额 / 买入 / 偿还 / 融券

 pro.block_trade
 GET /v1/block-trade
 成交价 / 折溢价 / 成交量 / 买卖方

 pro.dividend
 GET /v1/dividend
 years 控年份（默认 3 年）

 pro.top10_holders / top10_floatholders
 GET /v1/shareholder
 十大股东 + 股东户数 + 机构持仓

 pro.stk_holdernumber
 GET /v1/shareholder
 股东户数（筹码集中度）

 pro.cb_daily / cb_basic
 GET /v1/bond
 **条款为主**：转股价 / 强赎触发 / 双低 / 溢价率；不提供转债日线序列

 pro.fund_daily / fund_basic（ETF）
 GET /v1/etf
 行情 / 规模 / 溢折率 / 资金流

 pro.new_share
 GET /v1/ipo
 发行 / 申购 / 中签 / 上市日历（days 控天数）

 pro.forecast / express
 GET /v1/events
 42 类事件标签（业绩 / 解禁 / 回购 / 定增 / 大宗…）

 pro.concept / ths_index / ths_member
 GET /v1/sector · /v1/sector-valuation
 板块行情榜与板块估值（含历史分位）；**成分股名单没有独立端点**

 pro.moneyflow_hsgt / hsgt_top10
 GET /v1/fund
 个股维度含两融与机构席位；**没有全市场北向资金分时**

 pro.trade_cal（交易日历）
 ❌
 我们的 /v1/calendar 是**财经日历**（宏观数据发布排期），不是交易日历

 pro.index_daily（指数日线）
 ❌
 提供 /v1/market-overview（大盘画像 / 风格轮动 / 估值分位），不是指数 K 线

 pro.news / anns_d / report_rc
 ❌
 不做新闻与公告全文；研报只有**脱水摘要**（/v1/dehydrated，需 Key）

 分钟线 / 实时分钟
 ❌
 不做分钟级数据

## 字段映射
 |
| | Tushare | ashareapi | 说明

| | ts_code | code | 600667.SH → sh600667（前缀式）

| | trade_date | date | 20260918 → 2026-09-18（带横线）

| | close | last | 收盘/最新价字段名不同，含义一致

| | vol | volume | 同为**手**（×100 = 股）

| | amount | amount | 元

| | pct_chg | （自己算） | 相邻两根 close 现算，避免口径差异

| | turnover_rate | turnover（/v1/quote） | 换手率（%）

| | pe_ttm / pb / ps_ttm / total_mv | （/v1/screen 因子） | 因子表达式里直接写 PE_TTM / PB / PS_TTM / TotalMV

 ts_code
 code
 600667.SH → sh600667（前缀式）

 trade_date
 date
 20260918 → 2026-09-18（带横线）

 close
 last
 收盘/最新价字段名不同，含义一致

 vol
 volume
 同为**手**（×100 = 股）

 amount
 amount
 元

 pct_chg
 （自己算）
 相邻两根 close 现算，避免口径差异

 turnover_rate
 turnover（/v1/quote）
 换手率（%）

 pe_ttm / pb / ps_ttm / total_mv
 （/v1/screen 因子）
 因子表达式里直接写 PE_TTM / PB / PS_TTM / TotalMV

## 完整改写示例
 同一个需求：拿日线 + 资金流 + 机构龙虎榜。上面是 Tushare，下面是我们（可直接跑，K线部分无需 Key）。
 改写前（Tushare）
```
import tushare as ts

pro = ts.pro_api("你的 token")

bars = pro.daily(ts_code="600667.SH",
 start_date="20260101", end_date="20260921")
basic = pro.daily_basic(ts_code="600667.SH")
flow = pro.moneyflow(ts_code="600667.SH")
top = pro.top_list(trade_date="20260918")

for r in bars.itertuples():
 print(r.trade_date, r.close, r.vol)
```
 改写后（ashareapi）
```
import requests

BASE = "https://api.ashareapi.com/v1"
H = {} # 免费端点无需 Key；付费端点加 {"Authorization": "Bearer ct-你的Key"}

def get(path, **params):
 r = requests.get(f"{BASE}/{path}", params=params, headers=H, timeout=30)
 r.raise_for_status()
 body = r.json()
 if not body.get("ok"):
 raise RuntimeError(body)
 return body["data"]

# 1) 日线（免费，无需 Key）——等价 pro.daily（本调用去掉了区间参数，取最近 30 根）
bars = get("kline", code="sh600667", period="day", count=30)
for r in bars:
 print(r["date"], r["last"], r["volume"]) # 原 close → last

# 2) 资金流：主力净流入 + 龙虎榜 + 大宗 + 两融（需 Key）
# funds = get("fund", code="sh600667")

# 3) 机构龙虎榜分榜（需 Key）
# lhb = get("lhb", type="institution")

# 4) 区间过滤在本地做（API 只提供 count，不提供 start/end）
bars_2026 = [r for r in bars if r["date"] >= "2026-01-01"]
```

## 常见问题
 Tushare 和我们能同时用吗？
 能，而且常见：Tushare 取分钟与新闻公告，我们取实时快照、资金面、龙虎榜与 MCP 接入。两边不冲突，不需要二选一。

 我用了 start_date / end_date 区间，怎么迁？
 /v1/kline 用 count 取最近 N 根（不提供区间参数）——先取回一段，再在本地按 date 过滤即可。这样也避免"区间内无数据"被当成接口错误。

 字段名不一样，改起来麻烦吗？
 常用字段只有 4 个不同（ts_code→code · trade_date→date · close→last · vol→volume），其余 open / high / low / amount 同名同义。换手率在 /v1/quote 的 turnover 字段。

 限流和额度怎么算？
 免费端点匿名 5 次/分（每次最多 250 根 K 线、每天最多 10 万条），解一次 PoW 挑战可到 60 次/分；付费 Key 按档位（体验 ¥9.9 / 1 万次 · 标准 ¥29.9 / 10 万次 · 专业 ¥99 / 50 万次 · 不限量 ¥199 每月）。**上游取数失败会自动换源且不扣次数**。

 我要的接口这页没写，怎么办？
 先看端点清单（32 个端点按分类），或用 /v1/search 搜关键词确认代码。确实没有的（分钟、新闻公告全文、指数日线、交易日历）请继续用 Tushare——这是我们的边界，写在这里免得你白迁移。

 最后更新: 2026-09-21
 Tushare 侧接口名与字段名取自 Tushare Pro 官方文档（tushare.pro/document/2），按官方目录核对于 2026-09-21；我们侧字段取自线上真实返回（quote / kline / hot / market-overview / changedist 于 2026-09-21 实测）。两侧口径都可能变更，以官方页面为准。

 还没试过？
 免费端点无需 Key，先用 curl 跑一次，再决定要不要把脚本搬过来。

 [快速开始](/docs)[端点清单](/endpoints)[与 Tushare 逐项对比](/compare/tushare)
