Skip to main content

A 股因子研究工具:Tushare 日线数据下载与因子分析引擎(IC、分组收益、换手率、成本扣减、HTML 报告)

Project description

qlfactor

一个基于 A 股日线数据的因子研究工具包,包含两条主线:

  • 数据下载与整理:通过 Tushare 拉取交易日历、股票基础信息、日线行情、行业成分,并落地为 Parquet。
  • 因子分析引擎:完成因子分组收益、IC 分析、换手率分析、交易成本扣减、多空净值分析,输出 HTML 报告。

1. 当前能力

1.1 数据侧

  • 下载交易日历(SSE 开市日)
  • 下载两市股票基础信息(上市/退市/暂停)
  • 下载单只股票日线、复权因子、日级估值与换手指标
  • 合并历史证券简称(namechange)
  • 合并所有个股文件为总表 stocks_daily.parquet
  • 下载申万行业成分变更表(SW2021)

1.2 因子分析侧

  • 去极值:3sigma、MAD
  • 标准化:截面 Z-Score
  • 行业 / 市值 / 行业+市值中性化
  • 统一复权开关adjust=True 时,因子计算前先复权价格列,远期收益也使用复权价
  • 分位分组、IC、IC 累加、IC 分布、T 检验
  • 分组收益、多空组合收益、换手率、相关性
  • 按换手率扣交易成本后的净收益分析
  • 输出 HTML 可视化报告

2. 项目结构

qlfactor/
├─ pyproject.toml
├─ README.md
├─ API.md
├─ src/
│  └─ qlfactor/            # PyPI 包目录(src layout)
│     ├─ __init__.py
│     ├─ config.py
│     ├─ download.py
│     ├─ factor_engine.py
│     └─ cli.py
├─ tests/                  # unittest 套件
└─ data/                   # .gitignore,由 DB_NAME 指定

3. 安装

3.1 从源码(开发)

uv pip install -e ".[dev]"
# 或
pip install -e ".[dev]"

3.2 从 PyPI

pip install qlfactor

3.3 配置环境变量

复制 .env.example.env 并填写:

TUSHARE_TOKEN=你的tushare_token
DB_NAME=./data

两者均为必填:缺失时 load_config() 直接抛 ValueErrorDB_NAME 不存在的目录会自动创建,结尾是否带斜杠都可以——内部统一用 pathlib.Path

4. 数据下载

4.1 命令行

安装后可用 qlfactor 命令:

qlfactor download calendar          # 下载交易日历
qlfactor download stocks_info       # 下载股票基础信息
qlfactor download industry          # 下载申万行业成分
qlfactor download stocks_daily      # 下载逐股日线
qlfactor download merge             # 合并为总表 stocks_daily.parquet
qlfactor download all               # 顺序执行以上 5 步
qlfactor --log-level DEBUG download stocks_daily   # 调日志级别

4.2 库形式

from qlfactor import Download, load_config, setup_logging

setup_logging()              # 终端 + debug.log 同时输出
cfg = load_config()
dl = Download.from_config(cfg)

dl.calendar()
dl.stocks_info()
dl.industry()                # 行业中性化需要
dl.stocks_daily()
dl.merge()

下载顺序不能打乱(stocks_dailymerge 依赖前两步生成的 parquet)。stocks_daily() 对每只股票最多重试 3 次,失败仅记日志后继续,因此可能产出部分成功的数据集。

5. 因子分析

5.1 公式写法(推荐)

Factor 已内置常用字段别名与公式函数,可直接用 FORMULA("MA(CLOSE, 20)") 风格,不必在表达式里写 self.

from datetime import datetime
import pandas as pd
from qlfactor import Factor, load_config, setup_logging

setup_logging()
cfg = load_config()

class my_factor(Factor):
    def calculate(self):
        return self.FORMULA("MA(CLOSE, 20) / CLOSE - 1")

data = pd.read_parquet(cfg.db_path / "stocks_daily.parquet")
data = data[data["date"].between(datetime(2020, 1, 1), datetime(2020, 12, 31))]
data = data.set_index(["date", "symbol"]).sort_index()

industry_data = pd.read_parquet(cfg.db_path / "industry.parquet")

my_factor("ma20", data).create_factor_analysis_report(
    winsorize="3sigma",
    standardize=True,
    transaction_cost_bps=10,
    industry_neutral=True,
    market_cap_neutral=True,
    industry_data=industry_data,
    adjust=True,           # 因子计算前先复权价格列,远期收益也使用 close*adj_factor
)

如果不想写字符串,也可先绑定后调用:

