从 Tushare 迁移到 ashareapi
多数 Tushare 调用有对应端点:迁移 = 换 URL + 改 4 个字段名。下面是逐项对照表、可运行的改写示例,以及迁移不了的部分(我们不掩饰)。
行情 / K线 / 财务三表 / 财务指标 / 资金流 / 龙虎榜 / 融资融券 / 大宗 / 分红 / 股东 / 可转债条款 / ETF / 新股 / 业绩事件 都有对应端点,换 URL 即可;分钟级、新闻/公告/研报全文、指数日线、交易日历 我们不提供 —— 这几项请继续用 Tushare,两边可以同时用。
能迁 / 不能迁
- 行情快照 · 日/周/月 K 线
- 利润表 / 资产负债表 / 现金流量表(多期)
- 主力资金流(当日 / 5 / 10 / 20 日)
- 龙虎榜(机构 / 游资 / 活跃席位分榜)· 融资融券 · 大宗交易
- 分红送转 · 十大股东 · 股东户数 · 嵌码分布
- 可转债条款 · ETF 概览 · 新股日历 · 业绩与解禁等事件标签
- 今日无需注册就能调(免费端点连 Key 都不要)
- 分钟级行情(历史分钟 / 实时分钟)
- 新闻 / 公告 / 研报全文与政策库(我们只提供研报脱水摘要)
- 指数日线(我们有市场画像与估值分位,不是指数 K 线)
- 交易日历(我们有「财经日历」= 宏观数据发布排期,两者不是一回事)
- 全量标的列表批量导出(我们只提供按关键词检索)
四步改完
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] + numpro.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"只有四个常用字段名不同(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"} // 换手率(%)
]
}所有端点返回同一个信封(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) |
| 分钟线 / 实时分钟 | ❌ | 不做分钟级数据 |
字段映射
| 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 |
完整改写示例
同一个需求:拿日线 + 资金流 + 机构龙虎榜。上面是 Tushare,下面是我们(可直接跑,K线部分无需 Key)。
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)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 取分钟与新闻公告,我们取实时快照、资金面、龙虎榜与 MCP 接入。两边不冲突,不需要二选一。
/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 跑一次,再决定要不要把脚本搬过来。