2021 年,我发布了 efinance,一个专注从东方财富获取股票、ETF 、期货、基金等数据的 Python 库。至今累计获得 3.4k ⭐。开发难度不大,但它的火爆说明了量化研究者对高质量数据的需求非常大。
当时接口没有严格限流,efinance 上手简单、数据齐全,受到广泛好评。可惜到 2025 年上半年,东方财富开始限制匿名接口调用,频繁访问会被阻断,需要验证或审核。通过后又可能被拉入“小黑屋”,反复循环。
AI 的快速发展降低了量化研究门槛,参与人数激增,导致数据提供方带宽成本上升,限流在所难免。但限流并不能阻挡大家的热情,自此,efinance 仓库收到越来越多关于数据稳定性的问题反馈。可见,一个稳定且价格合理的数据源,已经成为量化研究者的刚需。
为了解决这一痛点,我和团队启动了新项目 TickFlow,提供覆盖 A 股行情、K 线、财务数据的 API 。目标是:
开发过程中,有几十位 GitHub 网友作为早期用户,他们见证了 TickFlow 从 0 到 1 的成长。解决他们的需求,也能覆盖大部分量化研究者的需求。
TickFlow 区分两类用户:
免费用户无需注册和 API key ;高级用户需注册获取 API key ,以保障流量和权限管理。
| 特性 | TickFlow | Tushare | Akshare |
|---|---|---|---|
| 数据稳定性 | ✅ 可靠 | ✅ 可靠 | ❌ 完全爬虫,易中断 |
| 日 K 线 | 全量历史,免费层支持不复权、等差/等比复权,可批量获取 | 全量历史,免费层仅不复权 | 全量历史,复权依赖数据源 |
| 分钟 K 线 | 近一年历史 + 当日实时 | j 近十几年历史+高价订阅实时 K 线 | 仅近几天分钟级 |
| 实时行情 | 全量 A 股、ETF 、指数 | 需付费且昂贵 | ❌ 无可靠实时行情 |
| 接入门槛 | 5 分钟上手,文档齐全,SDK + API 接入 | 低 | 低 |
| 数据完整性 | 历史 K 线、财务、除权因子 | 免费版有限,高阶贵 | 数据缺失多,零散 |
| 开发体验 | 免费套餐长期可用,按需升级 | 免费版受限,高阶贵 | 稳定性差,维护成本高 |
TickFlow 的优势:低门槛、稳定、免费套餐可长期使用、高阶功能按需升级。
TickFlow 提供官方 Python SDK,支持 A 股、ETF 、美股、港股、国内期货等。
# 安装完整版(支持 DataFrame 与进度条)
pip install "tickflow[all]" --upgrade
# 安装基础版
pip install tickflow
支持 Python 3.9+,推荐 3.10+。
from tickflow import TickFlow
tf = TickFlow.free() # 免费服务
# 获取日 K 线
df = tf.klines.get("600000.SH", period="1d", count=100, as_dataframe=True)
print(df.tail())
# 获取标的信息
instruments = tf.instruments.batch(symbols=["600000.SH", "000001.SZ"])
print(instruments)
特点:
获取 API Key
登录 tickflow.org,在控制台生成 API key 。
配置认证
方式一:直接传入
from tickflow import TickFlow
tf = TickFlow(api_key="your-api-key")
方式二:环境变量( Windows / Linux / Mac )
# Linux / Mac
export TICKFLOW_API_KEY="your-api-key"
# Windows CMD
set TICKFLOW_API_KEY=your-api-key
from tickflow import TickFlow
tf = TickFlow() # 自动读取环境变量
quotes = tf.quotes.get(symbols=["600000.SH", "000001.SZ"])
for q in quotes:
print(f"{q['symbol']}: {q['last_price']}")
完整服务特点:
统一格式:**代码.市场后缀**,示例:
600000.SH(浦发银行)、000001.SZ(平安银行) 510300.SH(沪深 300 ETF ) 000001.SH(上证指数) au2604.SHF(上期所黄金主力合约) | 后缀 | 市场 | 说明 |
|---|---|---|
| SH | 上海证券交易所 | 沪市 A 股、ETF 、债券等 |
| SZ | 深圳证券交易所 | 深市 A 股、创业板、ETF 等 |
| BJ | 北京证券交易所 | 北交所股票 |
| SHF | 上海期货交易所 | 上期所期货 |
| DCE | 大连商品交易所 | 大商所期货 |
| ZCE | 郑州商品交易所 | 郑商所期货 |
| CFX | 中国金融期货交易所 | 股指/国债期货 |
| INE | 上海国际能源交易中心 | 原油等期货 |
| GFE | 广州期货交易所 | 广期所期货 |
| US | 美股 | 美国证券市场 |
| HK | 港股 | 香港联交所 |
支持 A 股、国内期货,部分美股、港股接口已支持格式,但暂无数据。
# 单标的获取日 K 线
klines = tf.klines.get("600000.SH", period="1d", count=10000, as_dataframe=True)
print(klines.tail(5))
# 批量获取多标的
symbols = ["600000.SH", "000001.SZ", "600519.SH"]
dfs = tf.klines.batch(symbols, period="1d", count=10000, as_dataframe=True, show_progress=True)
print(list(dfs.keys()))
# 单标的 1 分钟 K 线
df = tf.klines.intraday("600000.SH", period="1m", as_dataframe=True)
print(df.tail())
# 批量
dfs = tf.klines.intraday_batch(["600000.SH", "000001.SZ"], as_dataframe=True, show_progress=True)
print(dfs["600000.SH"].tail())
# 按标的查询
quotes = tf.quotes.get(symbols=["600000.SH", "000001.SZ"], as_dataframe=True)
# 按标的池查询
quotes_a = tf.quotes.get(universes=["CN_Equity_A"], as_dataframe=True)
quotes_etf = tf.quotes.get(universes=["CN_ETF"], as_dataframe=True)
import asyncio
from tickflow import AsyncTickFlow
async def main():
async with AsyncTickFlow(api_key="your-api-key") as tf:
df = await tf.klines.get("600000.SH", as_dataframe=True)
print(df.tail())
tasks = [tf.klines.get(s, as_dataframe=True) for s in ["600000.SH", "000001.SZ"]]
results = await asyncio.gather(*tasks)
asyncio.run(main())
TickFlow 提供低延迟、稳定、易用的行情数据服务,适合量化研究者快速上手:
无论你是初学者还是专业量化团队,TickFlow 都能帮助你专注策略开发,而非数据抓取。
1
somebodybbb 11 小时 24 分钟前
有 WS 订阅推送吗?
|
2
alex0618 OP @somebodybbb 现在还没有。后续 1-2 个月会考虑支持。
|
3
somebodybbb 11 小时 16 分钟前
@alex0618 需要港和 A 的实时 WS 推送,加油
|
4
monmon 10 小时 15 分钟前
赞啊大佬!
|
5
azhangbing 10 小时 0 分钟前 via iPhone
我来支持群主 最近也在做量化
|
6
zenoor 6 小时 13 分钟前 via iPhone
免费版有最基础的 pe pb roe 指标吗
|
7
kuhung 5 小时 53 分钟前
强的 支持越多越好
|