K 线数据
获取单只股票的历史 K 线
单次最多获取 10000 根 K 线
复制
from tickflow import TickFlow
tf = TickFlow(api_key="your-api-key")
# 获取最近 100 根日 K 线(默认前复权)
df = tf.klines.get(
"600000.SH",
period="1d",
count=100,
as_dataframe=True
)
print(df.tail())
复制
symbol timestamp trade_date trade_time open high low close volume amount
95 600000.SH 1769616000000 2026-01-29 2026-01-29 00:00:00 10.03 10.19 9.88 10.15 1821647 1.823281e+09
96 600000.SH 1769702400000 2026-01-30 2026-01-30 00:00:00 10.14 10.28 10.01 10.04 1104368 1.119322e+09
97 600000.SH 1769961600000 2026-02-02 2026-02-02 00:00:00 10.07 10.25 10.03 10.06 1057712 1.072786e+09
98 600000.SH 1770048000000 2026-02-03 2026-02-03 00:00:00 10.06 10.07 9.91 10.02 776695 7.755098e+08
99 600000.SH 1770181825000 2026-02-04 2026-02-04 13:10:25 10.00 10.15 9.98 10.13 630766 6.367006e+08
复权类型
K 线接口支持adjust 参数指定复权类型:
| 值 | 含义 | 说明 |
|---|---|---|
"forward" | 比例前复权(默认) | 以最新价格为基准,历史价格按比例向前调整 |
"backward" | 比例后复权 | 以上市首日价格为基准,后续价格按比例向后调整 |
"forward_additive" | 加减法前复权 | 以最新价格为基准,历史价格按加减法向前调整 |
"backward_additive" | 加减法后复权 | 以上市首日价格为基准,后续价格按加减法向后调整 |
"none" | 不复权 | 返回原始未调整价格 |
复制
# 前复权(默认)
df_qfq = tf.klines.get("600519.SH", count=50, as_dataframe=True)
# 不复权
df_raw = tf.klines.get("600519.SH", count=50, adjust="none", as_dataframe=True)
# 后复权
df_hfq = tf.klines.get("600519.SH", count=50, adjust="backward", as_dataframe=True)
# 对比不同复权方式下的最新收盘价
print(f"前复权: {df_qfq['close'].iloc[-1]}")
print(f"不复权: {df_raw['close'].iloc[-1]}")
print(f"后复权: {df_hfq['close'].iloc[-1]}")
按时间范围查询
复制
import datetime
from tickflow import TickFlow
tf = TickFlow(api_key="your-api-key")
# 将日期转换为毫秒时间戳
start = int(datetime.datetime(2024, 1, 1).timestamp() * 1000)
end = int(datetime.datetime(2024, 12, 31).timestamp() * 1000)
df = tf.klines.get(
"600000.SH",
period="1d",
start_time=start,
end_time=end,
# 单次最多获取 10000 根 K 线
count=10000,
as_dataframe=True
)
print(f"获取到 {len(df)} 根 K 线")
print(df.tail())
复制
获取到 242 根 K 线
symbol name timestamp trade_date trade_time open high low close volume amount
237 600000.SH 浦发银行 1735056000000 2024-12-25 2024-12-25 00:00:00 9.835649 10.088094 9.835649 10.049256 727396 749135069.0
238 600000.SH 浦发银行 1735142400000 2024-12-26 2024-12-26 00:00:00 10.049256 10.088094 9.864777 10.039546 611522 628394287.0
239 600000.SH 浦发银行 1735228800000 2024-12-27 2024-12-27 00:00:00 10.029837 10.088094 9.825939 10.058965 695064 714702134.0
240 600000.SH 浦发银行 1735488000000 2024-12-30 2024-12-30 00:00:00 10.039546 10.185188 10.010418 10.165769 784778 818657792.0
241 600000.SH 浦发银行 1735574400000 2024-12-31 2024-12-31 00:00:00 10.126931 10.253154 9.981290 9.990999 577834 602393523.0
批量获取大量股票
批量接口自动将标的列表分批并发请求。默认每批 100 个标的,可通过
batch_size 参数调整。复制
# 获取上交所全部标的
instruments = tf.exchanges.get_instruments("SH")
symbols = [inst["symbol"] for inst in instruments]
print(f"共 {len(symbols)} 只股票")
# 批量获取前复权 K 线,显示进度条
dfs = tf.klines.batch(
symbols,
period="1d",
count=20,
as_dataframe=True,
show_progress=True,
max_workers=5
)
print(f"成功获取 {len(dfs)} 只股票的数据")
adjust 参数:
复制
# 批量获取不复权数据
dfs = tf.klines.batch(
symbols,
period="1d",
adjust="none",
as_dataframe=True,
batch_size=50,
show_progress=True,
)
获取日内分钟 K 线
复制
# 获取当日 1 分钟 K 线
df = tf.klines.intraday("600000.SH", as_dataframe=True)
print(f"今日已有 {len(df)} 根分钟 K 线")
print(df.tail())
复制
今日已有 122 根分钟 K 线
symbol timestamp trade_date trade_time open high low close volume amount
117 600000.SH 1770170700000 2026-02-04 2026-02-04 10:05:00 10.10 10.12 10.09 10.11 52340 5.294e+07
118 600000.SH 1770170760000 2026-02-04 2026-02-04 10:06:00 10.11 10.13 10.10 10.12 41230 4.172e+07
119 600000.SH 1770170820000 2026-02-04 2026-02-04 10:07:00 10.12 10.14 10.11 10.13 38920 3.940e+07
120 600000.SH 1770170880000 2026-02-04 2026-02-04 10:08:00 10.13 10.15 10.12 10.14 45100 4.569e+07
121 600000.SH 1770170940000 2026-02-04 2026-02-04 10:09:00 10.14 10.15 10.13 10.15 32810 3.328e+07
批量获取日内分钟 K 线
复制
# 批量获取多只股票的日内分钟 K 线
symbols = ["600000.SH", "000001.SZ", "600519.SH"]
dfs = tf.klines.intraday_batch(
symbols,
as_dataframe=True,
show_progress=True,
)
print(f"成功获取 {len(dfs)} 只股票的日内数据")
for symbol, df in dfs.items():
print(f"{symbol}: {len(df)} 根 K 线")
batch_size 控制每批标的数量:
复制
# 获取沪市全部股票的日内 5 分钟 K 线
instruments = tf.exchanges.get_instruments("SH", instrument_type="stock")
symbols = [inst["symbol"] for inst in instruments]
dfs = tf.klines.intraday_batch(
symbols,
period="5m",
as_dataframe=True,
show_progress=True,
batch_size=50,
# 只获取最近 5 根 K 线
count=5,
)
print(f"成功获取 {len(dfs)} 只股票的日内 5 分钟数据")
日内 K 线聚合与分析
复制
# 获取 5 分钟聚合数据
df_5m = tf.klines.intraday("600000.SH", period="5m", as_dataframe=True)
# 计算 VWAP(成交量加权平均价)
df_5m["vwap"] = (df_5m["amount"] / df_5m["volume"]).round(2)
# 获取最近 N 根分钟 K 线
df_recent = tf.klines.intraday("600000.SH", count=30, as_dataframe=True)
print(f"最近 30 根: {df_recent.iloc[0]['trade_time']} ~ {df_recent.iloc[-1]['trade_time']}")
计算技术指标
复制
import pandas as pd
df = tf.klines.get("600000.SH", period="1d", count=100, as_dataframe=True)
# 计算均线
df["ma5"] = df["close"].rolling(5).mean()
df["ma20"] = df["close"].rolling(20).mean()
# 计算 MACD
exp1 = df["close"].ewm(span=12, adjust=False).mean()
exp2 = df["close"].ewm(span=26, adjust=False).mean()
df["macd"] = exp1 - exp2
df["signal"] = df["macd"].ewm(span=9, adjust=False).mean()
print(df[["close", "ma5", "ma20", "macd", "signal"]].tail())
实时行情
获取多只股票行情
复制
quotes_df = tf.quotes.get(
symbols=["600000.SH", "000001.SZ", "600519.SH"], as_dataframe=True
)
print(quotes_df)
复制
symbol region last_price prev_close open ... volume amount timestamp trade_date trade_time
0 600519.SH CN 1525.00 1474.92 1485.00 ... 109123 1.644435e+10 1770188402000 2026-02-04 2026-02-04 15:00:02
1 000001.SZ CN 10.97 10.84 10.85 ... 695415 7.601077e+08 1770188400000 2026-02-04 2026-02-04 15:00:00
2 600000.SH CN 10.13 10.02 10.00 ... 672490 6.789721e+08 1770188400000 2026-02-04 2026-02-04 15:00:00
[3 rows x 12 columns]
获取标的池全部行情
复制
# 获取全部 A 股行情
df = tf.quotes.get(universes=["CN_Equity_A"], as_dataframe=True)
# 计算涨跌幅
df["change_pct"] = (df["last_price"] - df["prev_close"]) / df["prev_close"] * 100
# 涨幅榜
top_gainers = df.nlargest(10, "change_pct")[["symbol", "last_price", "change_pct"]]
print("涨幅榜 Top 10:")
print(top_gainers)
# 跌幅榜
top_losers = df.nsmallest(10, "change_pct")[["symbol", "last_price", "change_pct"]]
print("\n跌幅榜 Top 10:")
print(top_losers)
复制
涨幅榜 Top 10:
symbol last_price change_pct
1716 920305.BJ 10.00 24.069479
1713 300344.SZ 2.32 20.207254
3413 301119.SZ 57.70 20.008319
1067 301362.SZ 77.74 20.006175
3959 300393.SZ 10.32 20.000000
4584 688223.SH 8.40 20.000000
5275 688429.SH 18.54 20.000000
5187 300912.SZ 23.82 20.000000
371 301636.SZ 89.47 19.997318
2535 300985.SZ 25.10 19.980880
跌幅榜 Top 10:
symbol last_price change_pct
3885 300818.SZ 40.86 -16.984965
142 301396.SZ 89.38 -14.074216
1349 300017.SZ 16.72 -13.412740
59 688228.SH 173.99 -12.567839
2382 301232.SZ 210.00 -11.979210
55 300136.SZ 78.85 -11.869901
504 300785.SZ 67.65 -11.545502
916 300461.SZ 35.12 -11.290730
5233 001220.SZ 51.62 -10.583752
2216 301428.SZ 38.67 -10.444650
筛选股票
复制
df = tf.quotes.get(universes=["CN_Equity_A"], as_dataframe=True)
# 计算涨跌幅和换手率(假设已有流通股本数据)
df["change_pct"] = (df["last_price"] - df["prev_close"]) / df["prev_close"] * 100
# 筛选涨停股(假设涨停为 +10%)
limit_up = df[df["change_pct"] >= 9.9]
print(f"涨停股数量: {len(limit_up)}")
# 筛选放量上涨股票
# 成交额大于 10 亿且涨幅大于 3%
strong_stocks = df[(df["amount"] > 1e9) & (df["change_pct"] > 3)]
print(f"放量上涨股票: {len(strong_stocks)}")
除权因子
除权因子接口集成在klines 资源中,通过 ex_factors 方法获取。
获取除权因子
复制
from tickflow import TickFlow
tf = TickFlow(api_key="your-api-key")
# 获取单只或多只标的的除权因子
factors = tf.klines.ex_factors(["600519.SH", "000001.SZ"])
for symbol, entries in factors.items():
print(f"{symbol}: {len(entries)} 条除权记录")
for e in entries[:3]:
print(f" {e['timestamp']} ex_factor={e['ex_factor']:.6f}")
以 DataFrame 形式获取
复制
df = tf.klines.ex_factors(["600519.SH"], as_dataframe=True)
print(df)
复制
symbol timestamp ex_factor trade_date
0 600519.SH 1027526400000 1.118279 2002-07-25
1 600519.SH 1058112000000 1.108714 2003-07-14
2 600519.SH 1088611200000 1.311507 2004-07-01
3 600519.SH 1123171200000 1.210951 2005-08-05
4 600519.SH 1147968000000 2.006365 2006-05-19
5 600519.SH 1148400000000 1.013119 2006-05-24
6 600519.SH 1184256000000 1.006158 2007-07-13
7 600519.SH 1213545600000 1.005650 2008-06-16
8 600519.SH 1246377600000 1.007899 2009-07-01
9 600519.SH 1278259200000 1.009328 2010-07-05
10 600519.SH 1309449600000 1.112023 2011-07-01
11 600519.SH 1341417600000 1.015707 2012-07-05
12 600519.SH 1370534400000 1.032882 2013-06-07
13 600519.SH 1403625600000 1.130251 2014-06-25
14 600519.SH 1437062400000 1.119471 2015-07-17
15 600519.SH 1467302400000 1.021592 2016-07-01
16 600519.SH 1499356800000 1.015116 2017-07-07
17 600519.SH 1528992000000 1.014191 2018-06-15
18 600519.SH 1561651200000 1.014809 2019-06-28
19 600519.SH 1592928000000 1.011677 2020-06-24
20 600519.SH 1624550400000 1.009415 2021-06-25
21 600519.SH 1656518400000 1.010790 2022-06-30
22 600519.SH 1672070400000 1.012737 2022-12-27
23 600519.SH 1688054400000 1.015351 2023-06-30
24 600519.SH 1703001600000 1.011540 2023-12-20
25 600519.SH 1718726400000 1.020716 2024-06-19
26 600519.SH 1734624000000 1.015637 2024-12-20
27 600519.SH 1750867200000 1.019649 2025-06-26
28 600519.SH 1766073600000 1.017003 2025-12-19
按时间范围过滤
复制
import datetime
start = int(datetime.datetime(2020, 1, 1).timestamp() * 1000)
df = tf.klines.ex_factors(["600519.SH"], start_time=start, as_dataframe=True)
print(f"2020年以来共 {len(df)} 次除权")
print(df)
结合 K 线数据分析除权影响
复制
import datetime
symbol = "600519.SH"
# 获取除权因子
factors_df = tf.klines.ex_factors([symbol], as_dataframe=True)
latest_factor = factors_df.iloc[-1]
print(f"最近除权日: {latest_factor['trade_date']}, 因子: {latest_factor['ex_factor']:.6f}")
# 对比除权日前后的价格(不复权 vs 前复权)
ex_date = int(datetime.datetime.strptime(latest_factor["trade_date"], "%Y-%m-%d").timestamp() * 1000)
start = ex_date - 10 * 86400_000
end = ex_date + 10 * 86400_000
df_raw = tf.klines.get(symbol, start_time=start, end_time=end, adjust="none", as_dataframe=True)
df_qfq = tf.klines.get(symbol, start_time=start, end_time=end, adjust="forward", as_dataframe=True)
print(f"\n不复权价格:")
print(df_raw[["trade_date", "close"]].to_string(index=False))
print(f"\n前复权价格:")
print(df_qfq[["trade_date", "close"]].to_string(index=False))
财务数据
利润表
复制
# 获取利润表数据
income_df = tf.financials.income(["000001.SZ"], as_dataframe=True)
print(income_df.tail())
复制
symbol period_end announce_date revenue operating_cost ... non_operating_income admin_expense financial_expense selling_expense diluted_eps
149 000001.SZ 2024-09-30 2024-10-19 1.115820e+11 6.371300e+10 ... 26000000.0 NaN NaN NaN 1.94
150 000001.SZ 2024-12-31 2025-03-15 1.466950e+11 9.148900e+10 ... 37000000.0 NaN NaN NaN 2.15
151 000001.SZ 2025-03-31 2025-04-19 3.370900e+10 1.679900e+10 ... 20000000.0 NaN NaN NaN 0.62
152 000001.SZ 2025-06-30 2025-08-23 6.938500e+10 3.928300e+10 ... 25000000.0 NaN NaN NaN 1.18
153 000001.SZ 2025-09-30 2025-10-25 1.006680e+11 5.457100e+10 ... 29000000.0 NaN NaN NaN 1.87
[5 rows x 17 columns]
资产负债表
复制
balance_df = tf.financials.balance_sheet(["000001.SZ"], as_dataframe=True)
print(balance_df.tail())
复制
symbol period_end announce_date total_assets total_current_assets ... accounts_receivable accounts_payable inventory minority_interest goodwill
123 000001.SZ 2024-09-30 2024-10-19 5.745988e+12 NaN ... NaN NaN NaN NaN 7.568000e+09
124 000001.SZ 2024-12-31 2025-03-15 5.769270e+12 NaN ... NaN NaN NaN NaN 7.568000e+09
125 000001.SZ 2025-03-31 2025-04-19 5.777858e+12 NaN ... NaN NaN NaN NaN 7.568000e+09
126 000001.SZ 2025-06-30 2025-08-23 5.874961e+12 NaN ... NaN NaN NaN NaN 7.568000e+09
127 000001.SZ 2025-09-30 2025-10-25 5.766764e+12 NaN ... NaN NaN NaN NaN 7.568000e+09
现金流量表
复制
cashflow_df = tf.financials.cash_flow(["000001.SZ"], as_dataframe=True)
print(cashflow_df.tail())
复制
symbol period_end announce_date net_operating_cash_flow net_investing_cash_flow net_financing_cash_flow capex net_cash_change
124 000001.SZ 2024-09-30 2025-10-25 1.371580e+11 -1.053900e+10 -1.455320e+11 1.121000e+09 -1.950700e+10
125 000001.SZ 2024-12-31 2025-03-15 6.333600e+10 -3.185900e+10 -7.393300e+10 2.388000e+09 -4.127300e+10
126 000001.SZ 2025-03-31 2025-04-19 1.629460e+11 2.494300e+10 -1.583980e+11 3.380000e+08 2.936100e+10
127 000001.SZ 2025-06-30 2025-08-23 1.746820e+11 3.868800e+10 -1.646440e+11 8.380000e+08 4.857400e+10
128 000001.SZ 2025-09-30 2025-10-25 7.178300e+10 -1.324500e+10 -8.058100e+10 1.288000e+09 -2.210800e+10
核心财务指标
复制
metrics_df = tf.financials.metrics(["000001.SZ"], as_dataframe=True)
print(metrics_df.tail())
复制
symbol period_end announce_date eps_basic eps_diluted bps ocfps roe net_margin revenue_yoy net_income_yoy debt_to_asset_ratio roe_diluted
79 000001.SZ 2024-09-30 2024-10-19 1.94 1.94 21.67 7.0678 8.2528 35.6052 -12.5766 0.2372 91.4641 9.10
80 000001.SZ 2024-12-31 2025-03-15 2.15 2.15 21.89 3.2637 9.2038 30.3405 -10.9315 -4.1912 91.4228 10.08
81 000001.SZ 2025-03-31 2025-04-19 0.62 0.62 22.48 8.3967 2.8165 41.8167 -13.0539 -5.5987 91.2405 2.80
82 000001.SZ 2025-06-30 2025-08-23 1.18 1.18 22.68 9.0015 4.9497 35.8435 -10.0438 -3.8989 91.3180 5.25
83 000001.SZ 2025-09-30 2025-10-25 1.87 1.87 23.08 3.6990 7.5711 38.0846 -9.7811 -3.4987 91.0187 8.28
仅获取最新一期
复制
latest = tf.financials.income(["600519.SH", "000001.SZ"], latest=True)
for symbol, records in latest.items():
if records:
print(f"{symbol} 最新一期营收: {records[0].get('revenue')}")
标的信息
查询标的元数据
复制
# 单只标的
inst = tf.instruments.get("600000.SH")
print(f"名称: {inst['name']}")
print(f"交易所: {inst['exchange']}")
print(f"代码: {inst['code']}")
print(f"类型: {inst.get('type')}")
print(f"ext: {inst.get('ext')}")
# 批量查询
insts = tf.instruments.batch(["600000.SH", "000001.SZ", "AAPL.US"])
for i in insts:
print(f"{i['symbol']}: {i['name']}")
复制
名称: 浦发银行
交易所: SH
代码: 600000
类型: stock
ext: {'type': 'cn_equity', 'listing_date': '1999-11-10', 'total_shares': 33305838300.0, 'float_shares': 33305838300.0, 'tick_size': 0.01, 'limit_up': 10.98, 'limit_down': 8.98}
600000.SH: 浦发银行
000001.SZ: 平安银行
获取交易所标的列表
复制
# 列出所有交易所
exchanges = tf.exchanges.list()
for ex in exchanges:
print(f"{ex['exchange']} ({ex['region']}): {ex['count']} 只标的")
# 获取特定交易所的所有标的
sh_instruments = tf.exchanges.get_instruments("SH")
print(f"上交所共 {len(sh_instruments)} 只标的")
# 按类型过滤
sh_etfs = tf.exchanges.get_instruments("SH", instrument_type="etf")
print(f"上交所共 {len(sh_etfs)} 只 ETF")
sh_stocks = tf.exchanges.get_instruments("SH", instrument_type="stock")
print(f"上交所共 {len(sh_stocks)} 只股票")
标的池
使用预定义标的池
复制
# 列出所有标的池
universes = tf.universes.list()
for u in universes:
print(f"{u['id']}: {u['name']} ({u['symbol_count']} 只)")
# 获取标的池详情
universe = tf.universes.get("CN_Equity_A")
print(f"A 股共 {len(universe['symbols'])} 只股票")
异步高并发示例
并发获取多只股票数据
复制
import asyncio
from tickflow import AsyncTickFlow
async def fetch_stock_data(tf: AsyncTickFlow, symbol: str) -> dict:
"""获取单只股票数据并进行分析"""
df = await tf.klines.get(symbol, period="1d", count=60, as_dataframe=True)
df["ma20"] = df["close"].rolling(20).mean()
latest = df.iloc[-1]
return {
"symbol": symbol,
"price": latest["close"],
"ma20": latest["ma20"],
"above_ma20": latest["close"] > latest["ma20"]
}
async def main():
async with AsyncTickFlow(api_key="your-api-key") as tf:
symbols = ["600000.SH", "600519.SH", "000001.SZ", "000858.SZ", "601318.SH"]
tasks = [fetch_stock_data(tf, s) for s in symbols]
results = await asyncio.gather(*tasks)
for r in results:
status = "📈 站上" if r["above_ma20"] else "📉 跌破"
print(f"{r['symbol']}: {r['price']:.2f} ({status} MA20: {r['ma20']:.2f})")
asyncio.run(main())
异步获取除权因子与不同复权数据
复制
import asyncio
from tickflow import AsyncTickFlow
async def main():
async with AsyncTickFlow(api_key="your-api-key") as tf:
symbol = "600519.SH"
# 并发获取:除权因子 + 前复权 + 不复权
factors_task = tf.klines.ex_factors([symbol], as_dataframe=True)
qfq_task = tf.klines.get(symbol, count=50, adjust="forward", as_dataframe=True)
raw_task = tf.klines.get(symbol, count=50, adjust="none", as_dataframe=True)
factors_df, df_qfq, df_raw = await asyncio.gather(factors_task, qfq_task, raw_task)
print(f"除权记录: {len(factors_df)} 条")
print(f"前复权最新收盘: {df_qfq['close'].iloc[-1]}")
print(f"不复权最新收盘: {df_raw['close'].iloc[-1]}")
asyncio.run(main())
异步获取日内分钟 K 线
复制
import asyncio
from tickflow import AsyncTickFlow
async def main():
async with AsyncTickFlow(api_key="your-api-key") as tf:
# 获取单只股票的当日 1 分钟 K 线
df = await tf.klines.intraday("600000.SH", as_dataframe=True)
print(f"今日已有 {len(df)} 根分钟 K 线")
# 批量获取多只股票的日内 K 线
symbols = ["600000.SH", "000001.SZ", "600519.SH"]
dfs = await tf.klines.intraday_batch(
symbols,
period="5m",
as_dataframe=True,
show_progress=True,
)
for symbol, df in dfs.items():
print(f"{symbol}: {len(df)} 根 5 分钟 K 线")
asyncio.run(main())
定时获取行情
复制
import asyncio
import datetime
from tickflow import AsyncTickFlow
async def monitor_quotes(symbols, interval=5):
"""定时监控行情"""
async with AsyncTickFlow(api_key="your-api-key") as tf:
while True:
quotes = await tf.quotes.get(symbols=symbols)
print(f"\n--- {datetime.datetime.now().strftime('%H:%M:%S')} ---")
for q in quotes:
change = (q["last_price"] - q["prev_close"]) / q["prev_close"] * 100
print(f"{q['symbol']}: {q['last_price']:.2f} ({change:+.2f}%)")
await asyncio.sleep(interval)
# 监控指定股票,每 5 秒刷新
asyncio.run(monitor_quotes(["600000.SH", "000001.SZ"]))
