迁移指南

从 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 官方文档里的接口名;右列是等价(或最接近)的端点。没有等价端点的不硬凑,见备注。

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)
分钟线 / 实时分钟
❌
不做分钟级数据

字段映射

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 次/分,解一次 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 跑一次,再决定要不要把脚本搬过来。