跳转到主要内容

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"]))