class my_factor(Factor):
    def calculate(self):
        MA, CLOSE = self.BIND("MA", "CLOSE")
        return MA(CLOSE, 20) / CLOSE - 1

5.2 已内置字段(大写)

OPEN, HIGH, LOW, CLOSE, PRE_CLOSE, CHANGE, PCT_CHG, VOLUME, AMOUNT, ADJ_FACTOR, TURNOVER_RATE, TURNOVER_RATE_F, VOLUME_RATIO, PE, PE_TTM, PB, PS, PS_TTM, DV_RATIO, DV_TTM, TOTAL_SHARE, FLOAT_SHARE, FREE_SHARE, TOTAL_MV, CIRC_MV

5.3 已内置公式函数

  • 基础:MA, EMA, RANK, REF, DELTA, STD, SUM
  • 通达信风格:ABS, MAX, MIN, IF, COUNT, EVERY, EXIST, HHV, LLV, TSRANK, SMA, CROSS
  • 数学:LOG, EXP, SQRT

6. 关键参数说明

  • quantiles:分组数,默认 5
  • period:远期收益周期(天),默认 1
  • winsorize:去极值方式,可选 3sigmamad
  • winsorize_param:去极值参数(默认 3)
  • standardize:是否做截面 Z-Score
  • industry_neutral / market_cap_neutral:是否中性化
  • transaction_cost_bps:单边交易成本(bps)
  • adjust:是否使用复权价。
    • True(默认):因子计算前会先把 open/high/low/close/pre_closeadj_factor,且 next_ret 也基于复权价。
    • False:因子计算和 next_ret 都使用原始价格。
    • 若你已在外部先做复权,请传 adjust=False,避免双重复权。
  • output_dir:报告输出目录,默认 ./output

6.1 单边 10bps 是什么

  • 1 bps = 0.01% = 0.0001
  • 10 bps = 0.10% = 0.001
  • 单边表示一次交易动作(买入或卖出)收一次成本

具体扣减:

  • 分组净收益 = 分组毛收益 − 分组换手率 × 0.001
  • 多空净收益 = 多空毛收益 − (多头换手率 + 空头换手率) × 0.001

7. 输出结果

7.1 日志输出

setup_logging() 默认同时写到:

  • 终端(StreamHandler)
  • 仓库根目录的 debug.log(FileHandler)

分组绩效、IC、换手率等汇总都会以 logging.info 形式打印,所以同时进终端与文件。可通过 setup_logging(level=...)qlfactor --log-level DEBUG ... 调级别。

7.2 报告文件

create_factor_analysis_report() 输出到 output_dir / "{factor.name}因子分析报告.html"。报告包含累计收益、IC 图、换手率图、相关性图、毛净收益对比图等。

8. API 文档

完整函数文档见 API.md

9. 注意事项

  • Tushare 接口有频率和积分限制,批量下载时建议分批执行。
  • 首次全量下载耗时较长,建议先缩小时间区间调试。
  • 因子计算请保证索引与价格数据严格对齐(date, symbol)。
  • adjust=True 需要 adj_factor 列;缺失时会抛 KeyError(并记录 info 级别参数校验日志)。

10. 测试

./.venv/Scripts/python -m unittest discover -s tests
# 或
python -m unittest discover -s tests

测试覆盖公式函数、因子侧复权与远期收益复权(含/不含复权)、IC、分组收益、绩效、去极值/标准化、配置加载与日志初始化。

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

qlfactor-0.2.0.tar.gz (33.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

qlfactor-0.2.0-py3-none-any.whl (25.3 kB view details)

Uploaded Python 3

File details

Details for the file qlfactor-0.2.0.tar.gz.

File metadata

  • Download URL: qlfactor-0.2.0.tar.gz
  • Upload date:
  • Size: 33.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for qlfactor-0.2.0.tar.gz
Algorithm Hash digest
SHA256 30ab9d2ebe449888b81978e417ba68cdaf2c339579fedc2bda73e985cda56513
MD5 38854537e86e3f074cd1ca5353d54a9d
BLAKE2b-256 b93f6f671be266decf4dc42fcf1486c6456364c7bb04b4e12de89c7b73168b4b

See more details on using hashes here.

File details

Details for the file qlfactor-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: qlfactor-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 25.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for qlfactor-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8351e8aa6a3600ee57ff2d9dc436ce683681bcdab1ae7867f7fcc6d2e8509f04
MD5 da190be9472f26bd4b3bfe0f560a16ac
BLAKE2b-256 2116c4b3b47c3c4452d53741c77fca8b7b8e073ba4e32257e287ef2344138518

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page