Files
ProStock/docs/factor_implementation_analysis.md
liaozhaorun a22bc2d282 refactor(data): 移除 api_daily 模块并更新文档
- 删除 src/data/api_wrappers/api_daily.py (240行)
- 更新 6 个文档文件,将 daily 表引用替换为 pro_bar
- 同步 README.md 中的因子框架和训练模块示例

BREAKING CHANGE: api_daily 模块已移除,请使用 api_pro_bar 替代
2026-03-14 01:48:56 +08:00

587 lines
22 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 因子表达式可实现性分析报告 (v2)
## 文档来源
- **分析文件**: `docs/factor_expressions_document.md`
- **分析日期**: 2026-03-06
- **共收录因子**: 180+ 个
- **更新说明**: 本版本明确区分 ts_* (时间序列) 和 cs_* (截面) 算子类型
---
## 一、当前 DSL 框架已实现功能
### 1.1 时间序列函数 (ts_*)
**说明**: 所有时间序列函数都按 `ts_code` 分组计算,防止跨股票数据泄露
| 函数名 | 参数 | 状态 | 说明 | Polars 实现 |
|--------|------|------|------|-------------|
| `ts_mean(x, window)` | x: 表达式, window: 窗口 | 已实现 | 滚动均值 | `rolling_mean(window).over("ts_code")` |
| `ts_sum(x, window)` | x: 表达式, window: 窗口 | 已实现 | 滚动求和 | `rolling_sum(window).over("ts_code")` |
| `ts_std(x, window)` | x: 表达式, window: 窗口 | 已实现 | 滚动标准差 | `rolling_std(window).over("ts_code")` |
| `ts_max(x, window)` | x: 表达式, window: 窗口 | 已实现 | 滚动最大值 | `rolling_max(window).over("ts_code")` |
| `ts_min(x, window)` | x: 表达式, window: 窗口 | 已实现 | 滚动最小值 | `rolling_min(window).over("ts_code")` |
| `ts_delay(x, periods)` | x: 表达式, periods: 滞后 | 已实现 | 滞后 N 期 | `shift(periods).over("ts_code")` |
| `ts_delta(x, periods)` | x: 表达式, periods: 差分 | 已实现 | 差分 N 期 | `(x - x.shift(periods)).over("ts_code")` |
| `ts_corr(x, y, window)` | x, y: 表达式, window: 窗口 | 已实现 | 滚动相关系数 | `rolling_corr(y, window).over("ts_code")` |
| `ts_cov(x, y, window)` | x, y: 表达式, window: 窗口 | 已实现 | 滚动协方差 | `rolling_cov(y, window).over("ts_code")` |
| `ts_rank(x, window)` | x: 表达式, window: 窗口 | API 已定义 | 滚动排名 | 待实现 |
### 1.2 截面函数 (cs_*)
**说明**: 所有截面函数都按 `trade_date` 分组计算,防止跨日期数据泄露
| 函数名 | 参数 | 状态 | 说明 | Polars 实现 |
|--------|------|------|------|-------------|
| `cs_rank(x)` | x: 表达式 | 已实现 | 截面排名 (归一化到 [0,1]) | `(rank() / count()).over("trade_date")` |
| `cs_zscore(x)` | x: 表达式 | 已实现 | Z-Score 标准化 | `((x - mean()) / std()).over("trade_date")` |
| `cs_neutralize(x, group?)` | x: 表达式, group?: 分组列 | 已实现 | 行业/市值中性化 | `(x - mean()).over("trade_date")` |
| `cs_winsorize(x, lower, upper)` | x: 表达式, lower/upper: 分位数 | API 已定义 | 缩尾处理 | 待实现 |
| `cs_demean(x)` | x: 表达式 | API 已定义 | 去均值 | 待实现 |
| `cs_std(x)` | x: 表达式 | 缺失 | 截面标准差 | 待实现 |
| `cs_mean(x)` | x: 表达式 | 缺失 | 截面均值 | 待实现 |
| `cs_sum(x)` | x: 表达式 | 缺失 | 截面求和 | 待实现 |
| `cs_max(x)` | x: 表达式 | 缺失 | 截面最大值 | 待实现 |
| `cs_min(x)` | x: 表达式 | 缺失 | 截面最小值 | 待实现 |
### 1.3 数学函数(无分组,逐元素计算)
| 函数名 | 参数 | 状态 | 说明 |
|--------|------|------|------|
| `log(x)` | x: 表达式 | API 已定义 | 自然对数 |
| `log1p(x)` | x: 表达式 | 缺失 | log(1+x) |
| `exp(x)` | x: 表达式 | API 已定义 | 指数函数 |
| `sqrt(x)` | x: 表达式 | API 已定义 | 平方根 |
| `sign(x)` | x: 表达式 | API 已定义 | 符号函数 (-1/0/1) |
| `abs(x)` | x: 表达式 | API 已定义 | 绝对值 |
| `max_(x, y)` | x, y: 表达式 | API 已定义 | 逐元素最大值 |
| `min_(x, y)` | x, y: 表达式 | API 已定义 | 逐元素最小值 |
| `clip(x, lower, upper)` | x: 表达式, lower/upper: 边界 | API 已定义 | 数值裁剪 |
| `atan(x)` | x: 表达式 | 缺失 | 反正切函数 |
### 1.4 统计函数(需要新增)
| 函数名 | 类型 | 参数 | 说明 |
|--------|------|------|------|
| `ts_var(x, window)` | ts | x: 表达式, window: 窗口 | 滚动方差 |
| `ts_skew(x, window)` | ts | x: 表达式, window: 窗口 | 滚动偏度 |
| `ts_kurt(x, window)` | ts | x: 表达式, window: 窗口 | 滚动峰度 |
| `ts_pct_change(x, periods)` | ts | x: 表达式, periods: 周期 | 百分比变化 |
| `ts_ema(x, window)` | ts | x: 表达式, window: 窗口 | 指数移动平均 |
| `ts_sma(x, window)` | ts | x: 表达式, window: 窗口 | 简单移动平均 (ts_mean 别名) |
### 1.5 TA-Lib 技术指标(用户可安装 TA-Lib
| 函数名 | 类型 | 参数 | 说明 | 优先级 |
|--------|------|------|------|--------|
| `ts_atr(high, low, close, window)` | ts | high/low/close: 表达式, window: 窗口 | 真实波动幅度 | 高 |
| `ts_obv(close, vol)` | ts | close/vol: 表达式 | 能量潮指标 | 高 |
| `ts_rsi(close, window)` | ts | close: 表达式, window: 窗口 | 相对强弱指数 | 高 |
| `ts_natr(high, low, close, window)` | ts | high/low/close: 表达式, window: 窗口 | 归一化 ATR | 中 |
**说明**: 由于用户已确认可安装 TA-Lib建议直接使用 `ta-lib` Python 包,并通过 adapter 模式封装到 DSL 中。
### 1.6 条件函数
| 函数名 | 参数 | 状态 | 说明 |
|--------|------|------|------|
| `if_(condition, true_val, false_val)` | condition: 布尔表达式 | API 已定义 | 条件选择 |
| `where(condition, true_val, false_val)` | 同上 | API 已定义 | if_ 的别名 |
### 1.7 符号/数据字段
| 字段名 | 状态 | 数据来源 | 所属类别 |
|--------|------|----------|----------|
| `close` | 可用 | pro_bar 表 | 价格 |
| `open` | 可用 | pro_bar 表 | 价格 |
| `high` | 可用 | pro_bar 表 | 价格 |
| `low` | 可用 | pro_bar 表 | 价格 |
| `vol` | 可用 | pro_bar 表 | 成交量 |
| `amount` | 可用 | pro_bar 表 | 成交额 |
| `pre_close` | 可用 | pro_bar 表 | 价格 |
| `change` | 可用 | pro_bar 表 | 价格变化 |
| `pct_chg` | 可用 | pro_bar 表 | 涨跌幅 |
| `turnover_rate` | 可用 | pro_bar 表 | 换手率 |
| `volume_ratio` | 可用 | pro_bar 表 | 量比 |
### 1.8 支持的运算符
**算术运算符**: `+`, `-`, `*`, `/`, `**`, `//`, `%`
**比较运算符**: `==`, `!=`, `<`, `<=`, `>`, `>=`
**一元运算符**: `-`, `+`, `abs()`
---
## 二、需要新增的数据表
### 2.1 筹码分布数据cyq 表)
**数据来源**: Tushare `cyq` API (VIP)
**数据频率**: 日频
**同步方式**: 按股票
| 字段名 | 类型 | 说明 | 依赖因子数 |
|--------|------|------|------------|
| `cost_5pct` | DOUBLE | 5% 成本价 | ~50个 |
| `cost_15pct` | DOUBLE | 15% 成本价 | ~50个 |
| `cost_50pct` | DOUBLE | 50% 成本价 (中位数) | ~50个 |
| `cost_85pct` | DOUBLE | 85% 成本价 | ~50个 |
| `cost_95pct` | DOUBLE | 95% 成本价 | ~50个 |
| `weight_avg` | DOUBLE | 加权平均成本 | ~50个 |
| `winner_rate` | DOUBLE | 获利盘比例 | ~50个 |
| `his_high` | DOUBLE | 历史最高价 | ~10个 |
| `his_low` | DOUBLE | 历史最低价 | ~10个 |
**依赖筹码数据的主要因子**:
- `cashflow_to_ev_factor`
- `chip_concentration_range`
- `profit_pressure`
- `underwater_resistance`
- `vol_amp_loss_20`
- `smallcap_concentration`
- `cat_golden_resonance`
- ...等 50+ 个
### 2.2 资金流向数据moneyflow 表)
**数据来源**: Tushare `moneyflow` API (VIP)
**数据频率**: 日频
**同步方式**: 按股票
| 字段名 | 类型 | 说明 | 依赖因子数 |
|--------|------|------|------------|
| `buy_sm_vol` | DOUBLE | 小单买入量 | ~30个 |
| `sell_sm_vol` | DOUBLE | 小单卖出量 | ~30个 |
| `buy_lg_vol` | DOUBLE | 大单买入量 | ~30个 |
| `sell_lg_vol` | DOUBLE | 大单卖出量 | ~30个 |
| `buy_elg_vol` | DOUBLE | 特大单买入量 | ~30个 |
| `sell_elg_vol` | DOUBLE | 特大单卖出量 | ~30个 |
| `net_mf_vol` | DOUBLE | 净流入量 | ~20个 |
**依赖资金流向数据的主要因子**:
- `lg_elg_net_buy_vol`
- `flow_lg_elg_intensity`
- `sm_net_buy_vol`
- `flow_divergence_ratio`
- `lg_flow_mom_corr_20_60`
- `cs_rank_net_lg_flow_val`
- ...等 30+ 个
### 2.3 财务数据financial 表)
**数据来源**: Tushare `income`/`balance_sheet`/`cashflow` API (VIP)
**数据频率**: 季度
**同步方式**: 按股票,需 `asof_backward` join
| 字段名 | 类型 | 说明 | 数据来源表 |
|--------|------|------|------------|
| `bps` | DOUBLE | 每股净资产 | income |
| `total_liab` | DOUBLE | 总负债 | balance_sheet |
| `money_cap` | DOUBLE | 货币资金 | balance_sheet |
| `n_cashflow_act` | DOUBLE | 经营活动现金流净额 | cashflow |
| `undist_profit_ps` | DOUBLE | 每股未分配利润 | income |
| `ocfps` | DOUBLE | 每股经营现金流 | income |
| `roa` | DOUBLE | 资产回报率 | income |
| `roe` | DOUBLE | 净资产收益率 | income |
| `total_mv` | DOUBLE | 总市值 | daily_basic |
| `circ_mv` | DOUBLE | 流通市值 | daily_basic |
**依赖财务数据的主要因子**:
- `undist_profit_ps`
- `cashflow_to_ev_factor`
- `book_to_price_ratio`
- `cs_rank_size`
### 2.4 行业分类数据
| 字段名 | 类型 | 说明 | 数据来源 |
|--------|------|------|----------|
| `cat_l2_code` | VARCHAR | 二级行业分类代码 | stock_basic |
**用途**: `daily_industry_deviation`, `cs_rank_ind_adj_lg_flow` 等分组计算
---
## 三、因子表达式可实现性分类
### 3.1 完全可实现(使用现有功能)
#### 技术指标因子
| 因子名称 | 表达式 | 复杂度 |
|----------|--------|--------|
| `turnover_rate_mean_5` | `ts_mean(turnover_rate, 5)` | 低 |
| `bbi_ratio_factor` | `(ts_mean(close,3)+ts_mean(close,6)+ts_mean(close,12)+ts_mean(close,24))/4/close` | 低 |
#### ARBR 因子
| 因子名称 | 表达式 | 复杂度 |
|----------|--------|--------|
| `AR` | `ts_sum(high - open, N) / ts_sum(open - low, N) * 100` | 低 |
| `BR` | `ts_sum(max_(0, high - ts_delay(close,1)), N) / ts_sum(max_(0, ts_delay(close,1) - low), N) * 100` | 中 |
| `AR_BR` | `AR - BR` | 低 |
#### 成交量因子
| 因子名称 | 表达式 | 复杂度 |
|----------|--------|--------|
| `volume_change_rate` | `ts_mean(vol, 2) / ts_mean(vol, 10) - 1` | 低 |
| `turnover_deviation` | `(turnover_rate - ts_mean(turnover_rate, 3)) / ts_std(turnover_rate, 3)` | 低 |
| `vol_std_5` | `ts_std(ts_delta(vol), 5)` | 低 |
#### 收益率因子
| 因子名称 | 表达式 | 复杂度 |
|----------|--------|--------|
| `return_5` | `close / ts_delay(close, 5) - 1` | 低 |
| `return_20` | `close / ts_delay(close, 20) - 1` | 低 |
| `std_return_5` | `ts_std(ts_delta(close)/ts_delay(close), 5)` | 中 |
| `std_return_90` | `ts_std(ts_delta(close)/ts_delay(close), 90)` | 中 |
#### 截面排序因子
| 因子名称 | 表达式 | 复杂度 |
|----------|--------|--------|
| `cs_rank_volume_ratio` | `cs_rank(volume_ratio)` | 低 |
| `cs_rank_turnover_rate` | `cs_rank(turnover_rate)` | 低 |
### 3.2 需要新增 ts_* 函数
| 因子名称 | 所需函数 | 表达式示例 | 优先级 |
|----------|----------|------------|--------|
| `variance_20` | `ts_var(x, window)` | `ts_var(pct_chg, 20)` | 高 |
| `return_skew` | `ts_skew(x, window)` | `ts_skew(pct_chg, 5)` | 高 |
| `return_kurtosis` | `ts_kurt(x, window)` | `ts_kurt(pct_chg, 5)` | 高 |
| `turnover_diff_skew_20` | `ts_skew(x, window)` | `ts_skew(ts_delta(turnover_rate), 20)` | 高 |
| `act_factor1` | `ts_ema(x, window)` | `atan((ts_ema(close,5)/ts_delay(ts_ema(close,5),1)-1)*100) * 57.3 / 50` | 高 |
| `act_factor2` | `ts_ema(x, window)` | `atan((ts_ema(close,13)/ts_delay(ts_ema(close,13),1)-1)*100) * 57.3 / 40` | 高 |
| `act_factor3` | `ts_ema(x, window)` | `atan((ts_ema(close,20)/ts_delay(ts_ema(close,20),1)-1)*100) * 57.3 / 21` | 高 |
| `act_factor4` | `ts_ema(x, window)` | `atan((ts_ema(close,60)/ts_delay(ts_ema(close,60),1)-1)*100) * 57.3 / 10` | 高 |
| `atr_14` | `ts_atr(h,l,c,w)` | `ts_atr(high, low, close, 14)` | 高 |
| `atr_6` | `ts_atr(h,l,c,w)` | `ts_atr(high, low, close, 6)` | 高 |
| `rsi_3` | `ts_rsi(x, window)` | `ts_rsi(close, 3)` | 高 |
| `obv` | `ts_obv(c, v)` | `ts_obv(close, vol)` | 中 |
| `maobv_6` | `ts_obv` + `ts_mean` | `ts_mean(ts_obv(close, vol), 6)` | 中 |
### 3.3 需要新增 cs_* 函数
| 因子名称 | 所需函数 | 表达式示例 | 优先级 |
|----------|----------|------------|--------|
| `daily_positive_benchmark` | `cs_mean(x)` | `cs_mean(pct_chg[pct_chg > 0])` | 高 |
| `daily_industry_positive_benchmark` | `cs_mean(x)` by group | `cs_mean(pct_chg) by cat_l2_code` | 高 |
| `industry_avg_flow` | `cs_mean(x)` by group | `cs_mean(net_lg_flow_vol) by trade_date, cat_l2_code` | 中 |
**注意**: 这些因子需要 **分组聚合** 能力,可能需要扩展 DSL 语法支持 `by` 子句,或通过 `cs_neutralize` 的 group 参数实现。
### 3.4 需要新增数据表
#### 依赖筹码数据cyq 表)的因子
| 因子名称 | 表达式 | 复杂度 |
|----------|--------|--------|
| `chip_concentration_range` | `(cost_95pct - cost_5pct) / (close + epsilon)` | 低 |
| `chip_skewness` | `(weight_avg - cost_50pct) / (cost_50pct + epsilon)` | 低 |
| `profit_pressure` | `winner_rate * 0.5 * ((close/cost_85pct-1) + (close/cost_95pct-1))` | 中 |
| `underwater_resistance` | `(1-winner_rate) * max_(0, cost_15pct-close) / (close+epsilon)` | 中 |
| `smallcap_concentration` | `(1 / log(circ_mv)) * (cost_85pct - cost_15pct)` | 中 |
#### 依赖资金流向数据moneyflow 表)的因子
| 因子名称 | 表达式 | 复杂度 |
|----------|--------|--------|
| `lg_elg_net_buy_vol` | `(buy_lg_vol + buy_elg_vol - sell_lg_vol - sell_elg_vol)` | 低 |
| `flow_lg_elg_intensity` | `lg_elg_net_buy_vol / (vol + epsilon)` | 低 |
| `cs_rank_net_lg_flow_val` | `cs_rank(lg_elg_net_buy_vol * close)` | 低 |
#### 依赖财务数据的因子
| 因子名称 | 表达式 | 复杂度 | 特殊需求 |
|----------|--------|--------|----------|
| `book_to_price_ratio` | `bps / close` | 低 | 需 asof_backward join |
| `cashflow_to_ev_factor` | `n_cashflow_act / (total_mv*10000 + total_liab - money_cap)` | 高 | 需多表 join |
### 3.5 需要复杂条件逻辑
| 因子名称 | 逻辑 | 实现方式 |
|----------|------|----------|
| `daily_deviation` | 按条件选择不同基准 | `if_(pct_chg > 0, pct_chg - pos_benchmark, if_(pct_chg < 0, pct_chg - neg_benchmark, 0))` |
| `cat_volume_breakout` | 布尔分类 | `if_(vol > ts_max(vol, 5), 1, 0)` |
| `cat_turnover_spike` | 阈值分类 | `if_(turnover_rate > ts_mean(turnover_rate,3) + 2*ts_std(turnover_rate,3), 1, 0)` |
| `cat_golden_resonance` | 多条件组合 | `(close > weight_avg) & (volume_ratio > 1.5) & (winner_rate > 0.7)` |
---
## 四、实施计划(按优先级排序)
### Phase 1: 核心 ts_* 函数Week 1-2
**目标**: 实现最常用的 30+ 个因子
```python
# 1. 新增数学函数(逐元素,无分组)
def atan(x): ...
def log1p(x): ...
# 2. 新增统计函数ts_*,按 ts_code 分组)
def ts_var(x, window): ... # 滚动方差
def ts_skew(x, window): ... # 滚动偏度
def ts_kurt(x, window): ... # 滚动峰度
def ts_pct_change(x, periods): ... # 百分比变化
# 3. 新增 EMAts_*,使用 Polars ewm_mean
def ts_ema(x, window):
# 使用 Polars: pl.col(x).ewm_mean(span=window).over("ts_code")
pass
# 4. 实现 ATR基于现有函数组合
def ts_atr(high, low, close, window):
tr1 = high - low
tr2 = abs(high - ts_delay(close, 1))
tr3 = abs(low - ts_delay(close, 1))
tr = max_(tr1, max_(tr2, tr3))
return ts_mean(tr, window)
```
**完成后可实现的因子**:
- `variance_20`
- `return_skew`, `return_kurtosis`
- `turnover_diff_skew_20`
- `act_factor1-4`
- `atr_14`, `atr_6`
- `vol_adj_roc_20`
### Phase 2: TA-Lib 集成Week 3
**目标**: 支持 RSI、OBV 等复杂技术指标
```python
# 安装 TA-Lib
# pip install TA-Lib
# 封装为 ts_* 函数
def ts_rsi(close, window):
# 使用 talib.RSI并添加 .over("ts_code")
pass
def ts_obv(close, vol):
# 使用 talib.OBV并添加 .over("ts_code")
pass
```
**完成后可实现的因子**:
- `rsi_3`
- `obv`
- `maobv_6`
### Phase 3: 筹码分布数据同步Week 4
**目标**: 实现 cyq 表同步,支持 50+ 个筹码相关因子
```python
class CyqSync(StockBasedSync):
table_name = "cyq"
TABLE_SCHEMA = {
"ts_code": "VARCHAR(16) NOT NULL",
"trade_date": "DATE NOT NULL",
"cost_5pct": "DOUBLE",
"cost_15pct": "DOUBLE",
"cost_50pct": "DOUBLE",
"cost_85pct": "DOUBLE",
"cost_95pct": "DOUBLE",
"weight_avg": "DOUBLE",
"winner_rate": "DOUBLE",
"his_high": "DOUBLE",
"his_low": "DOUBLE",
}
PRIMARY_KEY = ("ts_code", "trade_date")
```
**完成后可实现的因子**:
- `chip_concentration_range`
- `profit_pressure`
- `underwater_resistance`
- `smallcap_concentration`
- ...等 50+ 个
### Phase 4: 资金流向数据同步Week 5
**目标**: 实现 moneyflow 表同步,支持 30+ 个资金相关因子
```python
class MoneyFlowSync(StockBasedSync):
table_name = "moneyflow"
TABLE_SCHEMA = {
"ts_code": "VARCHAR(16) NOT NULL",
"trade_date": "DATE NOT NULL",
"buy_sm_vol": "DOUBLE",
"sell_sm_vol": "DOUBLE",
"buy_lg_vol": "DOUBLE",
"sell_lg_vol": "DOUBLE",
"buy_elg_vol": "DOUBLE",
"sell_elg_vol": "DOUBLE",
"net_mf_vol": "DOUBLE",
}
```
**完成后可实现的因子**:
- `lg_elg_net_buy_vol`
- `flow_lg_elg_intensity`
- `cs_rank_net_lg_flow_val`
- ...等 30+ 个
### Phase 5: 分组聚合功能Week 6
**目标**: 实现 cs_mean by group 等分组计算
```python
# 方式1: 扩展 cs_neutralize 的 group 参数
def cs_neutralize(x, group=None):
if group:
return (x - x.mean().over(["trade_date", group]))
return (x - x.mean().over("trade_date"))
# 方式2: 新增 cs_mean_by 函数
def cs_mean_by(x, by):
return x.mean().over(["trade_date"] + by)
```
**完成后可实现的因子**:
- `daily_deviation`
- `daily_industry_deviation`
- `cs_rank_ind_adj_lg_flow`
### Phase 6: 财务数据集成Week 7
**目标**: 实现财务数据同步和 asof_backward join
```python
# 使用 DataSpec 的 asof_backward 模式
spec = DataSpec(
table="financial_income",
columns=["bps", "roe", "roa"],
join_type="asof_backward",
left_on="trade_date",
right_on="f_ann_date",
)
```
**完成后可实现的因子**:
- `book_to_price_ratio`
- `cashflow_to_ev_factor`
- `cs_rank_size` (需要 circ_mv)
---
## 五、可实现性统计
### 按实现难度分类
| 类别 | 数量 | 状态 | 时间预估 |
|------|------|------|----------|
| 立即可实现 | ~40个 | 使用现有功能 | 0 周 |
| 需新增 ts_* 函数 | ~30个 | Phase 1-2 | 2-3 周 |
| 需新增 cs_* 函数 | ~10个 | Phase 5 | 1 周 |
| 需筹码数据 (cyq) | ~50个 | Phase 3 | 1 周 |
| 需资金数据 (moneyflow) | ~30个 | Phase 4 | 1 周 |
| 需财务数据 (financial) | ~20个 | Phase 6 | 1 周 |
| **总计** | **180+个** | | **6-7 周** |
### 按数据源分类
| 数据源 | 依赖因子数 | 实现难度 | 优先级 |
|--------|------------|----------|--------|
| pro_bar (主力行情表) | ~40 | 低 | 高 |
| 纯技术指标 (ts_*) | ~30 | 中 | 高 |
| 筹码分布 (cyq) | ~50 | 中 | 中 |
| 资金流向 (moneyflow) | ~30 | 中 | 中 |
| 财务数据 (financial) | ~20 | 高 | 低 |
| 分组计算 (cs_* by group) | ~10 | 高 | 低 |
---
## 六、立即可实现的因子示例
```python
from src.factors.api import close, open, high, low, vol, pct_chg, turnover_rate
from src.factors.api import ts_mean, ts_std, ts_max, ts_min, ts_delay, ts_delta, ts_corr, ts_sum
from src.factors.api import cs_rank, cs_zscore, cs_neutralize
from src.factors.api import log, sqrt, abs, sign, max_, min_, clip, if_
# 1. BBI 比率
bbi = (ts_mean(close, 3) + ts_mean(close, 6) + ts_mean(close, 12) + ts_mean(close, 24)) / 4
bbi_ratio_factor = bbi / close
# 2. AR 因子 (N=26)
ar = ts_sum(high - open, 26) / ts_sum(open - low, 26) * 100
# 3. BR 因子 (N=26)
prev_close = ts_delay(close, 1)
br = ts_sum(max_(0, high - prev_close), 26) / ts_sum(max_(0, prev_close - low), 26) * 100
ar_br = ar - br
# 4. 成交量变化率
volume_change_rate = ts_mean(vol, 2) / ts_mean(vol, 10) - 1
# 5. 换手率偏离度
turnover_deviation = (turnover_rate - ts_mean(turnover_rate, 3)) / ts_std(turnover_rate, 3)
# 6. 5日收益率
return_5 = close / ts_delay(close, 5) - 1
# 7. 20日收益率
return_20 = close / ts_delay(close, 20) - 1
# 8. Alpha 003
alpha_003 = if_(high != low, (close - open) / (high - low), 0)
# 9. Alpha 007 (等 Phase 1 后)
# alpha_007 = cs_rank(ts_corr(close, vol, 5))
# 10. 截面排名
rank_close = cs_rank(close)
rank_volume = cs_rank(vol)
# 11. Z-Score 标准化
zscore_close = cs_zscore(close)
# 12. 截面中性化 (Phase 5 后支持分组)
# neutralized = cs_neutralize(close, group="industry")
```
---
## 七、结论与建议
### 关键发现
1. **ts_* vs cs_* 区分清晰**:
- `ts_*` 函数按 `ts_code` 分组,用于时间序列计算
- `cs_*` 函数按 `trade_date` 分组,用于截面计算
- 数学函数log, exp, atan 等)为逐元素计算,无分组
2. **当前框架已实现**:
- 9个核心 ts_* 函数mean, std, max, min, sum, delay, delta, corr, cov
- 3个 cs_* 函数rank, zscore, neutralize
- 完整的运算符重载系统
3. **主要缺口**:
- 统计函数: `ts_var`, `ts_skew`, `ts_kurt`, `ts_pct_change`
- 技术指标: `ts_ema`, `ts_atr`, `ts_rsi`, `ts_obv`
- 数学函数: `atan`, `log1p`
- 分组聚合: `cs_mean`, `cs_sum` by group
- 数据表: cyq, moneyflow, financial
### 推荐实施路径
| 阶段 | 目标 | 时间 | 完成后可计算因子数 |
|------|------|------|-------------------|
| Phase 1 | ts_var, ts_skew, ts_kurt, ts_ema, atan | 1-2周 | +30个 |
| Phase 2 | TA-Lib 集成 (RSI, OBV) | 1周 | +5个 |
| Phase 3 | 筹码数据同步 (cyq) | 1周 | +50个 |
| Phase 4 | 资金流向同步 (moneyflow) | 1周 | +30个 |
| Phase 5 | 分组聚合功能 | 1周 | +10个 |
| Phase 6 | 财务数据集成 | 1周 | +20个 |
| **总计** | | **6-7周** | **180+个** |
### 建议优先实现的因子(高 ROI
1. **BBI 比率**: 纯技术指标,无需新数据
2. **AR/BR**: 经典情绪指标,无需新数据
3. **换手率偏离度**: 流动性因子,无需新数据
4. **筹码集中度**: 需 cyq 数据,但实现简单
5. **大单净流入**: 需 moneyflow 数据,实现简单
通过以上步骤,预计在 **6-7 周** 内可实现文档中 **90% 以上的因子表达式**