Files
ProStock/src/experiment/learn_to_rank.ipynb

2947 lines
292 KiB
Plaintext
Raw Normal View History

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Learn-to-Rank 排序学习训练流程\n",
"\n",
"本 Notebook 实现基于 LightGBM LambdaRank 的排序学习训练,用于股票排序任务。\n",
"\n",
"## 核心特点\n",
"\n",
"1. **Label 转换**: 将 `future_return_5` 按每日进行 20 分位数划分qcut\n",
"2. **排序学习**: 使用 LambdaRank 目标函数,学习每日股票排序\n",
"3. **NDCG 评估**: 使用 NDCG@1/5/10/20 评估排序质量\n",
"4. **策略回测**: 基于排序分数构建 Top-k 选股策略"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1. 导入依赖"
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2026-03-11T13:28:00.454472Z",
"start_time": "2026-03-11T13:27:55.535146Z"
}
},
"source": [
"import os\n",
"from datetime import datetime\n",
"from typing import List, Tuple, Optional\n",
"\n",
"import numpy as np\n",
"import polars as pl\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.metrics import ndcg_score\n",
"\n",
"from src.factors import FactorEngine\n",
"from src.training import (\n",
" DateSplitter,\n",
" STFilter,\n",
" StockPoolManager,\n",
" Trainer,\n",
" Winsorizer,\n",
" NullFiller,\n",
" StandardScaler,\n",
")\n",
"from src.training.components.models import LightGBMLambdaRankModel\n",
"from src.training.config import TrainingConfig"
],
"outputs": [],
"execution_count": 1
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2. 辅助函数"
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2026-03-11T13:28:00.468024Z",
"start_time": "2026-03-11T13:28:00.460009Z"
}
},
"source": [
"def create_factors_with_strings(engine: FactorEngine, factor_definitions: dict, label_factor: dict) -> List[str]:\n",
" \"\"\"使用字符串表达式注册因子\"\"\"\n",
" print(\"=\" * 80)\n",
" print(\"使用字符串表达式定义因子\")\n",
" print(\"=\" * 80)\n",
"\n",
" # 注册所有特征因子\n",
" print(\"\\n注册特征因子:\")\n",
" for name, expr in factor_definitions.items():\n",
" engine.add_factor(name, expr)\n",
" print(f\" - {name}: {expr}\")\n",
"\n",
" # 注册 label 因子\n",
" print(\"\\n注册 Label 因子:\")\n",
" for name, expr in label_factor.items():\n",
" engine.add_factor(name, expr)\n",
" print(f\" - {name}: {expr}\")\n",
"\n",
" # 从字典自动获取特征列\n",
" feature_cols = list(factor_definitions.keys())\n",
"\n",
" print(f\"\\n特征因子数: {len(feature_cols)}\")\n",
" print(f\"Label: {list(label_factor.keys())[0]}\")\n",
" print(f\"已注册因子总数: {len(engine.list_registered())}\")\n",
"\n",
" return feature_cols\n",
"\n",
"\n",
"def prepare_data(\n",
" engine: FactorEngine,\n",
" feature_cols: List[str],\n",
" start_date: str,\n",
" end_date: str,\n",
") -> pl.DataFrame:\n",
" \"\"\"准备数据\"\"\"\n",
" print(\"\\n\" + \"=\" * 80)\n",
" print(\"准备数据\")\n",
" print(\"=\" * 80)\n",
"\n",
" # 计算因子(全市场数据)\n",
" print(f\"\\n计算因子: {start_date} - {end_date}\")\n",
" factor_names = feature_cols + [LABEL_NAME] # 包含 label\n",
"\n",
" data = engine.compute(\n",
" factor_names=factor_names,\n",
" start_date=start_date,\n",
" end_date=end_date,\n",
" )\n",
"\n",
" print(f\"数据形状: {data.shape}\")\n",
" print(f\"数据列: {data.columns}\")\n",
" print(f\"\\n前5行预览:\")\n",
" print(data.head())\n",
"\n",
" return data\n",
"\n",
"\n",
"def prepare_ranking_data(\n",
" df: pl.DataFrame,\n",
" label_col: str = \"future_return_5\",\n",
" date_col: str = \"trade_date\",\n",
" n_quantiles: int = 20,\n",
") -> Tuple[pl.DataFrame, str]:\n",
" \"\"\"准备排序学习数据\n",
" \n",
" 将连续 label 转换为分位数标签,用于排序学习任务。\n",
" \n",
" Args:\n",
" df: 原始数据\n",
" label_col: 原始标签列名\n",
" date_col: 日期列名\n",
" n_quantiles: 分位数数量\n",
" \n",
" Returns:\n",
" (处理后的 DataFrame, 新的标签列名)\n",
" \"\"\"\n",
" print(\"\\n\" + \"=\" * 80)\n",
" print(f\"准备排序学习数据(将 {label_col} 转换为 {n_quantiles} 分位数标签)\")\n",
" print(\"=\" * 80)\n",
" \n",
" # 新的标签列名\n",
" rank_col = f\"{label_col}_rank\"\n",
" \n",
" # 按日期分组进行分位数划分\n",
" # 使用 rank 生成 0, 1, 2, ..., n_quantiles-1 的标签\n",
" # 方法: 计算每天内的排名,然后映射到 n_quantiles 个分位数组\n",
" df_ranked = df.with_columns(\n",
" # 计算每天内的排名 (1-based)\n",
" pl.col(label_col).rank(method=\"min\").over(date_col).alias(\"_rank\")\n",
" ).with_columns(\n",
" # 将排名转换为分位数标签 (0 to n_quantiles-1)\n",
" ((pl.col(\"_rank\") - 1) / pl.len().over(date_col) * n_quantiles)\n",
" .floor()\n",
" .cast(pl.Int64)\n",
" .clip(0, n_quantiles - 1)\n",
" .alias(rank_col)\n",
" ).drop(\"_rank\")\n",
" \n",
" # 检查转换结果\n",
" print(f\"\\n原始 {label_col} 统计:\")\n",
" print(df_ranked[label_col].describe())\n",
" \n",
" print(f\"\\n转换后 {rank_col} 统计:\")\n",
" print(df_ranked[rank_col].describe())\n",
" \n",
" # 检查每日样本分布\n",
" print(f\"\\n每日样本数统计:\")\n",
" daily_counts = df_ranked.group_by(date_col).agg(pl.count().alias(\"count\"))\n",
" print(daily_counts[\"count\"].describe())\n",
" \n",
" # 检查分位数分布(应该是均匀的)\n",
" print(f\"\\n分位数标签分布:\")\n",
" rank_dist = df_ranked[rank_col].value_counts().sort(rank_col)\n",
" print(rank_dist)\n",
" \n",
" return df_ranked, rank_col\n",
"\n",
"\n",
"def compute_group_array(df: pl.DataFrame, date_col: str = \"trade_date\") -> np.ndarray:\n",
" \"\"\"计算 group 数组用于 LambdaRank\n",
" \n",
" 每个日期作为一个 querygroup 数组表示每个 query 的样本数。\n",
" \n",
" Args:\n",
" df: 数据框\n",
" date_col: 日期列名\n",
" \n",
" Returns:\n",
" group 数组\n",
" \"\"\"\n",
" group_counts = df.group_by(date_col, maintain_order=True).agg(\n",
" pl.count().alias(\"count\")\n",
" )\n",
" return group_counts[\"count\"].to_numpy()\n",
"\n",
"\n",
"def evaluate_ndcg_at_k(\n",
" y_true: np.ndarray,\n",
" y_pred: np.ndarray,\n",
" group: np.ndarray,\n",
" k_list: List[int] = [1, 5, 10, 20],\n",
") -> dict:\n",
" \"\"\"计算 NDCG@k 指标\n",
" \n",
" Args:\n",
" y_true: 真实标签\n",
" y_pred: 预测分数\n",
" group: 分组数组\n",
" k_list: 要计算的 k 值列表\n",
" \n",
" Returns:\n",
" NDCG 指标字典\n",
" \"\"\"\n",
" results = {}\n",
" \n",
" # 按 group 拆分数据\n",
" start_idx = 0\n",
" y_true_groups = []\n",
" y_pred_groups = []\n",
" \n",
" for group_size in group:\n",
" end_idx = start_idx + group_size\n",
" y_true_groups.append(y_true[start_idx:end_idx])\n",
" y_pred_groups.append(y_pred[start_idx:end_idx])\n",
" start_idx = end_idx\n",
" \n",
" # 计算每个 k 值的平均 NDCG\n",
" for k in k_list:\n",
" ndcg_scores = []\n",
" for yt, yp in zip(y_true_groups, y_pred_groups):\n",
" if len(yt) > 1:\n",
" try:\n",
" score = ndcg_score([yt], [yp], k=k)\n",
" ndcg_scores.append(score)\n",
" except ValueError:\n",
" # 标签都相同,无法计算\n",
" pass\n",
" \n",
" results[f\"ndcg@{k}\"] = np.mean(ndcg_scores) if ndcg_scores else 0.0\n",
" \n",
" return results\n",
"\n"
],
"outputs": [],
"execution_count": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3. 配置参数\n",
"\n",
"### 3.1 因子定义"
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2026-03-11T13:28:00.479401Z",
"start_time": "2026-03-11T13:28:00.472206Z"
}
},
"source": [
"# 特征因子定义字典(复用 regression.ipynb 的因子定义)\n",
"LABEL_NAME = \"future_return_5_rank\"\n",
"\n",
"FACTOR_DEFINITIONS = {\n",
" # ================= 1. 价格、趋势与路径依赖 (Trend, Momentum & Path Dependency) =================\n",
" \"ma_5\": \"ts_mean(close, 5)\",\n",
" \"ma_20\": \"ts_mean(close, 20)\",\n",
" \"ma_ratio_5_20\": \"ts_mean(close, 5) / (ts_mean(close, 20) + 1e-8) - 1\",\n",
" \"bias_10\": \"close / (ts_mean(close, 10) + 1e-8) - 1\",\n",
" \"high_low_ratio\": \"(close - ts_min(low, 20)) / (ts_max(high, 20) - ts_min(low, 20) + 1e-8)\",\n",
" \"bbi_ratio\": \"(ts_mean(close, 3) + ts_mean(close, 6) + ts_mean(close, 12) + ts_mean(close, 24)) / (4 * close + 1e-8)\",\n",
" \"return_5\": \"(close / (ts_delay(close, 5) + 1e-8)) - 1\",\n",
" \"return_20\": \"(close / (ts_delay(close, 20) + 1e-8)) - 1\",\n",
" \"kaufman_ER_20\": \"abs(close - ts_delay(close, 20)) / (ts_sum(abs(close - ts_delay(close, 1)), 20) + 1e-8)\",\n",
" \"mom_acceleration_10_20\": \"(close / (ts_delay(close, 10) + 1e-8) - 1) - (ts_delay(close, 10) / (ts_delay(close, 20) + 1e-8) - 1)\",\n",
" \"drawdown_from_high_60\": \"close / (ts_max(high, 60) + 1e-8) - 1\",\n",
" \"up_days_ratio_20\": \"ts_sum(close > ts_delay(close, 1), 20) / 20\",\n",
"\n",
" # ================= 2. 波动率、风险调整与高阶矩 =================\n",
" \"volatility_5\": \"ts_std(close, 5)\",\n",
" \"volatility_20\": \"ts_std(close, 20)\",\n",
" \"volatility_ratio\": \"ts_std(close, 5) / (ts_std(close, 20) + 1e-8)\",\n",
" \"std_return_20\": \"ts_std((close / (ts_delay(close, 1) + 1e-8)) - 1, 20)\",\n",
" \"sharpe_ratio_20\": \"ts_mean(close / (ts_delay(close, 1) + 1e-8) - 1, 20) / (ts_std(close / (ts_delay(close, 1) + 1e-8) - 1, 20) + 1e-8)\",\n",
" \"min_ret_20\": \"ts_min(close / (ts_delay(close, 1) + 1e-8) - 1, 20)\",\n",
" \"volatility_squeeze_5_60\": \"ts_std(close, 5) / (ts_std(close, 60) + 1e-8)\",\n",
"\n",
" # ================= 3. 日内微观结构与异象 =================\n",
" \"overnight_intraday_diff\": \"(open / (ts_delay(close, 1) + 1e-8) - 1) - (close / (open + 1e-8) - 1)\",\n",
" \"upper_shadow_ratio\": \"(high - ((open + close + abs(open - close)) / 2)) / (high - low + 1e-8)\",\n",
" \"capital_retention_20\": \"ts_sum(abs(close - open), 20) / (ts_sum(high - low, 20) + 1e-8)\",\n",
" \"max_ret_20\": \"ts_max(close / (ts_delay(close, 1) + 1e-8) - 1, 20)\",\n",
"\n",
" # ================= 4. 量能、流动性与量价背离 =================\n",
" \"volume_ratio_5_20\": \"ts_mean(vol, 5) / (ts_mean(vol, 20) + 1e-8)\",\n",
" \"turnover_rate_mean_5\": \"ts_mean(turnover_rate, 5)\",\n",
" \"turnover_deviation\": \"(turnover_rate - ts_mean(turnover_rate, 10)) / (ts_std(turnover_rate, 10) + 1e-8)\",\n",
" \"amihud_illiq_20\": \"ts_mean(abs(close / (ts_delay(close, 1) + 1e-8) - 1) / (amount + 1e-8), 20)\",\n",
" \"turnover_cv_20\": \"ts_std(turnover_rate, 20) / (ts_mean(turnover_rate, 20) + 1e-8)\",\n",
" \"pv_corr_20\": \"ts_corr(close / (ts_delay(close, 1) + 1e-8) - 1, vol, 20)\",\n",
" \"close_vwap_deviation\": \"close / (amount / (vol * 100 + 1e-8) + 1e-8) - 1\",\n",
"\n",
" # ================= 5. 基本面财务特征 =================\n",
" \"roe\": \"n_income / (total_hldr_eqy_exc_min_int + 1e-8)\",\n",
" \"roa\": \"n_income / (total_assets + 1e-8)\",\n",
" \"profit_margin\": \"n_income / (revenue + 1e-8)\",\n",
" \"debt_to_equity\": \"total_liab / (total_hldr_eqy_exc_min_int + 1e-8)\",\n",
" \"current_ratio\": \"total_cur_assets / (total_cur_liab + 1e-8)\",\n",
" \"net_profit_yoy\": \"(n_income / (ts_delay(n_income, 252) + 1e-8)) - 1\",\n",
" \"revenue_yoy\": \"(revenue / (ts_delay(revenue, 252) + 1e-8)) - 1\",\n",
" \"healthy_expansion_velocity\": \"(total_assets / (ts_delay(total_assets, 252) + 1e-8) - 1) - (total_liab / (ts_delay(total_liab, 252) + 1e-8) - 1)\",\n",
"\n",
" # ================= 6. 基本面估值与截面动量共振 =================\n",
" \"EP\": \"n_income / (total_mv * 10000 + 1e-8)\",\n",
" \"BP\": \"total_hldr_eqy_exc_min_int / (total_mv * 10000 + 1e-8)\",\n",
" \"CP\": \"n_cashflow_act / (total_mv * 10000 + 1e-8)\",\n",
" \"market_cap_rank\": \"cs_rank(total_mv)\",\n",
" \"turnover_rank\": \"cs_rank(turnover_rate)\",\n",
" \"return_5_rank\": \"cs_rank((close / (ts_delay(close, 5) + 1e-8)) - 1)\",\n",
" \"EP_rank\": \"cs_rank(n_income / (total_mv + 1e-8))\",\n",
" \"pe_expansion_trend\": \"(total_mv / (n_income + 1e-8)) / (ts_delay(total_mv, 60) / (ts_delay(n_income, 60) + 1e-8) + 1e-8) - 1\",\n",
" \"value_price_divergence\": \"cs_rank((n_income - ts_delay(n_income, 252)) / (abs(ts_delay(n_income, 252)) + 1e-8)) - cs_rank(close / (ts_delay(close, 20) + 1e-8))\",\n",
" \"active_market_cap\": \"total_mv * ts_mean(turnover_rate, 20)\",\n",
" \"ebit_rank\": \"cs_rank(ebit)\",\n",
"}\n",
"\n",
"# Label 因子定义(不参与训练,用于计算目标)\n",
"LABEL_FACTOR = {\n",
" LABEL_NAME: \"(ts_delay(close, -5) / ts_delay(open, -1)) - 1\",\n",
"}"
],
"outputs": [],
"execution_count": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3.2 训练参数配置"
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2026-03-11T13:28:00.489508Z",
"start_time": "2026-03-11T13:28:00.483843Z"
}
},
"source": [
"# 日期范围配置(正确的 train/val/test 三分法)\n",
"TRAIN_START = \"20200101\"\n",
"TRAIN_END = \"20231231\"\n",
"VAL_START = \"20240101\"\n",
"VAL_END = \"20241231\"\n",
"TEST_START = \"20250101\"\n",
"TEST_END = \"20251231\"\n",
"\n",
"# LambdaRank 模型参数配置\n",
"MODEL_PARAMS = {\n",
" \"objective\": \"lambdarank\",\n",
" \"metric\": \"ndcg\",\n",
" \"ndcg_at\": [1, 5, 10, 20], # 评估 NDCG@k\n",
" \"learning_rate\": 0.05,\n",
" \"num_leaves\": 31,\n",
" \"max_depth\": 6,\n",
" \"min_data_in_leaf\": 20,\n",
" \"n_estimators\": 1000,\n",
" \"early_stopping_rounds\": 50,\n",
" \"subsample\": 0.8,\n",
" \"colsample_bytree\": 0.8,\n",
" \"reg_alpha\": 0.1,\n",
" \"reg_lambda\": 1.0,\n",
" \"verbose\": -1,\n",
" \"random_state\": 42,\n",
"}\n",
"\n",
"# 分位数配置\n",
"N_QUANTILES = 20 # 将 label 分为 20 组\n",
"\n",
"# 特征列(用于数据处理器)\n",
"FEATURE_COLS = list(FACTOR_DEFINITIONS.keys())\n",
"\n",
"# 数据处理器配置\n",
"PROCESSORS = [\n",
" NullFiller(feature_cols=FEATURE_COLS, strategy=\"mean\"),\n",
" Winsorizer(feature_cols=FEATURE_COLS, lower=0.01, upper=0.99),\n",
" StandardScaler(feature_cols=FEATURE_COLS),\n",
"]\n",
"\n",
"# 股票池筛选函数\n",
"def stock_pool_filter(df: pl.DataFrame) -> pl.Series:\n",
" \"\"\"股票池筛选函数(单日数据)\n",
" \n",
" 筛选条件:\n",
" 1. 排除创业板(代码以 300 开头)\n",
" 2. 排除科创板(代码以 688 开头)\n",
" 3. 排除北交所(代码以 8、9 或 4 开头)\n",
" 4. 选取当日市值最小的500只股票\n",
" \"\"\"\n",
" code_filter = (\n",
" ~df[\"ts_code\"].str.starts_with(\"30\") &\n",
" ~df[\"ts_code\"].str.starts_with(\"68\") &\n",
" ~df[\"ts_code\"].str.starts_with(\"8\") &\n",
" ~df[\"ts_code\"].str.starts_with(\"9\") &\n",
" ~df[\"ts_code\"].str.starts_with(\"4\")\n",
" )\n",
" \n",
" valid_df = df.filter(code_filter)\n",
" n = min(1000, len(valid_df))\n",
" small_cap_codes = valid_df.sort(\"total_mv\").head(n)[\"ts_code\"]\n",
" \n",
" return df[\"ts_code\"].is_in(small_cap_codes)\n",
"\n",
"STOCK_FILTER_REQUIRED_COLUMNS = [\"total_mv\"]\n",
"\n",
"# 输出配置\n",
"OUTPUT_DIR = \"output\"\n",
"SAVE_PREDICTIONS = True\n",
"PERSIST_MODEL = False\n",
"\n",
"# Top N 配置:每日推荐股票数量\n",
"TOP_N = 5 # 可调整为 10, 20 等"
],
"outputs": [],
"execution_count": 4
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4. 训练流程"
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2026-03-11T13:28:24.494829Z",
"start_time": "2026-03-11T13:28:00.494691Z"
}
},
"source": [
"print(\"\\n\" + \"=\" * 80)\n",
"print(\"LightGBM LambdaRank 排序学习训练\")\n",
"print(\"=\" * 80)\n",
"\n",
"# 1. 创建 FactorEngine\n",
"print(\"\\n[1] 创建 FactorEngine\")\n",
"engine = FactorEngine()\n",
"\n",
"# 2. 使用字符串表达式定义因子\n",
"print(\"\\n[2] 定义因子(字符串表达式)\")\n",
"feature_cols = create_factors_with_strings(engine, FACTOR_DEFINITIONS, LABEL_FACTOR)\n",
"\n",
"# 3. 准备数据\n",
"print(\"\\n[3] 准备数据\")\n",
"data = prepare_data(\n",
" engine=engine,\n",
" feature_cols=feature_cols,\n",
" start_date=TRAIN_START,\n",
" end_date=TEST_END,\n",
")\n",
"\n",
"# 4. 转换为排序学习格式(分位数标签)\n",
"print(\"\\n[4] 转换为排序学习格式\")\n",
"data, target_col = prepare_ranking_data(\n",
" df=data,\n",
" label_col=LABEL_NAME,\n",
" n_quantiles=N_QUANTILES,\n",
")\n",
"\n",
"# 5. 打印配置信息\n",
"print(f\"\\n[配置] 训练期: {TRAIN_START} - {TRAIN_END}\")\n",
"print(f\"[配置] 验证期: {VAL_START} - {VAL_END}\")\n",
"print(f\"[配置] 测试期: {TEST_START} - {TEST_END}\")\n",
"print(f\"[配置] 特征数: {len(feature_cols)}\")\n",
"print(f\"[配置] 目标变量: {target_col}{N_QUANTILES}分位数)\")\n",
"\n",
"# 6. 创建排序学习模型\n",
"model = LightGBMLambdaRankModel(params=MODEL_PARAMS)\n",
"\n",
"# 7. 创建数据处理器\n",
"processors = PROCESSORS\n",
"\n",
"# 8. 创建数据划分器\n",
"splitter = DateSplitter(\n",
" train_start=TRAIN_START,\n",
" train_end=TRAIN_END,\n",
" val_start=VAL_START,\n",
" val_end=VAL_END,\n",
" test_start=TEST_START,\n",
" test_end=TEST_END,\n",
")\n",
"\n",
"# 9. 创建股票池管理器\n",
"pool_manager = StockPoolManager(\n",
" filter_func=stock_pool_filter,\n",
" required_columns=STOCK_FILTER_REQUIRED_COLUMNS,\n",
" data_router=engine.router,\n",
")\n",
"\n",
"# 10. 创建 ST 过滤器\n",
"st_filter = STFilter(data_router=engine.router)\n",
"\n",
"# 11. 创建训练器\n",
"trainer = Trainer(\n",
" model=model,\n",
" pool_manager=pool_manager,\n",
" processors=processors,\n",
" filters=[st_filter],\n",
" splitter=splitter,\n",
" target_col=target_col,\n",
" feature_cols=feature_cols,\n",
" persist_model=PERSIST_MODEL,\n",
")"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"================================================================================\n",
"LightGBM LambdaRank 排序学习训练\n",
"================================================================================\n",
"\n",
"[1] 创建 FactorEngine\n",
"\n",
"[2] 定义因子(字符串表达式)\n",
"================================================================================\n",
"使用字符串表达式定义因子\n",
"================================================================================\n",
"\n",
"注册特征因子:\n",
" - ma_5: ts_mean(close, 5)\n",
" - ma_20: ts_mean(close, 20)\n",
" - ma_ratio_5_20: ts_mean(close, 5) / (ts_mean(close, 20) + 1e-8) - 1\n",
" - bias_10: close / (ts_mean(close, 10) + 1e-8) - 1\n",
" - high_low_ratio: (close - ts_min(low, 20)) / (ts_max(high, 20) - ts_min(low, 20) + 1e-8)\n",
" - bbi_ratio: (ts_mean(close, 3) + ts_mean(close, 6) + ts_mean(close, 12) + ts_mean(close, 24)) / (4 * close + 1e-8)\n",
" - return_5: (close / (ts_delay(close, 5) + 1e-8)) - 1\n",
" - return_20: (close / (ts_delay(close, 20) + 1e-8)) - 1\n",
" - kaufman_ER_20: abs(close - ts_delay(close, 20)) / (ts_sum(abs(close - ts_delay(close, 1)), 20) + 1e-8)\n",
" - mom_acceleration_10_20: (close / (ts_delay(close, 10) + 1e-8) - 1) - (ts_delay(close, 10) / (ts_delay(close, 20) + 1e-8) - 1)\n",
" - drawdown_from_high_60: close / (ts_max(high, 60) + 1e-8) - 1\n",
" - up_days_ratio_20: ts_sum(close > ts_delay(close, 1), 20) / 20\n",
" - volatility_5: ts_std(close, 5)\n",
" - volatility_20: ts_std(close, 20)\n",
" - volatility_ratio: ts_std(close, 5) / (ts_std(close, 20) + 1e-8)\n",
" - std_return_20: ts_std((close / (ts_delay(close, 1) + 1e-8)) - 1, 20)\n",
" - sharpe_ratio_20: ts_mean(close / (ts_delay(close, 1) + 1e-8) - 1, 20) / (ts_std(close / (ts_delay(close, 1) + 1e-8) - 1, 20) + 1e-8)\n",
" - min_ret_20: ts_min(close / (ts_delay(close, 1) + 1e-8) - 1, 20)\n",
" - volatility_squeeze_5_60: ts_std(close, 5) / (ts_std(close, 60) + 1e-8)\n",
" - overnight_intraday_diff: (open / (ts_delay(close, 1) + 1e-8) - 1) - (close / (open + 1e-8) - 1)\n",
" - upper_shadow_ratio: (high - ((open + close + abs(open - close)) / 2)) / (high - low + 1e-8)\n",
" - capital_retention_20: ts_sum(abs(close - open), 20) / (ts_sum(high - low, 20) + 1e-8)\n",
" - max_ret_20: ts_max(close / (ts_delay(close, 1) + 1e-8) - 1, 20)\n",
" - volume_ratio_5_20: ts_mean(vol, 5) / (ts_mean(vol, 20) + 1e-8)\n",
" - turnover_rate_mean_5: ts_mean(turnover_rate, 5)\n",
" - turnover_deviation: (turnover_rate - ts_mean(turnover_rate, 10)) / (ts_std(turnover_rate, 10) + 1e-8)\n",
" - amihud_illiq_20: ts_mean(abs(close / (ts_delay(close, 1) + 1e-8) - 1) / (amount + 1e-8), 20)\n",
" - turnover_cv_20: ts_std(turnover_rate, 20) / (ts_mean(turnover_rate, 20) + 1e-8)\n",
" - pv_corr_20: ts_corr(close / (ts_delay(close, 1) + 1e-8) - 1, vol, 20)\n",
" - close_vwap_deviation: close / (amount / (vol * 100 + 1e-8) + 1e-8) - 1\n",
" - roe: n_income / (total_hldr_eqy_exc_min_int + 1e-8)\n",
" - roa: n_income / (total_assets + 1e-8)\n",
" - profit_margin: n_income / (revenue + 1e-8)\n",
" - debt_to_equity: total_liab / (total_hldr_eqy_exc_min_int + 1e-8)\n",
" - current_ratio: total_cur_assets / (total_cur_liab + 1e-8)\n",
" - net_profit_yoy: (n_income / (ts_delay(n_income, 252) + 1e-8)) - 1\n",
" - revenue_yoy: (revenue / (ts_delay(revenue, 252) + 1e-8)) - 1\n",
" - healthy_expansion_velocity: (total_assets / (ts_delay(total_assets, 252) + 1e-8) - 1) - (total_liab / (ts_delay(total_liab, 252) + 1e-8) - 1)\n",
" - EP: n_income / (total_mv * 10000 + 1e-8)\n",
" - BP: total_hldr_eqy_exc_min_int / (total_mv * 10000 + 1e-8)\n",
" - CP: n_cashflow_act / (total_mv * 10000 + 1e-8)\n",
" - market_cap_rank: cs_rank(total_mv)\n",
" - turnover_rank: cs_rank(turnover_rate)\n",
" - return_5_rank: cs_rank((close / (ts_delay(close, 5) + 1e-8)) - 1)\n",
" - EP_rank: cs_rank(n_income / (total_mv + 1e-8))\n",
" - pe_expansion_trend: (total_mv / (n_income + 1e-8)) / (ts_delay(total_mv, 60) / (ts_delay(n_income, 60) + 1e-8) + 1e-8) - 1\n",
" - value_price_divergence: cs_rank((n_income - ts_delay(n_income, 252)) / (abs(ts_delay(n_income, 252)) + 1e-8)) - cs_rank(close / (ts_delay(close, 20) + 1e-8))\n",
" - active_market_cap: total_mv * ts_mean(turnover_rate, 20)\n",
" - ebit_rank: cs_rank(ebit)\n",
"\n",
"注册 Label 因子:\n",
" - future_return_5_rank: (ts_delay(close, -5) / ts_delay(open, -1)) - 1\n",
"\n",
"特征因子数: 49\n",
"Label: future_return_5_rank\n",
"已注册因子总数: 50\n",
"\n",
"[3] 准备数据\n",
"\n",
"================================================================================\n",
"准备数据\n",
"================================================================================\n",
"\n",
"计算因子: 20200101 - 20251231\n",
"[FinancialLoader] 加载 financial_fina_indicator 失败: Binder Error: Referenced column \"f_ann_date\" not found in FROM clause!\n",
"Candidate bindings: \"ann_date\", \"end_date\", \"ocf_to_debt\", \"arturn_days\", \"nca_to_assets\"\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"D:\\PyProject\\ProStock\\src\\data\\financial_loader.py:148: UserWarning: Sortedness of columns cannot be checked when 'by' groups provided\n",
" merged = df_price.join_asof(\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"数据形状: (7044952, 70)\n",
"数据列: ['ts_code', 'trade_date', 'close', 'open', 'high', 'amount', 'low', 'vol', 'turnover_rate', 'total_assets', 'total_mv', 'f_ann_date', 'n_income', 'revenue', 'total_liab', 'total_cur_liab', 'total_cur_assets', 'total_hldr_eqy_exc_min_int', 'n_cashflow_act', 'ebit', 'ma_5', 'ma_20', 'ma_ratio_5_20', 'bias_10', 'high_low_ratio', 'bbi_ratio', 'return_5', 'return_20', 'kaufman_ER_20', 'mom_acceleration_10_20', 'drawdown_from_high_60', 'up_days_ratio_20', 'volatility_5', 'volatility_20', 'volatility_ratio', 'std_return_20', 'sharpe_ratio_20', 'min_ret_20', 'volatility_squeeze_5_60', 'overnight_intraday_diff', 'upper_shadow_ratio', 'capital_retention_20', 'max_ret_20', 'volume_ratio_5_20', 'turnover_rate_mean_5', 'turnover_deviation', 'amihud_illiq_20', 'turnover_cv_20', 'pv_corr_20', 'close_vwap_deviation', 'roe', 'roa', 'profit_margin', 'debt_to_equity', 'current_ratio', 'net_profit_yoy', 'revenue_yoy', 'healthy_expansion_velocity', 'EP', 'BP', 'CP', 'market_cap_rank', 'turnover_rank', 'return_5_rank', 'EP_rank', 'pe_expansion_trend', 'value_price_divergence', 'active_market_cap', 'ebit_rank', 'future_return_5_rank']\n",
"\n",
"前5行预览:\n",
"shape: (5, 70)\n",
"┌───────────┬────────────┬─────────┬─────────┬───┬────────────┬────────────┬───────────┬───────────┐\n",
"│ ts_code ┆ trade_date ┆ close ┆ open ┆ … ┆ value_pric ┆ active_mar ┆ ebit_rank ┆ future_re │\n",
"│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ e_divergen ┆ ket_cap ┆ --- ┆ turn_5_ra │\n",
"│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ ce ┆ --- ┆ f64 ┆ nk │\n",
"│ ┆ ┆ ┆ ┆ ┆ --- ┆ f64 ┆ ┆ --- │\n",
"│ ┆ ┆ ┆ ┆ ┆ f64 ┆ ┆ ┆ f64 │\n",
"╞═══════════╪════════════╪═════════╪═════════╪═══╪════════════╪════════════╪═══════════╪═══════════╡\n",
"│ 000001.SZ ┆ 20200102 ┆ 1841.69 ┆ 1817.67 ┆ … ┆ null ┆ null ┆ null ┆ -0.008857 │\n",
"│ 000001.SZ ┆ 20200103 ┆ 1875.53 ┆ 1849.33 ┆ … ┆ null ┆ null ┆ null ┆ -0.01881 │\n",
"│ 000001.SZ ┆ 20200106 ┆ 1863.52 ┆ 1856.97 ┆ … ┆ null ┆ null ┆ null ┆ -0.008171 │\n",
"│ 000001.SZ ┆ 20200107 ┆ 1872.26 ┆ 1870.07 ┆ … ┆ null ┆ null ┆ null ┆ -0.014117 │\n",
"│ 000001.SZ ┆ 20200108 ┆ 1818.76 ┆ 1855.88 ┆ … ┆ null ┆ null ┆ null ┆ -0.017252 │\n",
"└───────────┴────────────┴─────────┴─────────┴───┴────────────┴────────────┴───────────┴───────────┘\n",
"\n",
"[4] 转换为排序学习格式\n",
"\n",
"================================================================================\n",
"准备排序学习数据(将 future_return_5_rank 转换为 20 分位数标签)\n",
"================================================================================\n",
"\n",
"原始 future_return_5_rank 统计:\n",
"shape: (9, 2)\n",
"┌────────────┬───────────┐\n",
"│ statistic ┆ value │\n",
"│ --- ┆ --- │\n",
"│ str ┆ f64 │\n",
"╞════════════╪═══════════╡\n",
"│ count ┆ 7.01659e6 │\n",
"│ null_count ┆ 28362.0 │\n",
"│ mean ┆ 0.003779 │\n",
"│ std ┆ 0.073221 │\n",
"│ min ┆ -0.969459 │\n",
"│ 25% ┆ -0.033163 │\n",
"│ 50% ┆ -0.001483 │\n",
"│ 75% ┆ 0.032547 │\n",
"│ max ┆ 10.361925 │\n",
"└────────────┴───────────┘\n",
"\n",
"转换后 future_return_5_rank_rank 统计:\n",
"shape: (9, 2)\n",
"┌────────────┬───────────┐\n",
"│ statistic ┆ value │\n",
"│ --- ┆ --- │\n",
"│ str ┆ f64 │\n",
"╞════════════╪═══════════╡\n",
"│ count ┆ 7.01659e6 │\n",
"│ null_count ┆ 28362.0 │\n",
"│ mean ┆ 9.495412 │\n",
"│ std ┆ 5.765668 │\n",
"│ min ┆ 0.0 │\n",
"│ 25% ┆ 4.0 │\n",
"│ 50% ┆ 9.0 │\n",
"│ 75% ┆ 14.0 │\n",
"│ max ┆ 19.0 │\n",
"└────────────┴───────────┘\n",
"\n",
"每日样本数统计:\n",
"shape: (9, 2)\n",
"┌────────────┬─────────────┐\n",
"│ statistic ┆ value │\n",
"│ --- ┆ --- │\n",
"│ str ┆ f64 │\n",
"╞════════════╪═════════════╡\n",
"│ count ┆ 1455.0 │\n",
"│ null_count ┆ 0.0 │\n",
"│ mean ┆ 4841.891409 │\n",
"│ std ┆ 560.948186 │\n",
"│ min ┆ 3740.0 │\n",
"│ 25% ┆ 4369.0 │\n",
"│ 50% ┆ 5060.0 │\n",
"│ 75% ┆ 5344.0 │\n",
"│ max ┆ 5458.0 │\n",
"└────────────┴─────────────┘\n",
"\n",
"分位数标签分布:\n",
"shape: (21, 2)\n",
"┌───────────────────────────┬────────┐\n",
"│ future_return_5_rank_rank ┆ count │\n",
"│ --- ┆ --- │\n",
"│ i64 ┆ u32 │\n",
"╞═══════════════════════════╪════════╡\n",
"│ null ┆ 28362 │\n",
"│ 0 ┆ 351599 │\n",
"│ 1 ┆ 350894 │\n",
"│ 2 ┆ 350944 │\n",
"│ 3 ┆ 351077 │\n",
"│ … ┆ … │\n",
"│ 15 ┆ 350910 │\n",
"│ 16 ┆ 350835 │\n",
"│ 17 ┆ 350848 │\n",
"│ 18 ┆ 350871 │\n",
"│ 19 ┆ 349137 │\n",
"└───────────────────────────┴────────┘\n",
"\n",
"[配置] 训练期: 20200101 - 20231231\n",
"[配置] 验证期: 20240101 - 20241231\n",
"[配置] 测试期: 20250101 - 20251231\n",
"[配置] 特征数: 49\n",
"[配置] 目标变量: future_return_5_rank_rank20分位数\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\liaozhaorun\\AppData\\Local\\Temp\\ipykernel_29336\\551043002.py:108: DeprecationWarning: `pl.count()` is deprecated. Please use `pl.len()` instead.\n",
"(Deprecated in version 0.20.5)\n",
" daily_counts = df_ranked.group_by(date_col).agg(pl.count().alias(\"count\"))\n"
]
}
],
"execution_count": 5
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.1 股票池筛选"
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2026-03-11T13:28:49.070709Z",
"start_time": "2026-03-11T13:28:24.501332Z"
}
},
"source": [
"print(\"\\n\" + \"=\" * 80)\n",
"print(\"股票池筛选\")\n",
"print(\"=\" * 80)\n",
"\n",
"# 先执行 ST 过滤(在股票池筛选之前,与 Trainer.train() 保持一致)\n",
"if st_filter:\n",
" print(\"\\n[过滤] 应用 ST 过滤器...\")\n",
" data = st_filter.filter(data)\n",
" print(f\" ST 过滤后数据规模: {data.shape}\")\n",
"\n",
"if pool_manager:\n",
" print(\"\\n执行每日独立筛选股票池...\")\n",
" filtered_data = pool_manager.filter_and_select_daily(data)\n",
" print(f\" 筛选前数据规模: {data.shape}\")\n",
" print(f\" 筛选后数据规模: {filtered_data.shape}\")\n",
" print(f\" 筛选前股票数: {data['ts_code'].n_unique()}\")\n",
" print(f\" 筛选后股票数: {filtered_data['ts_code'].n_unique()}\")\n",
" print(f\" 删除记录数: {len(data) - len(filtered_data)}\")\n",
"else:\n",
" filtered_data = data\n",
" print(\" 未配置股票池管理器,跳过筛选\")"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"================================================================================\n",
"股票池筛选\n",
"================================================================================\n",
"\n",
"[过滤] 应用 ST 过滤器...\n",
" [20200103] 过滤 129 只 ST 股票\n",
" [20200106] 过滤 129 只 ST 股票\n",
" [20200107] 过滤 128 只 ST 股票\n",
" [20200108] 过滤 128 只 ST 股票\n",
" [20200109] 过滤 128 只 ST 股票\n",
" [20200110] 过滤 128 只 ST 股票\n",
" [20200113] 过滤 129 只 ST 股票\n",
" [20200114] 过滤 129 只 ST 股票\n",
" [20200115] 过滤 130 只 ST 股票\n",
" [20200116] 过滤 130 只 ST 股票\n",
" [20200117] 过滤 129 只 ST 股票\n",
" [20200120] 过滤 129 只 ST 股票\n",
" [20200121] 过滤 131 只 ST 股票\n",
" [20200122] 过滤 132 只 ST 股票\n",
" [20200123] 过滤 132 只 ST 股票\n",
" [20200203] 过滤 132 只 ST 股票\n",
" [20200204] 过滤 132 只 ST 股票\n",
" [20200205] 过滤 132 只 ST 股票\n",
" [20200206] 过滤 132 只 ST 股票\n",
" [20200207] 过滤 132 只 ST 股票\n",
" [20200210] 过滤 132 只 ST 股票\n",
" [20200211] 过滤 132 只 ST 股票\n",
" [20200212] 过滤 132 只 ST 股票\n",
" [20200213] 过滤 132 只 ST 股票\n",
" [20200214] 过滤 132 只 ST 股票\n",
" [20200217] 过滤 132 只 ST 股票\n",
" [20200218] 过滤 132 只 ST 股票\n",
" [20200219] 过滤 132 只 ST 股票\n",
" [20200221] 过滤 132 只 ST 股票\n",
" [20200224] 过滤 132 只 ST 股票\n",
" [20200226] 过滤 132 只 ST 股票\n",
" [20200227] 过滤 131 只 ST 股票\n",
" [20200228] 过滤 132 只 ST 股票\n",
" [20200302] 过滤 132 只 ST 股票\n",
" [20200303] 过滤 131 只 ST 股票\n",
" [20200304] 过滤 130 只 ST 股票\n",
" [20200305] 过滤 129 只 ST 股票\n",
" [20200306] 过滤 129 只 ST 股票\n",
" [20200309] 过滤 129 只 ST 股票\n",
" [20200310] 过滤 129 只 ST 股票\n",
" [20200311] 过滤 129 只 ST 股票\n",
" [20200312] 过滤 129 只 ST 股票\n",
" [20200313] 过滤 129 只 ST 股票\n",
" [20200317] 过滤 129 只 ST 股票\n",
" [20200318] 过滤 129 只 ST 股票\n",
" [20200319] 过滤 130 只 ST 股票\n",
" [20200320] 过滤 129 只 ST 股票\n",
" [20200323] 过滤 130 只 ST 股票\n",
" [20200324] 过滤 130 只 ST 股票\n",
" [20200325] 过滤 130 只 ST 股票\n",
" [20200326] 过滤 130 只 ST 股票\n",
" [20200327] 过滤 130 只 ST 股票\n",
" [20200330] 过滤 130 只 ST 股票\n",
" [20200331] 过滤 131 只 ST 股票\n",
" [20200401] 过滤 133 只 ST 股票\n",
" [20200402] 过滤 133 只 ST 股票\n",
" [20200403] 过滤 133 只 ST 股票\n",
" [20200407] 过滤 133 只 ST 股票\n",
" [20200408] 过滤 131 只 ST 股票\n",
" [20200409] 过滤 132 只 ST 股票\n",
" [20200410] 过滤 131 只 ST 股票\n",
" [20200413] 过滤 130 只 ST 股票\n",
" [20200414] 过滤 129 只 ST 股票\n",
" [20200415] 过滤 130 只 ST 股票\n",
" [20200416] 过滤 131 只 ST 股票\n",
" [20200417] 过滤 131 只 ST 股票\n",
" [20200420] 过滤 127 只 ST 股票\n",
" [20200421] 过滤 128 只 ST 股票\n",
" [20200422] 过滤 131 只 ST 股票\n",
" [20200424] 过滤 132 只 ST 股票\n",
" [20200427] 过滤 135 只 ST 股票\n",
" [20200428] 过滤 135 只 ST 股票\n",
" [20200429] 过滤 139 只 ST 股票\n",
" [20200430] 过滤 151 只 ST 股票\n",
" [20200506] 过滤 183 只 ST 股票\n",
" [20200507] 过滤 184 只 ST 股票\n",
" [20200508] 过滤 182 只 ST 股票\n",
" [20200511] 过滤 184 只 ST 股票\n",
" [20200512] 过滤 182 只 ST 股票\n",
" [20200513] 过滤 184 只 ST 股票\n",
" [20200514] 过滤 184 只 ST 股票\n",
" [20200515] 过滤 184 只 ST 股票\n",
" [20200518] 过滤 184 只 ST 股票\n",
" [20200519] 过滤 184 只 ST 股票\n",
" [20200520] 过滤 183 只 ST 股票\n",
" [20200521] 过滤 184 只 ST 股票\n",
" [20200522] 过滤 184 只 ST 股票\n",
" [20200525] 过滤 183 只 ST 股票\n",
" [20200526] 过滤 183 只 ST 股票\n",
" [20200527] 过滤 183 只 ST 股票\n",
" [20200528] 过滤 181 只 ST 股票\n",
" [20200529] 过滤 181 只 ST 股票\n",
" [20200601] 过滤 182 只 ST 股票\n",
" [20200602] 过滤 184 只 ST 股票\n",
" [20200603] 过滤 182 只 ST 股票\n",
" [20200604] 过滤 181 只 ST 股票\n",
" [20200605] 过滤 180 只 ST 股票\n",
" [20200608] 过滤 176 只 ST 股票\n",
" [20200609] 过滤 180 只 ST 股票\n",
" [20200610] 过滤 179 只 ST 股票\n",
" [20200611] 过滤 178 只 ST 股票\n",
" [20200612] 过滤 180 只 ST 股票\n",
" [20200615] 过滤 182 只 ST 股票\n",
" [20200616] 过滤 183 只 ST 股票\n",
" [20200617] 过滤 182 只 ST 股票\n",
" [20200619] 过滤 183 只 ST 股票\n",
" [20200622] 过滤 183 只 ST 股票\n",
" [20200623] 过滤 183 只 ST 股票\n",
" [20200624] 过滤 186 只 ST 股票\n",
" [20200629] 过滤 190 只 ST 股票\n",
" [20200630] 过滤 188 只 ST 股票\n",
" [20200701] 过滤 196 只 ST 股票\n",
" [20200702] 过滤 197 只 ST 股票\n",
" [20200703] 过滤 197 只 ST 股票\n",
" [20200706] 过滤 197 只 ST 股票\n",
" [20200707] 过滤 196 只 ST 股票\n",
" [20200709] 过滤 197 只 ST 股票\n",
" [20200710] 过滤 196 只 ST 股票\n",
" [20200713] 过滤 197 只 ST 股票\n",
" [20200714] 过滤 197 只 ST 股票\n",
" [20200715] 过滤 197 只 ST 股票\n",
" [20200716] 过滤 195 只 ST 股票\n",
" [20200717] 过滤 196 只 ST 股票\n",
" [20200721] 过滤 195 只 ST 股票\n",
" [20200722] 过滤 194 只 ST 股票\n",
" [20200723] 过滤 193 只 ST 股票\n",
" [20200724] 过滤 194 只 ST 股票\n",
" [20200727] 过滤 195 只 ST 股票\n",
" [20200728] 过滤 195 只 ST 股票\n",
" [20200729] 过滤 195 只 ST 股票\n",
" [20200730] 过滤 196 只 ST 股票\n",
" [20200731] 过滤 196 只 ST 股票\n",
" [20200805] 过滤 194 只 ST 股票\n",
" [20200806] 过滤 195 只 ST 股票\n",
" [20200807] 过滤 195 只 ST 股票\n",
" [20200810] 过滤 194 只 ST 股票\n",
" [20200811] 过滤 194 只 ST 股票\n",
" [20200812] 过滤 195 只 ST 股票\n",
" [20200813] 过滤 194 只 ST 股票\n",
" [20200814] 过滤 194 只 ST 股票\n",
" [20200817] 过滤 195 只 ST 股票\n",
" [20200818] 过滤 195 只 ST 股票\n",
" [20200819] 过滤 195 只 ST 股票\n",
" [20200820] 过滤 196 只 ST 股票\n",
" [20200821] 过滤 196 只 ST 股票\n",
" [20200825] 过滤 198 只 ST 股票\n",
" [20200826] 过滤 198 只 ST 股票\n",
" [20200827] 过滤 198 只 ST 股票\n",
" [20200828] 过滤 198 只 ST 股票\n",
" [20200831] 过滤 198 只 ST 股票\n",
" [20200901] 过滤 199 只 ST 股票\n",
" [20200902] 过滤 199 只 ST 股票\n",
" [20200903] 过滤 199 只 ST 股票\n",
" [20200904] 过滤 198 只 ST 股票\n",
" [20200907] 过滤 197 只 ST 股票\n",
" [20200908] 过滤 197 只 ST 股票\n",
" [20200909] 过滤 197 只 ST 股票\n",
" [20200910] 过滤 197 只 ST 股票\n",
" [20200911] 过滤 197 只 ST 股票\n",
" [20200914] 过滤 197 只 ST 股票\n",
" [20200915] 过滤 200 只 ST 股票\n",
" [20200916] 过滤 200 只 ST 股票\n",
" [20200917] 过滤 199 只 ST 股票\n",
" [20200918] 过滤 200 只 ST 股票\n",
" [20200921] 过滤 200 只 ST 股票\n",
" [20200922] 过滤 201 只 ST 股票\n",
" [20200923] 过滤 201 只 ST 股票\n",
" [20200924] 过滤 200 只 ST 股票\n",
" [20200925] 过滤 200 只 ST 股票\n",
" [20200928] 过滤 202 只 ST 股票\n",
" [20200929] 过滤 203 只 ST 股票\n",
" [20200930] 过滤 204 只 ST 股票\n",
" [20201009] 过滤 204 只 ST 股票\n",
" [20201012] 过滤 204 只 ST 股票\n",
" [20201013] 过滤 204 只 ST 股票\n",
" [20201014] 过滤 203 只 ST 股票\n",
" [20201015] 过滤 203 只 ST 股票\n",
" [20201016] 过滤 203 只 ST 股票\n",
" [20201019] 过滤 203 只 ST 股票\n",
" [20201020] 过滤 203 只 ST 股票\n",
" [20201021] 过滤 203 只 ST 股票\n",
" [20201022] 过滤 203 只 ST 股票\n",
" [20201023] 过滤 203 只 ST 股票\n",
" [20201026] 过滤 203 只 ST 股票\n",
" [20201027] 过滤 203 只 ST 股票\n",
" [20201028] 过滤 203 只 ST 股票\n",
" [20201029] 过滤 203 只 ST 股票\n",
" [20201030] 过滤 201 只 ST 股票\n",
" [20201102] 过滤 201 只 ST 股票\n",
" [20201103] 过滤 203 只 ST 股票\n",
" [20201104] 过滤 204 只 ST 股票\n",
" [20201105] 过滤 204 只 ST 股票\n",
" [20201106] 过滤 204 只 ST 股票\n",
" [20201109] 过滤 203 只 ST 股票\n",
" [20201110] 过滤 203 只 ST 股票\n",
" [20201111] 过滤 203 只 ST 股票\n",
" [20201112] 过滤 203 只 ST 股票\n",
" [20201113] 过滤 203 只 ST 股票\n",
" [20201116] 过滤 204 只 ST 股票\n",
" [20201117] 过滤 204 只 ST 股票\n",
" [20201118] 过滤 204 只 ST 股票\n",
" [20201119] 过滤 204 只 ST 股票\n",
" [20201123] 过滤 203 只 ST 股票\n",
" [20201124] 过滤 203 只 ST 股票\n",
" [20201125] 过滤 201 只 ST 股票\n",
" [20201126] 过滤 202 只 ST 股票\n",
" [20201127] 过滤 202 只 ST 股票\n",
" [20201130] 过滤 202 只 ST 股票\n",
" [20201201] 过滤 202 只 ST 股票\n",
" [20201202] 过滤 202 只 ST 股票\n",
" [20201203] 过滤 202 只 ST 股票\n",
" [20201204] 过滤 201 只 ST 股票\n",
" [20201207] 过滤 201 只 ST 股票\n",
" [20201208] 过滤 201 只 ST 股票\n",
" [20201209] 过滤 201 只 ST 股票\n",
" [20201210] 过滤 201 只 ST 股票\n",
" [20201211] 过滤 201 只 ST 股票\n",
" [20201214] 过滤 202 只 ST 股票\n",
" [20201215] 过滤 203 只 ST 股票\n",
" [20201216] 过滤 203 只 ST 股票\n",
" [20201217] 过滤 203 只 ST 股票\n",
" [20201218] 过滤 203 只 ST 股票\n",
" [20201221] 过滤 203 只 ST 股票\n",
" [20201222] 过滤 201 只 ST 股票\n",
" [20201223] 过滤 201 只 ST 股票\n",
" [20201224] 过滤 200 只 ST 股票\n",
" [20201225] 过滤 200 只 ST 股票\n",
" [20201228] 过滤 200 只 ST 股票\n",
" [20201229] 过滤 201 只 ST 股票\n",
" [20201230] 过滤 201 只 ST 股票\n",
" [20201231] 过滤 200 只 ST 股票\n",
" [20210104] 过滤 199 只 ST 股票\n",
" [20210105] 过滤 199 只 ST 股票\n",
" [20210106] 过滤 199 只 ST 股票\n",
" [20210107] 过滤 199 只 ST 股票\n",
" [20210108] 过滤 199 只 ST 股票\n",
" [20210111] 过滤 199 只 ST 股票\n",
" [20210112] 过滤 199 只 ST 股票\n",
" [20210113] 过滤 199 只 ST 股票\n",
" [20210114] 过滤 198 只 ST 股票\n",
" [20210115] 过滤 198 只 ST 股票\n",
" [20210118] 过滤 198 只 ST 股票\n",
" [20210119] 过滤 199 只 ST 股票\n",
" [20210120] 过滤 199 只 ST 股票\n",
" [20210121] 过滤 198 只 ST 股票\n",
" [20210122] 过滤 198 只 ST 股票\n",
" [20210125] 过滤 198 只 ST 股票\n",
" [20210126] 过滤 199 只 ST 股票\n",
" [20210127] 过滤 199 只 ST 股票\n",
" [20210128] 过滤 199 只 ST 股票\n",
" [20210201] 过滤 197 只 ST 股票\n",
" [20210202] 过滤 199 只 ST 股票\n",
" [20210203] 过滤 199 只 ST 股票\n",
" [20210204] 过滤 200 只 ST 股票\n",
" [20210205] 过滤 200 只 ST 股票\n",
" [20210208] 过滤 199 只 ST 股票\n",
" [20210209] 过滤 200 只 ST 股票\n",
" [20210210] 过滤 200 只 ST 股票\n",
" [20210218] 过滤 200 只 ST 股票\n",
" [20210219] 过滤 203 只 ST 股票\n",
" [20210222] 过滤 203 只 ST 股票\n",
" [20210223] 过滤 202 只 ST 股票\n",
" [20210224] 过滤 202 只 ST 股票\n",
" [20210225] 过滤 201 只 ST 股票\n",
" [20210226] 过滤 200 只 ST 股票\n",
" [20210301] 过滤 200 只 ST 股票\n",
" [20210302] 过滤 200 只 ST 股票\n",
" [20210303] 过滤 200 只 ST 股票\n",
" [20210304] 过滤 201 只 ST 股票\n",
" [20210305] 过滤 200 只 ST 股票\n",
" [20210308] 过滤 201 只 ST 股票\n",
" [20210309] 过滤 201 只 ST 股票\n",
" [20210310] 过滤 201 只 ST 股票\n",
" [20210311] 过滤 200 只 ST 股票\n",
" [20210312] 过滤 199 只 ST 股票\n",
" [20210315] 过滤 198 只 ST 股票\n",
" [20210317] 过滤 198 只 ST 股票\n",
" [20210318] 过滤 198 只 ST 股票\n",
" [20210319] 过滤 195 只 ST 股票\n",
" [20210322] 过滤 194 只 ST 股票\n",
" [20210323] 过滤 194 只 ST 股票\n",
" [20210324] 过滤 194 只 ST 股票\n",
" [20210325] 过滤 194 只 ST 股票\n",
" [20210326] 过滤 194 只 ST 股票\n",
" [20210329] 过滤 194 只 ST 股票\n",
" [20210330] 过滤 194 只 ST 股票\n",
" [20210331] 过滤 192 只 ST 股票\n",
" [20210401] 过滤 191 只 ST 股票\n",
" [20210402] 过滤 189 只 ST 股票\n",
" [20210406] 过滤 190 只 ST 股票\n",
" [20210407] 过滤 191 只 ST 股票\n",
" [20210408] 过滤 191 只 ST 股票\n",
" [20210409] 过滤 190 只 ST 股票\n",
" [20210412] 过滤 188 只 ST 股票\n",
" [20210413] 过滤 187 只 ST 股票\n",
" [20210414] 过滤 186 只 ST 股票\n",
" [20210415] 过滤 182 只 ST 股票\n",
" [20210416] 过滤 180 只 ST 股票\n",
" [20210419] 过滤 179 只 ST 股票\n",
" [20210420] 过滤 179 只 ST 股票\n",
" [20210421] 过滤 180 只 ST 股票\n",
" [20210422] 过滤 180 只 ST 股票\n",
" [20210423] 过滤 178 只 ST 股票\n",
" [20210426] 过滤 183 只 ST 股票\n",
" [20210427] 过滤 180 只 ST 股票\n",
" [20210428] 过滤 190 只 ST 股票\n",
" [20210429] 过滤 185 只 ST 股票\n",
" [20210430] 过滤 200 只 ST 股票\n",
" [20210506] 过滤 225 只 ST 股票\n",
" [20210507] 过滤 222 只 ST 股票\n",
" [20210510] 过滤 218 只 ST 股票\n",
" [20210511] 过滤 215 只 ST 股票\n",
" [20210512] 过滤 214 只 ST 股票\n",
" [20210513] 过滤 212 只 ST 股票\n",
" [20210514] 过滤 210 只 ST 股票\n",
" [20210517] 过滤 208 只 ST 股票\n",
" [20210518] 过滤 202 只 ST 股票\n",
" [20210519] 过滤 196 只 ST 股票\n",
" [20210520] 过滤 202 只 ST 股票\n",
" [20210521] 过滤 201 只 ST 股票\n",
" [20210524] 过滤 199 只 ST 股票\n",
" [20210525] 过滤 198 只 ST 股票\n",
" [20210526] 过滤 197 只 ST 股票\n",
" [20210527] 过滤 197 只 ST 股票\n",
" [20210528] 过滤 196 只 ST 股票\n",
" [20210531] 过滤 196 只 ST 股票\n",
" [20210601] 过滤 196 只 ST 股票\n",
" [20210602] 过滤 195 只 ST 股票\n",
" [20210603] 过滤 193 只 ST 股票\n",
" [20210604] 过滤 193 只 ST 股票\n",
" [20210607] 过滤 190 只 ST 股票\n",
" [20210608] 过滤 191 只 ST 股票\n",
" [20210609] 过滤 190 只 ST 股票\n",
" [20210610] 过滤 189 只 ST 股票\n",
" [20210611] 过滤 190 只 ST 股票\n",
" [20210615] 过滤 187 只 ST 股票\n",
" [20210616] 过滤 187 只 ST 股票\n",
" [20210617] 过滤 186 只 ST 股票\n",
" [20210618] 过滤 185 只 ST 股票\n",
" [20210621] 过滤 183 只 ST 股票\n",
" [20210622] 过滤 183 只 ST 股票\n",
" [20210623] 过滤 181 只 ST 股票\n",
" [20210624] 过滤 183 只 ST 股票\n",
" [20210625] 过滤 181 只 ST 股票\n",
" [20210628] 过滤 181 只 ST 股票\n",
" [20210629] 过滤 181 只 ST 股票\n",
" [20210630] 过滤 180 只 ST 股票\n",
" [20210701] 过滤 180 只 ST 股票\n",
" [20210702] 过滤 182 只 ST 股票\n",
" [20210705] 过滤 182 只 ST 股票\n",
" [20210706] 过滤 182 只 ST 股票\n",
" [20210707] 过滤 184 只 ST 股票\n",
" [20210708] 过滤 184 只 ST 股票\n",
" [20210709] 过滤 182 只 ST 股票\n",
" [20210712] 过滤 182 只 ST 股票\n",
" [20210713] 过滤 183 只 ST 股票\n",
" [20210714] 过滤 182 只 ST 股票\n",
" [20210715] 过滤 181 只 ST 股票\n",
" [20210716] 过滤 181 只 ST 股票\n",
" [20210719] 过滤 180 只 ST 股票\n",
" [20210720] 过滤 179 只 ST 股票\n",
" [20210721] 过滤 178 只 ST 股票\n",
" [20210722] 过滤 180 只 ST 股票\n",
" [20210723] 过滤 181 只 ST 股票\n",
" [20210726] 过滤 182 只 ST 股票\n",
" [20210727] 过滤 181 只 ST 股票\n",
" [20210728] 过滤 181 只 ST 股票\n",
" [20210729] 过滤 180 只 ST 股票\n",
" [20210730] 过滤 180 只 ST 股票\n",
" [20210802] 过滤 180 只 ST 股票\n",
" [20210803] 过滤 180 只 ST 股票\n",
" [20210804] 过滤 180 只 ST 股票\n",
" [20210805] 过滤 181 只 ST 股票\n",
" [20210806] 过滤 181 只 ST 股票\n",
" [20210809] 过滤 179 只 ST 股票\n",
" [20210810] 过滤 179 只 ST 股票\n",
" [20210811] 过滤 179 只 ST 股票\n",
" [20210812] 过滤 179 只 ST 股票\n",
" [20210813] 过滤 179 只 ST 股票\n",
" [20210816] 过滤 179 只 ST 股票\n",
" [20210817] 过滤 180 只 ST 股票\n",
" [20210818] 过滤 180 只 ST 股票\n",
" [20210819] 过滤 180 只 ST 股票\n",
" [20210820] 过滤 180 只 ST 股票\n",
" [20210823] 过滤 179 只 ST 股票\n",
" [20210824] 过滤 181 只 ST 股票\n",
" [20210825] 过滤 181 只 ST 股票\n",
" [20210826] 过滤 180 只 ST 股票\n",
" [20210827] 过滤 181 只 ST 股票\n",
" [20210830] 过滤 180 只 ST 股票\n",
" [20210831] 过滤 180 只 ST 股票\n",
" [20210901] 过滤 180 只 ST 股票\n",
" [20210902] 过滤 180 只 ST 股票\n",
" [20210903] 过滤 180 只 ST 股票\n",
" [20210906] 过滤 180 只 ST 股票\n",
" [20210907] 过滤 181 只 ST 股票\n",
" [20210908] 过滤 181 只 ST 股票\n",
" [20210909] 过滤 181 只 ST 股票\n",
" [20210910] 过滤 181 只 ST 股票\n",
" [20210913] 过滤 181 只 ST 股票\n",
" [20210914] 过滤 181 只 ST 股票\n",
" [20210915] 过滤 182 只 ST 股票\n",
" [20210916] 过滤 182 只 ST 股票\n",
" [20210917] 过滤 182 只 ST 股票\n",
" [20210922] 过滤 180 只 ST 股票\n",
" [20210923] 过滤 179 只 ST 股票\n",
" [20210924] 过滤 180 只 ST 股票\n",
" [20210927] 过滤 178 只 ST 股票\n",
" [20210928] 过滤 178 只 ST 股票\n",
" [20210929] 过滤 180 只 ST 股票\n",
" [20210930] 过滤 180 只 ST 股票\n",
" [20211008] 过滤 181 只 ST 股票\n",
" [20211011] 过滤 181 只 ST 股票\n",
" [20211012] 过滤 182 只 ST 股票\n",
" [20211013] 过滤 182 只 ST 股票\n",
" [20211014] 过滤 182 只 ST 股票\n",
" [20211015] 过滤 182 只 ST 股票\n",
" [20211018] 过滤 182 只 ST 股票\n",
" [20211019] 过滤 182 只 ST 股票\n",
" [20211020] 过滤 182 只 ST 股票\n",
" [20211021] 过滤 182 只 ST 股票\n",
" [20211022] 过滤 182 只 ST 股票\n",
" [20211025] 过滤 182 只 ST 股票\n",
" [20211026] 过滤 182 只 ST 股票\n",
" [20211027] 过滤 182 只 ST 股票\n",
" [20211028] 过滤 182 只 ST 股票\n",
" [20211029] 过滤 182 只 ST 股票\n",
" [20211101] 过滤 182 只 ST 股票\n",
" [20211102] 过滤 182 只 ST 股票\n",
" [20211103] 过滤 182 只 ST 股票\n",
" [20211104] 过滤 182 只 ST 股票\n",
" [20211105] 过滤 182 只 ST 股票\n",
" [20211108] 过滤 182 只 ST 股票\n",
" [20211109] 过滤 180 只 ST 股票\n",
" [20211110] 过滤 181 只 ST 股票\n",
" [20211111] 过滤 181 只 ST 股票\n",
" [20211112] 过滤 182 只 ST 股票\n",
" [20211115] 过滤 182 只 ST 股票\n",
" [20211116] 过滤 182 只 ST 股票\n",
" [20211117] 过滤 180 只 ST 股票\n",
" [20211118] 过滤 182 只 ST 股票\n",
" [20211119] 过滤 182 只 ST 股票\n",
" [20211122] 过滤 182 只 ST 股票\n",
" [20211123] 过滤 182 只 ST 股票\n",
" [20211124] 过滤 182 只 ST 股票\n",
" [20211125] 过滤 182 只 ST 股票\n",
" [20211126] 过滤 182 只 ST 股票\n",
" [20211129] 过滤 182 只 ST 股票\n",
" [20211130] 过滤 182 只 ST 股票\n",
" [20211201] 过滤 181 只 ST 股票\n",
" [20211202] 过滤 180 只 ST 股票\n",
" [20211203] 过滤 179 只 ST 股票\n",
" [20211206] 过滤 180 只 ST 股票\n",
" [20211207] 过滤 180 只 ST 股票\n",
" [20211208] 过滤 180 只 ST 股票\n",
" [20211209] 过滤 181 只 ST 股票\n",
" [20211210] 过滤 181 只 ST 股票\n",
" [20211213] 过滤 181 只 ST 股票\n",
" [20211214] 过滤 180 只 ST 股票\n",
" [20211215] 过滤 181 只 ST 股票\n",
" [20211216] 过滤 180 只 ST 股票\n",
" [20211217] 过滤 178 只 ST 股票\n",
" [20211220] 过滤 178 只 ST 股票\n",
" [20211221] 过滤 177 只 ST 股票\n",
" [20211222] 过滤 178 只 ST 股票\n",
" [20211223] 过滤 178 只 ST 股票\n",
" [20211224] 过滤 177 只 ST 股票\n",
" [20211227] 过滤 177 只 ST 股票\n",
" [20211228] 过滤 177 只 ST 股票\n",
" [20211229] 过滤 177 只 ST 股票\n",
" [20211230] 过滤 175 只 ST 股票\n",
" [20211231] 过滤 174 只 ST 股票\n",
" [20220104] 过滤 177 只 ST 股票\n",
" [20220105] 过滤 177 只 ST 股票\n",
" [20220106] 过滤 178 只 ST 股票\n",
" [20220107] 过滤 178 只 ST 股票\n",
" [20220110] 过滤 178 只 ST 股票\n",
" [20220111] 过滤 178 只 ST 股票\n",
" [20220112] 过滤 178 只 ST 股票\n",
" [20220113] 过滤 177 只 ST 股票\n",
" [20220114] 过滤 178 只 ST 股票\n",
" [20220117] 过滤 179 只 ST 股票\n",
" [20220118] 过滤 179 只 ST 股票\n",
" [20220119] 过滤 179 只 ST 股票\n",
" [20220120] 过滤 179 只 ST 股票\n",
" [20220121] 过滤 179 只 ST 股票\n",
" [20220124] 过滤 179 只 ST 股票\n",
" [20220125] 过滤 179 只 ST 股票\n",
" [20220126] 过滤 179 只 ST 股票\n",
" [20220127] 过滤 179 只 ST 股票\n",
" [20220128] 过滤 179 只 ST 股票\n",
" [20220207] 过滤 178 只 ST 股票\n",
" [20220208] 过滤 178 只 ST 股票\n",
" [20220209] 过滤 179 只 ST 股票\n",
" [20220210] 过滤 179 只 ST 股票\n",
" [20220211] 过滤 179 只 ST 股票\n",
" [20220214] 过滤 178 只 ST 股票\n",
" [20220215] 过滤 179 只 ST 股票\n",
" [20220216] 过滤 179 只 ST 股票\n",
" [20220217] 过滤 179 只 ST 股票\n",
" [20220218] 过滤 179 只 ST 股票\n",
" [20220221] 过滤 179 只 ST 股票\n",
" [20220222] 过滤 179 只 ST 股票\n",
" [20220223] 过滤 179 只 ST 股票\n",
" [20220224] 过滤 179 只 ST 股票\n",
" [20220225] 过滤 179 只 ST 股票\n",
" [20220228] 过滤 179 只 ST 股票\n",
" [20220301] 过滤 179 只 ST 股票\n",
" [20220302] 过滤 179 只 ST 股票\n",
" [20220303] 过滤 178 只 ST 股票\n",
" [20220304] 过滤 179 只 ST 股票\n",
" [20220307] 过滤 178 只 ST 股票\n",
" [20220308] 过滤 177 只 ST 股票\n",
" [20220309] 过滤 177 只 ST 股票\n",
" [20220310] 过滤 178 只 ST 股票\n",
" [20220311] 过滤 178 只 ST 股票\n",
" [20220314] 过滤 178 只 ST 股票\n",
" [20220315] 过滤 179 只 ST 股票\n",
" [20220316] 过滤 179 只 ST 股票\n",
" [20220317] 过滤 179 只 ST 股票\n",
" [20220318] 过滤 178 只 ST 股票\n",
" [20220321] 过滤 178 只 ST 股票\n",
" [20220322] 过滤 178 只 ST 股票\n",
" [20220323] 过滤 178 只 ST 股票\n",
" [20220324] 过滤 177 只 ST 股票\n",
" [20220325] 过滤 176 只 ST 股票\n",
" [20220328] 过滤 176 只 ST 股票\n",
" [20220329] 过滤 176 只 ST 股票\n",
" [20220330] 过滤 176 只 ST 股票\n",
" [20220331] 过滤 173 只 ST 股票\n",
" [20220401] 过滤 171 只 ST 股票\n",
" [20220406] 过滤 171 只 ST 股票\n",
" [20220407] 过滤 170 只 ST 股票\n",
" [20220408] 过滤 170 只 ST 股票\n",
" [20220411] 过滤 168 只 ST 股票\n",
" [20220412] 过滤 167 只 ST 股票\n",
" [20220413] 过滤 167 只 ST 股票\n",
" [20220414] 过滤 167 只 ST 股票\n",
" [20220415] 过滤 165 只 ST 股票\n",
" [20220418] 过滤 163 只 ST 股票\n",
" [20220419] 过滤 165 只 ST 股票\n",
" [20220420] 过滤 165 只 ST 股票\n",
" [20220421] 过滤 167 只 ST 股票\n",
" [20220422] 过滤 165 只 ST 股票\n",
" [20220425] 过滤 167 只 ST 股票\n",
" [20220426] 过滤 166 只 ST 股票\n",
" [20220427] 过滤 164 只 ST 股票\n",
" [20220428] 过滤 162 只 ST 股票\n",
" [20220429] 过滤 162 只 ST 股票\n",
" [20220505] 过滤 135 只 ST 股票\n",
" [20220506] 过滤 168 只 ST 股票\n",
" [20220509] 过滤 166 只 ST 股票\n",
" [20220510] 过滤 164 只 ST 股票\n",
" [20220511] 过滤 163 只 ST 股票\n",
" [20220512] 过滤 161 只 ST 股票\n",
" [20220513] 过滤 162 只 ST 股票\n",
" [20220516] 过滤 162 只 ST 股票\n",
" [20220517] 过滤 161 只 ST 股票\n",
" [20220518] 过滤 159 只 ST 股票\n",
" [20220519] 过滤 155 只 ST 股票\n",
" [20220520] 过滤 155 只 ST 股票\n",
" [20220523] 过滤 155 只 ST 股票\n",
" [20220524] 过滤 154 只 ST 股票\n",
" [20220525] 过滤 151 只 ST 股票\n",
" [20220526] 过滤 149 只 ST 股票\n",
" [20220527] 过滤 149 只 ST 股票\n",
" [20220530] 过滤 148 只 ST 股票\n",
" [20220531] 过滤 149 只 ST 股票\n",
" [20220601] 过滤 149 只 ST 股票\n",
" [20220602] 过滤 148 只 ST 股票\n",
" [20220606] 过滤 149 只 ST 股票\n",
" [20220607] 过滤 149 只 ST 股票\n",
" [20220608] 过滤 149 只 ST 股票\n",
" [20220609] 过滤 148 只 ST 股票\n",
" [20220610] 过滤 147 只 ST 股票\n",
" [20220613] 过滤 148 只 ST 股票\n",
" [20220614] 过滤 146 只 ST 股票\n",
" [20220615] 过滤 147 只 ST 股票\n",
" [20220616] 过滤 147 只 ST 股票\n",
" [20220617] 过滤 147 只 ST 股票\n",
" [20220620] 过滤 147 只 ST 股票\n",
" [20220621] 过滤 147 只 ST 股票\n",
" [20220622] 过滤 144 只 ST 股票\n",
" [20220623] 过滤 145 只 ST 股票\n",
" [20220624] 过滤 143 只 ST 股票\n",
" [20220627] 过滤 144 只 ST 股票\n",
" [20220628] 过滤 144 只 ST 股票\n",
" [20220629] 过滤 144 只 ST 股票\n",
" [20220630] 过滤 142 只 ST 股票\n",
" [20220701] 过滤 144 只 ST 股票\n",
" [20220704] 过滤 144 只 ST 股票\n",
" [20220705] 过滤 144 只 ST 股票\n",
" [20220706] 过滤 144 只 ST 股票\n",
" [20220707] 过滤 144 只 ST 股票\n",
" [20220708] 过滤 144 只 ST 股票\n",
" [20220711] 过滤 143 只 ST 股票\n",
" [20220712] 过滤 143 只 ST 股票\n",
" [20220713] 过滤 144 只 ST 股票\n",
" [20220714] 过滤 145 只 ST 股票\n",
" [20220715] 过滤 145 只 ST 股票\n",
" [20220718] 过滤 145 只 ST 股票\n",
" [20220719] 过滤 145 只 ST 股票\n",
" [20220720] 过滤 145 只 ST 股票\n",
" [20220721] 过滤 145 只 ST 股票\n",
" [20220722] 过滤 145 只 ST 股票\n",
" [20220725] 过滤 143 只 ST 股票\n",
" [20220726] 过滤 144 只 ST 股票\n",
" [20220727] 过滤 144 只 ST 股票\n",
" [20220728] 过滤 144 只 ST 股票\n",
" [20220729] 过滤 144 只 ST 股票\n",
" [20220801] 过滤 145 只 ST 股票\n",
" [20220802] 过滤 145 只 ST 股票\n",
" [20220803] 过滤 145 只 ST 股票\n",
" [20220804] 过滤 145 只 ST 股票\n",
" [20220805] 过滤 145 只 ST 股票\n",
" [20220808] 过滤 146 只 ST 股票\n",
" [20220809] 过滤 146 只 ST 股票\n",
" [20220810] 过滤 145 只 ST 股票\n",
" [20220811] 过滤 144 只 ST 股票\n",
" [20220812] 过滤 144 只 ST 股票\n",
" [20220815] 过滤 141 只 ST 股票\n",
" [20220816] 过滤 143 只 ST 股票\n",
" [20220817] 过滤 142 只 ST 股票\n",
" [20220818] 过滤 142 只 ST 股票\n",
" [20220819] 过滤 142 只 ST 股票\n",
" [20220822] 过滤 142 只 ST 股票\n",
" [20220823] 过滤 142 只 ST 股票\n",
" [20220824] 过滤 142 只 ST 股票\n",
" [20220825] 过滤 142 只 ST 股票\n",
" [20220826] 过滤 142 只 ST 股票\n",
" [20220829] 过滤 142 只 ST 股票\n",
" [20220830] 过滤 141 只 ST 股票\n",
" [20220831] 过滤 142 只 ST 股票\n",
" [20220901] 过滤 141 只 ST 股票\n",
" [20220902] 过滤 141 只 ST 股票\n",
" [20220905] 过滤 141 只 ST 股票\n",
" [20220906] 过滤 141 只 ST 股票\n",
" [20220907] 过滤 141 只 ST 股票\n",
" [20220908] 过滤 141 只 ST 股票\n",
" [20220909] 过滤 141 只 ST 股票\n",
" [20220913] 过滤 140 只 ST 股票\n",
" [20220914] 过滤 140 只 ST 股票\n",
" [20220915] 过滤 139 只 ST 股票\n",
" [20220916] 过滤 139 只 ST 股票\n",
" [20220919] 过滤 139 只 ST 股票\n",
" [20220920] 过滤 139 只 ST 股票\n",
" [20220921] 过滤 140 只 ST 股票\n",
" [20220922] 过滤 138 只 ST 股票\n",
" [20220923] 过滤 138 只 ST 股票\n",
" [20220926] 过滤 138 只 ST 股票\n",
" [20220927] 过滤 139 只 ST 股票\n",
" [20220928] 过滤 140 只 ST 股票\n",
" [20220929] 过滤 138 只 ST 股票\n",
" [20220930] 过滤 137 只 ST 股票\n",
" [20221010] 过滤 137 只 ST 股票\n",
" [20221011] 过滤 137 只 ST 股票\n",
" [20221012] 过滤 137 只 ST 股票\n",
" [20221013] 过滤 137 只 ST 股票\n",
" [20221014] 过滤 137 只 ST 股票\n",
" [20221017] 过滤 137 只 ST 股票\n",
" [20221018] 过滤 137 只 ST 股票\n",
" [20221019] 过滤 137 只 ST 股票\n",
" [20221020] 过滤 137 只 ST 股票\n",
" [20221021] 过滤 137 只 ST 股票\n",
" [20221024] 过滤 137 只 ST 股票\n",
" [20221025] 过滤 137 只 ST 股票\n",
" [20221026] 过滤 137 只 ST 股票\n",
" [20221027] 过滤 137 只 ST 股票\n",
" [20221028] 过滤 137 只 ST 股票\n",
" [20221031] 过滤 137 只 ST 股票\n",
" [20221101] 过滤 136 只 ST 股票\n",
" [20221102] 过滤 137 只 ST 股票\n",
" [20221103] 过滤 137 只 ST 股票\n",
" [20221104] 过滤 137 只 ST 股票\n",
" [20221107] 过滤 137 只 ST 股票\n",
" [20221108] 过滤 136 只 ST 股票\n",
" [20221109] 过滤 136 只 ST 股票\n",
" [20221110] 过滤 136 只 ST 股票\n",
" [20221111] 过滤 136 只 ST 股票\n",
" [20221114] 过滤 136 只 ST 股票\n",
" [20221115] 过滤 136 只 ST 股票\n",
" [20221116] 过滤 135 只 ST 股票\n",
" [20221117] 过滤 134 只 ST 股票\n",
" [20221118] 过滤 133 只 ST 股票\n",
" [20221121] 过滤 133 只 ST 股票\n",
" [20221122] 过滤 135 只 ST 股票\n",
" [20221123] 过滤 135 只 ST 股票\n",
" [20221124] 过滤 135 只 ST 股票\n",
" [20221125] 过滤 135 只 ST 股票\n",
" [20221128] 过滤 134 只 ST 股票\n",
" [20221129] 过滤 135 只 ST 股票\n",
" [20221130] 过滤 135 只 ST 股票\n",
" [20221201] 过滤 134 只 ST 股票\n",
" [20221202] 过滤 134 只 ST 股票\n",
" [20221205] 过滤 134 只 ST 股票\n",
" [20221206] 过滤 134 只 ST 股票\n",
" [20221207] 过滤 134 只 ST 股票\n",
" [20221208] 过滤 135 只 ST 股票\n",
" [20221209] 过滤 133 只 ST 股票\n",
" [20221212] 过滤 134 只 ST 股票\n",
" [20221213] 过滤 134 只 ST 股票\n",
" [20221214] 过滤 134 只 ST 股票\n",
" [20221215] 过滤 134 只 ST 股票\n",
" [20221216] 过滤 134 只 ST 股票\n",
" [20221219] 过滤 133 只 ST 股票\n",
" [20221220] 过滤 133 只 ST 股票\n",
" [20221221] 过滤 132 只 ST 股票\n",
" [20221222] 过滤 132 只 ST 股票\n",
" [20221223] 过滤 134 只 ST 股票\n",
" [20221226] 过滤 134 只 ST 股票\n",
" [20221227] 过滤 134 只 ST 股票\n",
" [20221228] 过滤 134 只 ST 股票\n",
" [20221229] 过滤 134 只 ST 股票\n",
" [20221230] 过滤 133 只 ST 股票\n",
" [20230103] 过滤 133 只 ST 股票\n",
" [20230104] 过滤 133 只 ST 股票\n",
" [20230105] 过滤 133 只 ST 股票\n",
" [20230106] 过滤 133 只 ST 股票\n",
" [20230109] 过滤 132 只 ST 股票\n",
" [20230110] 过滤 133 只 ST 股票\n",
" [20230111] 过滤 133 只 ST 股票\n",
" [20230112] 过滤 133 只 ST 股票\n",
" [20230113] 过滤 133 只 ST 股票\n",
" [20230116] 过滤 133 只 ST 股票\n",
" [20230117] 过滤 132 只 ST 股票\n",
" [20230118] 过滤 133 只 ST 股票\n",
" [20230119] 过滤 133 只 ST 股票\n",
" [20230120] 过滤 133 只 ST 股票\n",
" [20230130] 过滤 133 只 ST 股票\n",
" [20230131] 过滤 133 只 ST 股票\n",
" [20230201] 过滤 134 只 ST 股票\n",
" [20230202] 过滤 134 只 ST 股票\n",
" [20230203] 过滤 131 只 ST 股票\n",
" [20230206] 过滤 131 只 ST 股票\n",
" [20230207] 过滤 131 只 ST 股票\n",
" [20230208] 过滤 131 只 ST 股票\n",
" [20230209] 过滤 131 只 ST 股票\n",
" [20230210] 过滤 131 只 ST 股票\n",
" [20230213] 过滤 131 只 ST 股票\n",
" [20230214] 过滤 131 只 ST 股票\n",
" [20230215] 过滤 131 只 ST 股票\n",
" [20230216] 过滤 131 只 ST 股票\n",
" [20230217] 过滤 130 只 ST 股票\n",
" [20230220] 过滤 131 只 ST 股票\n",
" [20230221] 过滤 131 只 ST 股票\n",
" [20230222] 过滤 131 只 ST 股票\n",
" [20230223] 过滤 131 只 ST 股票\n",
" [20230224] 过滤 131 只 ST 股票\n",
" [20230227] 过滤 130 只 ST 股票\n",
" [20230228] 过滤 129 只 ST 股票\n",
" [20230301] 过滤 129 只 ST 股票\n",
" [20230302] 过滤 129 只 ST 股票\n",
" [20230303] 过滤 128 只 ST 股票\n",
" [20230306] 过滤 128 只 ST 股票\n",
" [20230307] 过滤 128 只 ST 股票\n",
" [20230308] 过滤 127 只 ST 股票\n",
" [20230309] 过滤 126 只 ST 股票\n",
" [20230310] 过滤 126 只 ST 股票\n",
" [20230313] 过滤 127 只 ST 股票\n",
" [20230314] 过滤 128 只 ST 股票\n",
" [20230315] 过滤 128 只 ST 股票\n",
" [20230316] 过滤 128 只 ST 股票\n",
" [20230317] 过滤 128 只 ST 股票\n",
" [20230320] 过滤 127 只 ST 股票\n",
" [20230321] 过滤 127 只 ST 股票\n",
" [20230322] 过滤 127 只 ST 股票\n",
" [20230323] 过滤 128 只 ST 股票\n",
" [20230324] 过滤 128 只 ST 股票\n",
" [20230327] 过滤 128 只 ST 股票\n",
" [20230328] 过滤 128 只 ST 股票\n",
" [20230329] 过滤 127 只 ST 股票\n",
" [20230330] 过滤 126 只 ST 股票\n",
" [20230331] 过滤 125 只 ST 股票\n",
" [20230403] 过滤 124 只 ST 股票\n",
" [20230404] 过滤 124 只 ST 股票\n",
" [20230406] 过滤 124 只 ST 股票\n",
" [20230407] 过滤 124 只 ST 股票\n",
" [20230410] 过滤 125 只 ST 股票\n",
" [20230411] 过滤 125 只 ST 股票\n",
" [20230412] 过滤 124 只 ST 股票\n",
" [20230413] 过滤 124 只 ST 股票\n",
" [20230414] 过滤 122 只 ST 股票\n",
" [20230417] 过滤 122 只 ST 股票\n",
" [20230418] 过滤 122 只 ST 股票\n",
" [20230419] 过滤 120 只 ST 股票\n",
" [20230420] 过滤 121 只 ST 股票\n",
" [20230421] 过滤 121 只 ST 股票\n",
" [20230424] 过滤 120 只 ST 股票\n",
" [20230425] 过滤 120 只 ST 股票\n",
" [20230426] 过滤 118 只 ST 股票\n",
" [20230427] 过滤 122 只 ST 股票\n",
" [20230428] 过滤 121 只 ST 股票\n",
" [20230504] 过滤 116 只 ST 股票\n",
" [20230505] 过滤 153 只 ST 股票\n",
" [20230508] 过滤 153 只 ST 股票\n",
" [20230509] 过滤 150 只 ST 股票\n",
" [20230510] 过滤 148 只 ST 股票\n",
" [20230511] 过滤 148 只 ST 股票\n",
" [20230512] 过滤 148 只 ST 股票\n",
" [20230515] 过滤 148 只 ST 股票\n",
" [20230516] 过滤 148 只 ST 股票\n",
" [20230517] 过滤 148 只 ST 股票\n",
" [20230518] 过滤 147 只 ST 股票\n",
" [20230519] 过滤 146 只 ST 股票\n",
" [20230522] 过滤 145 只 ST 股票\n",
" [20230523] 过滤 144 只 ST 股票\n",
" [20230524] 过滤 144 只 ST 股票\n",
" [20230525] 过滤 143 只 ST 股票\n",
" [20230526] 过滤 142 只 ST 股票\n",
" [20230529] 过滤 140 只 ST 股票\n",
" [20230530] 过滤 139 只 ST 股票\n",
" [20230531] 过滤 138 只 ST 股票\n",
" [20230601] 过滤 140 只 ST 股票\n",
" [20230602] 过滤 135 只 ST 股票\n",
" [20230605] 过滤 134 只 ST 股票\n",
" [20230606] 过滤 133 只 ST 股票\n",
" [20230607] 过滤 133 只 ST 股票\n",
" [20230608] 过滤 132 只 ST 股票\n",
" [20230609] 过滤 132 只 ST 股票\n",
" [20230612] 过滤 130 只 ST 股票\n",
" [20230613] 过滤 127 只 ST 股票\n",
" [20230614] 过滤 123 只 ST 股票\n",
" [20230615] 过滤 124 只 ST 股票\n",
" [20230616] 过滤 122 只 ST 股票\n",
" [20230619] 过滤 122 只 ST 股票\n",
" [20230620] 过滤 121 只 ST 股票\n",
" [20230621] 过滤 121 只 ST 股票\n",
" [20230626] 过滤 121 只 ST 股票\n",
" [20230627] 过滤 119 只 ST 股票\n",
" [20230628] 过滤 119 只 ST 股票\n",
" [20230629] 过滤 119 只 ST 股票\n",
" [20230630] 过滤 121 只 ST 股票\n",
" [20230703] 过滤 122 只 ST 股票\n",
" [20230704] 过滤 122 只 ST 股票\n",
" [20230705] 过滤 123 只 ST 股票\n",
" [20230706] 过滤 123 只 ST 股票\n",
" [20230707] 过滤 123 只 ST 股票\n",
" [20230710] 过滤 123 只 ST 股票\n",
" [20230711] 过滤 123 只 ST 股票\n",
" [20230712] 过滤 123 只 ST 股票\n",
" [20230713] 过滤 123 只 ST 股票\n",
" [20230714] 过滤 122 只 ST 股票\n",
" [20230717] 过滤 122 只 ST 股票\n",
" [20230718] 过滤 122 只 ST 股票\n",
" [20230719] 过滤 123 只 ST 股票\n",
" [20230720] 过滤 123 只 ST 股票\n",
" [20230721] 过滤 122 只 ST 股票\n",
" [20230724] 过滤 122 只 ST 股票\n",
" [20230725] 过滤 122 只 ST 股票\n",
" [20230726] 过滤 122 只 ST 股票\n",
" [20230727] 过滤 121 只 ST 股票\n",
" [20230728] 过滤 121 只 ST 股票\n",
" [20230731] 过滤 121 只 ST 股票\n",
" [20230801] 过滤 121 只 ST 股票\n",
" [20230802] 过滤 121 只 ST 股票\n",
" [20230803] 过滤 121 只 ST 股票\n",
" [20230804] 过滤 121 只 ST 股票\n",
" [20230807] 过滤 121 只 ST 股票\n",
" [20230808] 过滤 121 只 ST 股票\n",
" [20230809] 过滤 121 只 ST 股票\n",
" [20230810] 过滤 121 只 ST 股票\n",
" [20230811] 过滤 121 只 ST 股票\n",
" [20230814] 过滤 121 只 ST 股票\n",
" [20230815] 过滤 121 只 ST 股票\n",
" [20230816] 过滤 121 只 ST 股票\n",
" [20230817] 过滤 120 只 ST 股票\n",
" [20230818] 过滤 120 只 ST 股票\n",
" [20230821] 过滤 120 只 ST 股票\n",
" [20230822] 过滤 120 只 ST 股票\n",
" [20230823] 过滤 120 只 ST 股票\n",
" [20230824] 过滤 120 只 ST 股票\n",
" [20230825] 过滤 120 只 ST 股票\n",
" [20230828] 过滤 120 只 ST 股票\n",
" [20230829] 过滤 120 只 ST 股票\n",
" [20230830] 过滤 120 只 ST 股票\n",
" [20230831] 过滤 120 只 ST 股票\n",
" [20230901] 过滤 120 只 ST 股票\n",
" [20230904] 过滤 118 只 ST 股票\n",
" [20230905] 过滤 118 只 ST 股票\n",
" [20230906] 过滤 118 只 ST 股票\n",
" [20230907] 过滤 118 只 ST 股票\n",
" [20230908] 过滤 118 只 ST 股票\n",
" [20230911] 过滤 118 只 ST 股票\n",
" [20230912] 过滤 118 只 ST 股票\n",
" [20230913] 过滤 118 只 ST 股票\n",
" [20230914] 过滤 118 只 ST 股票\n",
" [20230915] 过滤 118 只 ST 股票\n",
" [20230918] 过滤 118 只 ST 股票\n",
" [20230919] 过滤 118 只 ST 股票\n",
" [20230920] 过滤 118 只 ST 股票\n",
" [20230921] 过滤 117 只 ST 股票\n",
" [20230922] 过滤 118 只 ST 股票\n",
" [20230925] 过滤 117 只 ST 股票\n",
" [20230926] 过滤 117 只 ST 股票\n",
" [20230927] 过滤 118 只 ST 股票\n",
" [20230928] 过滤 116 只 ST 股票\n",
" [20231009] 过滤 117 只 ST 股票\n",
" [20231010] 过滤 118 只 ST 股票\n",
" [20231011] 过滤 118 只 ST 股票\n",
" [20231012] 过滤 119 只 ST 股票\n",
" [20231013] 过滤 119 只 ST 股票\n",
" [20231016] 过滤 119 只 ST 股票\n",
" [20231017] 过滤 119 只 ST 股票\n",
" [20231018] 过滤 118 只 ST 股票\n",
" [20231019] 过滤 118 只 ST 股票\n",
" [20231020] 过滤 118 只 ST 股票\n",
" [20231023] 过滤 118 只 ST 股票\n",
" [20231024] 过滤 117 只 ST 股票\n",
" [20231025] 过滤 118 只 ST 股票\n",
" [20231026] 过滤 118 只 ST 股票\n",
" [20231027] 过滤 118 只 ST 股票\n",
" [20231030] 过滤 118 只 ST 股票\n",
" [20231031] 过滤 119 只 ST 股票\n",
" [20231101] 过滤 119 只 ST 股票\n",
" [20231102] 过滤 118 只 ST 股票\n",
" [20231103] 过滤 118 只 ST 股票\n",
" [20231106] 过滤 116 只 ST 股票\n",
" [20231107] 过滤 116 只 ST 股票\n",
" [20231108] 过滤 116 只 ST 股票\n",
" [20231109] 过滤 116 只 ST 股票\n",
" [20231110] 过滤 116 只 ST 股票\n",
" [20231113] 过滤 116 只 ST 股票\n",
" [20231114] 过滤 116 只 ST 股票\n",
" [20231115] 过滤 116 只 ST 股票\n",
" [20231116] 过滤 115 只 ST 股票\n",
" [20231117] 过滤 115 只 ST 股票\n",
" [20231120] 过滤 115 只 ST 股票\n",
" [20231121] 过滤 116 只 ST 股票\n",
" [20231122] 过滤 115 只 ST 股票\n",
" [20231123] 过滤 115 只 ST 股票\n",
" [20231124] 过滤 114 只 ST 股票\n",
" [20231127] 过滤 116 只 ST 股票\n",
" [20231128] 过滤 116 只 ST 股票\n",
" [20231129] 过滤 116 只 ST 股票\n",
" [20231130] 过滤 116 只 ST 股票\n",
" [20231201] 过滤 116 只 ST 股票\n",
" [20231204] 过滤 116 只 ST 股票\n",
" [20231205] 过滤 116 只 ST 股票\n",
" [20231206] 过滤 116 只 ST 股票\n",
" [20231207] 过滤 114 只 ST 股票\n",
" [20231208] 过滤 115 只 ST 股票\n",
" [20231211] 过滤 115 只 ST 股票\n",
" [20231212] 过滤 115 只 ST 股票\n",
" [20231213] 过滤 115 只 ST 股票\n",
" [20231214] 过滤 116 只 ST 股票\n",
" [20231215] 过滤 115 只 ST 股票\n",
" [20231218] 过滤 116 只 ST 股票\n",
" [20231219] 过滤 114 只 ST 股票\n",
" [20231220] 过滤 116 只 ST 股票\n",
" [20231221] 过滤 116 只 ST 股票\n",
" [20231222] 过滤 115 只 ST 股票\n",
" [20231225] 过滤 113 只 ST 股票\n",
" [20231226] 过滤 114 只 ST 股票\n",
" [20231227] 过滤 114 只 ST 股票\n",
" [20231228] 过滤 110 只 ST 股票\n",
" [20231229] 过滤 113 只 ST 股票\n",
" [20240102] 过滤 114 只 ST 股票\n",
" [20240103] 过滤 114 只 ST 股票\n",
" [20240104] 过滤 114 只 ST 股票\n",
" [20240105] 过滤 114 只 ST 股票\n",
" [20240108] 过滤 114 只 ST 股票\n",
" [20240109] 过滤 113 只 ST 股票\n",
" [20240110] 过滤 113 只 ST 股票\n",
" [20240111] 过滤 113 只 ST 股票\n",
" [20240112] 过滤 111 只 ST 股票\n",
" [20240115] 过滤 112 只 ST 股票\n",
" [20240116] 过滤 112 只 ST 股票\n",
" [20240117] 过滤 112 只 ST 股票\n",
" [20240118] 过滤 112 只 ST 股票\n",
" [20240119] 过滤 111 只 ST 股票\n",
" [20240122] 过滤 111 只 ST 股票\n",
" [20240123] 过滤 111 只 ST 股票\n",
" [20240124] 过滤 110 只 ST 股票\n",
" [20240125] 过滤 110 只 ST 股票\n",
" [20240126] 过滤 111 只 ST 股票\n",
" [20240129] 过滤 112 只 ST 股票\n",
" [20240130] 过滤 112 只 ST 股票\n",
" [20240131] 过滤 113 只 ST 股票\n",
" [20240201] 过滤 113 只 ST 股票\n",
" [20240202] 过滤 113 只 ST 股票\n",
" [20240205] 过滤 112 只 ST 股票\n",
" [20240206] 过滤 111 只 ST 股票\n",
" [20240207] 过滤 111 只 ST 股票\n",
" [20240208] 过滤 111 只 ST 股票\n",
" [20240219] 过滤 111 只 ST 股票\n",
" [20240220] 过滤 111 只 ST 股票\n",
" [20240221] 过滤 111 只 ST 股票\n",
" [20240222] 过滤 111 只 ST 股票\n",
" [20240223] 过滤 111 只 ST 股票\n",
" [20240226] 过滤 111 只 ST 股票\n",
" [20240227] 过滤 112 只 ST 股票\n",
" [20240228] 过滤 112 只 ST 股票\n",
" [20240229] 过滤 112 只 ST 股票\n",
" [20240301] 过滤 112 只 ST 股票\n",
" [20240304] 过滤 112 只 ST 股票\n",
" [20240305] 过滤 112 只 ST 股票\n",
" [20240306] 过滤 111 只 ST 股票\n",
" [20240307] 过滤 111 只 ST 股票\n",
" [20240308] 过滤 110 只 ST 股票\n",
" [20240311] 过滤 110 只 ST 股票\n",
" [20240312] 过滤 110 只 ST 股票\n",
" [20240313] 过滤 110 只 ST 股票\n",
" [20240314] 过滤 110 只 ST 股票\n",
" [20240315] 过滤 110 只 ST 股票\n",
" [20240318] 过滤 110 只 ST 股票\n",
" [20240319] 过滤 110 只 ST 股票\n",
" [20240320] 过滤 110 只 ST 股票\n",
" [20240321] 过滤 110 只 ST 股票\n",
" [20240322] 过滤 110 只 ST 股票\n",
" [20240325] 过滤 110 只 ST 股票\n",
" [20240326] 过滤 110 只 ST 股票\n",
" [20240327] 过滤 110 只 ST 股票\n",
" [20240328] 过滤 109 只 ST 股票\n",
" [20240329] 过滤 110 只 ST 股票\n",
" [20240401] 过滤 112 只 ST 股票\n",
" [20240402] 过滤 112 只 ST 股票\n",
" [20240403] 过滤 112 只 ST 股票\n",
" [20240408] 过滤 113 只 ST 股票\n",
" [20240409] 过滤 113 只 ST 股票\n",
" [20240410] 过滤 113 只 ST 股票\n",
" [20240411] 过滤 113 只 ST 股票\n",
" [20240412] 过滤 113 只 ST 股票\n",
" [20240415] 过滤 113 只 ST 股票\n",
" [20240416] 过滤 113 只 ST 股票\n",
" [20240417] 过滤 113 只 ST 股票\n",
" [20240418] 过滤 113 只 ST 股票\n",
" [20240419] 过滤 113 只 ST 股票\n",
" [20240422] 过滤 112 只 ST 股票\n",
" [20240423] 过滤 114 只 ST 股票\n",
" [20240424] 过滤 115 只 ST 股票\n",
" [20240425] 过滤 114 只 ST 股票\n",
" [20240426] 过滤 115 只 ST 股票\n",
" [20240429] 过滤 117 只 ST 股票\n",
" [20240430] 过滤 118 只 ST 股票\n",
" [20240506] 过滤 163 只 ST 股票\n",
" [20240507] 过滤 163 只 ST 股票\n",
" [20240508] 过滤 161 只 ST 股票\n",
" [20240509] 过滤 161 只 ST 股票\n",
" [20240510] 过滤 161 只 ST 股票\n",
" [20240513] 过滤 161 只 ST 股票\n",
" [20240514] 过滤 163 只 ST 股票\n",
" [20240515] 过滤 163 只 ST 股票\n",
" [20240516] 过滤 162 只 ST 股票\n",
" [20240517] 过滤 162 只 ST 股票\n",
" [20240520] 过滤 161 只 ST 股票\n",
" [20240521] 过滤 163 只 ST 股票\n",
" [20240522] 过滤 163 只 ST 股票\n",
" [20240523] 过滤 163 只 ST 股票\n",
" [20240524] 过滤 163 只 ST 股票\n",
" [20240527] 过滤 162 只 ST 股票\n",
" [20240528] 过滤 162 只 ST 股票\n",
" [20240529] 过滤 161 只 ST 股票\n",
" [20240530] 过滤 160 只 ST 股票\n",
" [20240531] 过滤 159 只 ST 股票\n",
" [20240603] 过滤 159 只 ST 股票\n",
" [20240604] 过滤 158 只 ST 股票\n",
" [20240605] 过滤 157 只 ST 股票\n",
" [20240606] 过滤 157 只 ST 股票\n",
" [20240607] 过滤 153 只 ST 股票\n",
" [20240611] 过滤 148 只 ST 股票\n",
" [20240612] 过滤 147 只 ST 股票\n",
" [20240613] 过滤 145 只 ST 股票\n",
" [20240614] 过滤 144 只 ST 股票\n",
" [20240617] 过滤 143 只 ST 股票\n",
" [20240618] 过滤 140 只 ST 股票\n",
" [20240619] 过滤 139 只 ST 股票\n",
" [20240620] 过滤 138 只 ST 股票\n",
" [20240621] 过滤 137 只 ST 股票\n",
" [20240624] 过滤 135 只 ST 股票\n",
" [20240625] 过滤 130 只 ST 股票\n",
" [20240626] 过滤 131 只 ST 股票\n",
" [20240627] 过滤 128 只 ST 股票\n",
" [20240628] 过滤 128 只 ST 股票\n",
" [20240701] 过滤 126 只 ST 股票\n",
" [20240702] 过滤 125 只 ST 股票\n",
" [20240703] 过滤 123 只 ST 股票\n",
" [20240704] 过滤 123 只 ST 股票\n",
" [20240705] 过滤 122 只 ST 股票\n",
" [20240708] 过滤 122 只 ST 股票\n",
" [20240709] 过滤 128 只 ST 股票\n",
" [20240710] 过滤 128 只 ST 股票\n",
" [20240711] 过滤 128 只 ST 股票\n",
" [20240712] 过滤 128 只 ST 股票\n",
" [20240715] 过滤 128 只 ST 股票\n",
" [20240716] 过滤 128 只 ST 股票\n",
" [20240717] 过滤 126 只 ST 股票\n",
" [20240718] 过滤 125 只 ST 股票\n",
" [20240719] 过滤 126 只 ST 股票\n",
" [20240722] 过滤 125 只 ST 股票\n",
" [20240723] 过滤 125 只 ST 股票\n",
" [20240724] 过滤 125 只 ST 股票\n",
" [20240725] 过滤 124 只 ST 股票\n",
" [20240726] 过滤 123 只 ST 股票\n",
" [20240729] 过滤 122 只 ST 股票\n",
" [20240730] 过滤 122 只 ST 股票\n",
" [20240731] 过滤 122 只 ST 股票\n",
" [20240801] 过滤 122 只 ST 股票\n",
" [20240802] 过滤 123 只 ST 股票\n",
" [20240805] 过滤 121 只 ST 股票\n",
" [20240806] 过滤 122 只 ST 股票\n",
" [20240807] 过滤 123 只 ST 股票\n",
" [20240808] 过滤 123 只 ST 股票\n",
" [20240809] 过滤 123 只 ST 股票\n",
" [20240812] 过滤 124 只 ST 股票\n",
" [20240813] 过滤 124 只 ST 股票\n",
" [20240814] 过滤 124 只 ST 股票\n",
" [20240815] 过滤 123 只 ST 股票\n",
" [20240816] 过滤 122 只 ST 股票\n",
" [20240819] 过滤 121 只 ST 股票\n",
" [20240820] 过滤 121 只 ST 股票\n",
" [20240821] 过滤 121 只 ST 股票\n",
" [20240822] 过滤 121 只 ST 股票\n",
" [20240823] 过滤 119 只 ST 股票\n",
" [20240826] 过滤 120 只 ST 股票\n",
" [20240827] 过滤 120 只 ST 股票\n",
" [20240828] 过滤 120 只 ST 股票\n",
" [20240829] 过滤 119 只 ST 股票\n",
" [20240830] 过滤 119 只 ST 股票\n",
" [20240902] 过滤 119 只 ST 股票\n",
" [20240903] 过滤 120 只 ST 股票\n",
" [20240904] 过滤 119 只 ST 股票\n",
" [20240905] 过滤 119 只 ST 股票\n",
" [20240906] 过滤 119 只 ST 股票\n",
" [20240909] 过滤 119 只 ST 股票\n",
" [20240910] 过滤 118 只 ST 股票\n",
" [20240911] 过滤 119 只 ST 股票\n",
" [20240912] 过滤 119 只 ST 股票\n",
" [20240913] 过滤 119 只 ST 股票\n",
" [20240918] 过滤 118 只 ST 股票\n",
" [20240919] 过滤 121 只 ST 股票\n",
" [20240920] 过滤 121 只 ST 股票\n",
" [20240923] 过滤 121 只 ST 股票\n",
" [20240924] 过滤 121 只 ST 股票\n",
" [20240925] 过滤 121 只 ST 股票\n",
" [20240926] 过滤 121 只 ST 股票\n",
" [20240927] 过滤 121 只 ST 股票\n",
" [20240930] 过滤 121 只 ST 股票\n",
" [20241008] 过滤 119 只 ST 股票\n",
" [20241009] 过滤 119 只 ST 股票\n",
" [20241010] 过滤 119 只 ST 股票\n",
" [20241011] 过滤 119 只 ST 股票\n",
" [20241014] 过滤 119 只 ST 股票\n",
" [20241015] 过滤 119 只 ST 股票\n",
" [20241016] 过滤 120 只 ST 股票\n",
" [20241017] 过滤 120 只 ST 股票\n",
" [20241018] 过滤 120 只 ST 股票\n",
" [20241021] 过滤 120 只 ST 股票\n",
" [20241022] 过滤 120 只 ST 股票\n",
" [20241023] 过滤 120 只 ST 股票\n",
" [20241024] 过滤 120 只 ST 股票\n",
" [20241025] 过滤 120 只 ST 股票\n",
" [20241028] 过滤 119 只 ST 股票\n",
" [20241029] 过滤 120 只 ST 股票\n",
" [20241030] 过滤 120 只 ST 股票\n",
" [20241031] 过滤 120 只 ST 股票\n",
" [20241101] 过滤 122 只 ST 股票\n",
" [20241104] 过滤 123 只 ST 股票\n",
" [20241105] 过滤 123 只 ST 股票\n",
" [20241106] 过滤 123 只 ST 股票\n",
" [20241107] 过滤 123 只 ST 股票\n",
" [20241108] 过滤 124 只 ST 股票\n",
" [20241111] 过滤 120 只 ST 股票\n",
" [20241112] 过滤 121 只 ST 股票\n",
" [20241113] 过滤 122 只 ST 股票\n",
" [20241114] 过滤 122 只 ST 股票\n",
" [20241115] 过滤 121 只 ST 股票\n",
" [20241118] 过滤 120 只 ST 股票\n",
" [20241119] 过滤 120 只 ST 股票\n",
" [20241120] 过滤 121 只 ST 股票\n",
" [20241121] 过滤 122 只 ST 股票\n",
" [20241122] 过滤 122 只 ST 股票\n",
" [20241125] 过滤 122 只 ST 股票\n",
" [20241126] 过滤 122 只 ST 股票\n",
" [20241127] 过滤 122 只 ST 股票\n",
" [20241128] 过滤 122 只 ST 股票\n",
" [20241129] 过滤 122 只 ST 股票\n",
" [20241202] 过滤 122 只 ST 股票\n",
" [20241203] 过滤 122 只 ST 股票\n",
" [20241204] 过滤 122 只 ST 股票\n",
" [20241205] 过滤 122 只 ST 股票\n",
" [20241206] 过滤 122 只 ST 股票\n",
" [20241209] 过滤 122 只 ST 股票\n",
" [20241210] 过滤 123 只 ST 股票\n",
" [20241211] 过滤 123 只 ST 股票\n",
" [20241212] 过滤 124 只 ST 股票\n",
" [20241213] 过滤 123 只 ST 股票\n",
" [20241216] 过滤 124 只 ST 股票\n",
" [20241217] 过滤 123 只 ST 股票\n",
" [20241218] 过滤 124 只 ST 股票\n",
" [20241219] 过滤 123 只 ST 股票\n",
" [20241220] 过滤 125 只 ST 股票\n",
" [20241223] 过滤 125 只 ST 股票\n",
" [20241224] 过滤 125 只 ST 股票\n",
" [20241225] 过滤 122 只 ST 股票\n",
" [20241226] 过滤 124 只 ST 股票\n",
" [20241227] 过滤 123 只 ST 股票\n",
" [20241230] 过滤 123 只 ST 股票\n",
" [20241231] 过滤 124 只 ST 股票\n",
" [20250102] 过滤 124 只 ST 股票\n",
" [20250103] 过滤 125 只 ST 股票\n",
" [20250106] 过滤 124 只 ST 股票\n",
" [20250107] 过滤 125 只 ST 股票\n",
" [20250108] 过滤 125 只 ST 股票\n",
" [20250109] 过滤 126 只 ST 股票\n",
" [20250110] 过滤 126 只 ST 股票\n",
" [20250113] 过滤 124 只 ST 股票\n",
" [20250114] 过滤 127 只 ST 股票\n",
" [20250115] 过滤 127 只 ST 股票\n",
" [20250116] 过滤 127 只 ST 股票\n",
" [20250117] 过滤 126 只 ST 股票\n",
" [20250120] 过滤 126 只 ST 股票\n",
" [20250121] 过滤 126 只 ST 股票\n",
" [20250122] 过滤 126 只 ST 股票\n",
" [20250123] 过滤 126 只 ST 股票\n",
" [20250124] 过滤 126 只 ST 股票\n",
" [20250127] 过滤 126 只 ST 股票\n",
" [20250205] 过滤 126 只 ST 股票\n",
" [20250206] 过滤 126 只 ST 股票\n",
" [20250207] 过滤 126 只 ST 股票\n",
" [20250210] 过滤 125 只 ST 股票\n",
" [20250211] 过滤 125 只 ST 股票\n",
" [20250212] 过滤 125 只 ST 股票\n",
" [20250213] 过滤 125 只 ST 股票\n",
" [20250214] 过滤 125 只 ST 股票\n",
" [20250217] 过滤 125 只 ST 股票\n",
" [20250218] 过滤 124 只 ST 股票\n",
" [20250219] 过滤 124 只 ST 股票\n",
" [20250220] 过滤 124 只 ST 股票\n",
" [20250221] 过滤 126 只 ST 股票\n",
" [20250224] 过滤 126 只 ST 股票\n",
" [20250225] 过滤 126 只 ST 股票\n",
" [20250226] 过滤 126 只 ST 股票\n",
" [20250227] 过滤 126 只 ST 股票\n",
" [20250228] 过滤 126 只 ST 股票\n",
" [20250303] 过滤 126 只 ST 股票\n",
" [20250304] 过滤 126 只 ST 股票\n",
" [20250305] 过滤 126 只 ST 股票\n",
" [20250306] 过滤 126 只 ST 股票\n",
" [20250307] 过滤 126 只 ST 股票\n",
" [20250310] 过滤 127 只 ST 股票\n",
" [20250311] 过滤 127 只 ST 股票\n",
" [20250312] 过滤 126 只 ST 股票\n",
" [20250313] 过滤 126 只 ST 股票\n",
" [20250314] 过滤 127 只 ST 股票\n",
" [20250317] 过滤 127 只 ST 股票\n",
" [20250318] 过滤 131 只 ST 股票\n",
" [20250319] 过滤 131 只 ST 股票\n",
" [20250320] 过滤 132 只 ST 股票\n",
" [20250321] 过滤 131 只 ST 股票\n",
" [20250324] 过滤 130 只 ST 股票\n",
" [20250325] 过滤 133 只 ST 股票\n",
" [20250326] 过滤 134 只 ST 股票\n",
" [20250327] 过滤 134 只 ST 股票\n",
" [20250328] 过滤 134 只 ST 股票\n",
" [20250331] 过滤 134 只 ST 股票\n",
" [20250401] 过滤 133 只 ST 股票\n",
" [20250402] 过滤 133 只 ST 股票\n",
" [20250403] 过滤 133 只 ST 股票\n",
" [20250407] 过滤 133 只 ST 股票\n",
" [20250408] 过滤 133 只 ST 股票\n",
" [20250409] 过滤 133 只 ST 股票\n",
" [20250410] 过滤 133 只 ST 股票\n",
" [20250411] 过滤 132 只 ST 股票\n",
" [20250414] 过滤 131 只 ST 股票\n",
" [20250415] 过滤 130 只 ST 股票\n",
" [20250416] 过滤 132 只 ST 股票\n",
" [20250417] 过滤 131 只 ST 股票\n",
" [20250418] 过滤 130 只 ST 股票\n",
" [20250421] 过滤 130 只 ST 股票\n",
" [20250422] 过滤 133 只 ST 股票\n",
" [20250423] 过滤 138 只 ST 股票\n",
" [20250424] 过滤 137 只 ST 股票\n",
" [20250425] 过滤 139 只 ST 股票\n",
" [20250428] 过滤 142 只 ST 股票\n",
" [20250429] 过滤 148 只 ST 股票\n",
" [20250430] 过滤 169 只 ST 股票\n",
" [20250506] 过滤 190 只 ST 股票\n",
" [20250507] 过滤 190 只 ST 股票\n",
" [20250508] 过滤 190 只 ST 股票\n",
" [20250509] 过滤 190 只 ST 股票\n",
" [20250512] 过滤 189 只 ST 股票\n",
" [20250513] 过滤 189 只 ST 股票\n",
" [20250514] 过滤 189 只 ST 股票\n",
" [20250515] 过滤 188 只 ST 股票\n",
" [20250516] 过滤 188 只 ST 股票\n",
" [20250519] 过滤 182 只 ST 股票\n",
" [20250520] 过滤 183 只 ST 股票\n",
" [20250521] 过滤 181 只 ST 股票\n",
" [20250522] 过滤 179 只 ST 股票\n",
" [20250523] 过滤 178 只 ST 股票\n",
" [20250526] 过滤 178 只 ST 股票\n",
" [20250527] 过滤 179 只 ST 股票\n",
" [20250528] 过滤 177 只 ST 股票\n",
" [20250529] 过滤 178 只 ST 股票\n",
" [20250530] 过滤 175 只 ST 股票\n",
" [20250603] 过滤 172 只 ST 股票\n",
" [20250604] 过滤 172 只 ST 股票\n",
" [20250605] 过滤 172 只 ST 股票\n",
" [20250606] 过滤 172 只 ST 股票\n",
" [20250609] 过滤 171 只 ST 股票\n",
" [20250610] 过滤 171 只 ST 股票\n",
" [20250611] 过滤 172 只 ST 股票\n",
" [20250612] 过滤 171 只 ST 股票\n",
" [20250613] 过滤 169 只 ST 股票\n",
" [20250616] 过滤 168 只 ST 股票\n",
" [20250617] 过滤 170 只 ST 股票\n",
" [20250618] 过滤 170 只 ST 股票\n",
" [20250619] 过滤 169 只 ST 股票\n",
" [20250620] 过滤 168 只 ST 股票\n",
" [20250623] 过滤 167 只 ST 股票\n",
" [20250624] 过滤 168 只 ST 股票\n",
" [20250625] 过滤 168 只 ST 股票\n",
" [20250626] 过滤 169 只 ST 股票\n",
" [20250627] 过滤 166 只 ST 股票\n",
" [20250630] 过滤 166 只 ST 股票\n",
" [20250701] 过滤 166 只 ST 股票\n",
" [20250702] 过滤 166 只 ST 股票\n",
" [20250703] 过滤 166 只 ST 股票\n",
" [20250704] 过滤 168 只 ST 股票\n",
" [20250707] 过滤 169 只 ST 股票\n",
" [20250708] 过滤 170 只 ST 股票\n",
" [20250709] 过滤 171 只 ST 股票\n",
" [20250710] 过滤 170 只 ST 股票\n",
" [20250711] 过滤 172 只 ST 股票\n",
" [20250714] 过滤 171 只 ST 股票\n",
" [20250715] 过滤 170 只 ST 股票\n",
" [20250716] 过滤 169 只 ST 股票\n",
" [20250717] 过滤 169 只 ST 股票\n",
" [20250718] 过滤 169 只 ST 股票\n",
" [20250721] 过滤 169 只 ST 股票\n",
" [20250722] 过滤 170 只 ST 股票\n",
" [20250723] 过滤 170 只 ST 股票\n",
" [20250724] 过滤 170 只 ST 股票\n",
" [20250725] 过滤 170 只 ST 股票\n",
" [20250728] 过滤 170 只 ST 股票\n",
" [20250729] 过滤 170 只 ST 股票\n",
" [20250730] 过滤 170 只 ST 股票\n",
" [20250731] 过滤 170 只 ST 股票\n",
" [20250801] 过滤 171 只 ST 股票\n",
" [20250804] 过滤 171 只 ST 股票\n",
" [20250805] 过滤 170 只 ST 股票\n",
" [20250806] 过滤 170 只 ST 股票\n",
" [20250807] 过滤 168 只 ST 股票\n",
" [20250808] 过滤 168 只 ST 股票\n",
" [20250811] 过滤 169 只 ST 股票\n",
" [20250812] 过滤 170 只 ST 股票\n",
" [20250813] 过滤 167 只 ST 股票\n",
" [20250814] 过滤 166 只 ST 股票\n",
" [20250815] 过滤 166 只 ST 股票\n",
" [20250818] 过滤 165 只 ST 股票\n",
" [20250819] 过滤 167 只 ST 股票\n",
" [20250820] 过滤 166 只 ST 股票\n",
" [20250821] 过滤 169 只 ST 股票\n",
" [20250822] 过滤 169 只 ST 股票\n",
" [20250825] 过滤 169 只 ST 股票\n",
" [20250826] 过滤 169 只 ST 股票\n",
" [20250827] 过滤 169 只 ST 股票\n",
" [20250828] 过滤 169 只 ST 股票\n",
" [20250829] 过滤 169 只 ST 股票\n",
" [20250901] 过滤 169 只 ST 股票\n",
" [20250902] 过滤 169 只 ST 股票\n",
" [20250903] 过滤 169 只 ST 股票\n",
" [20250904] 过滤 169 只 ST 股票\n",
" [20250905] 过滤 168 只 ST 股票\n",
" [20250908] 过滤 169 只 ST 股票\n",
" [20250909] 过滤 168 只 ST 股票\n",
" [20250910] 过滤 168 只 ST 股票\n",
" [20250911] 过滤 168 只 ST 股票\n",
" [20250912] 过滤 169 只 ST 股票\n",
" [20250915] 过滤 169 只 ST 股票\n",
" [20250916] 过滤 169 只 ST 股票\n",
" [20250917] 过滤 169 只 ST 股票\n",
" [20250918] 过滤 168 只 ST 股票\n",
" [20250919] 过滤 169 只 ST 股票\n",
" [20250922] 过滤 169 只 ST 股票\n",
" [20250923] 过滤 173 只 ST 股票\n",
" [20250924] 过滤 172 只 ST 股票\n",
" [20250925] 过滤 173 只 ST 股票\n",
" [20250926] 过滤 173 只 ST 股票\n",
" [20250929] 过滤 172 只 ST 股票\n",
" [20250930] 过滤 173 只 ST 股票\n",
" [20251009] 过滤 174 只 ST 股票\n",
" [20251010] 过滤 175 只 ST 股票\n",
" [20251013] 过滤 174 只 ST 股票\n",
" [20251014] 过滤 174 只 ST 股票\n",
" [20251015] 过滤 174 只 ST 股票\n",
" [20251016] 过滤 175 只 ST 股票\n",
" [20251017] 过滤 175 只 ST 股票\n",
" [20251020] 过滤 175 只 ST 股票\n",
" [20251021] 过滤 175 只 ST 股票\n",
" [20251022] 过滤 174 只 ST 股票\n",
" [20251023] 过滤 175 只 ST 股票\n",
" [20251024] 过滤 175 只 ST 股票\n",
" [20251027] 过滤 176 只 ST 股票\n",
" [20251028] 过滤 175 只 ST 股票\n",
" [20251029] 过滤 174 只 ST 股票\n",
" [20251030] 过滤 174 只 ST 股票\n",
" [20251031] 过滤 176 只 ST 股票\n",
" [20251103] 过滤 176 只 ST 股票\n",
" [20251104] 过滤 176 只 ST 股票\n",
" [20251105] 过滤 177 只 ST 股票\n",
" [20251106] 过滤 177 只 ST 股票\n",
" [20251107] 过滤 176 只 ST 股票\n",
" [20251110] 过滤 176 只 ST 股票\n",
" [20251111] 过滤 174 只 ST 股票\n",
" [20251112] 过滤 175 只 ST 股票\n",
" [20251113] 过滤 174 只 ST 股票\n",
" [20251114] 过滤 173 只 ST 股票\n",
" [20251117] 过滤 173 只 ST 股票\n",
" [20251118] 过滤 174 只 ST 股票\n",
" [20251119] 过滤 173 只 ST 股票\n",
" [20251120] 过滤 174 只 ST 股票\n",
" [20251121] 过滤 174 只 ST 股票\n",
" [20251124] 过滤 174 只 ST 股票\n",
" [20251125] 过滤 174 只 ST 股票\n",
" [20251126] 过滤 172 只 ST 股票\n",
" [20251127] 过滤 171 只 ST 股票\n",
" [20251128] 过滤 172 只 ST 股票\n",
" [20251201] 过滤 170 只 ST 股票\n",
" [20251202] 过滤 172 只 ST 股票\n",
" [20251203] 过滤 173 只 ST 股票\n",
" [20251204] 过滤 173 只 ST 股票\n",
" [20251205] 过滤 172 只 ST 股票\n",
" [20251208] 过滤 173 只 ST 股票\n",
" [20251209] 过滤 172 只 ST 股票\n",
" [20251210] 过滤 171 只 ST 股票\n",
" [20251211] 过滤 173 只 ST 股票\n",
" [20251212] 过滤 174 只 ST 股票\n",
" [20251215] 过滤 174 只 ST 股票\n",
" [20251216] 过滤 175 只 ST 股票\n",
" [20251217] 过滤 175 只 ST 股票\n",
" [20251218] 过滤 175 只 ST 股票\n",
" [20251219] 过滤 174 只 ST 股票\n",
" [20251222] 过滤 174 只 ST 股票\n",
" [20251223] 过滤 175 只 ST 股票\n",
" [20251224] 过滤 175 只 ST 股票\n",
" [20251225] 过滤 176 只 ST 股票\n",
" [20251226] 过滤 173 只 ST 股票\n",
" [20251229] 过滤 174 只 ST 股票\n",
" [20251230] 过滤 176 只 ST 股票\n",
" [20251231] 过滤 175 只 ST 股票\n",
" ST 过滤后数据规模: (6823808, 71)\n",
"\n",
"执行每日独立筛选股票池...\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\liaozhaorun\\AppData\\Local\\Temp\\ipykernel_29336\\174861970.py:63: DeprecationWarning: `is_in` with a collection of the same datatype is ambiguous and deprecated.\n",
"Please use `implode` to return to previous behavior.\n",
"\n",
"See https://github.com/pola-rs/polars/issues/22149 for more information.\n",
" return df[\"ts_code\"].is_in(small_cap_codes)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" 筛选前数据规模: (6823808, 71)\n",
" 筛选后数据规模: (1455000, 71)\n",
" 筛选前股票数: 5678\n",
" 筛选后股票数: 1934\n",
" 删除记录数: 5368808\n"
]
}
],
"execution_count": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.2 数据划分"
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2026-03-11T13:28:49.140684Z",
"start_time": "2026-03-11T13:28:49.078377Z"
}
},
"source": [
"print(\"\\n\" + \"=\" * 80)\n",
"print(\"数据划分\")\n",
"print(\"=\" * 80)\n",
"\n",
"if splitter:\n",
" train_data, val_data, test_data = splitter.split(filtered_data)\n",
" print(f\"\\n训练集数据规模: {train_data.shape}\")\n",
" print(f\"验证集数据规模: {val_data.shape}\")\n",
" print(f\"测试集数据规模: {test_data.shape}\")\n",
" \n",
" # 计算各集的 group 数组\n",
" train_group = compute_group_array(train_data)\n",
" val_group = compute_group_array(val_data)\n",
" test_group = compute_group_array(test_data)\n",
" \n",
" print(f\"\\n训练集 group 数量: {len(train_group)}\")\n",
" print(f\"验证集 group 数量: {len(val_group)}\")\n",
" print(f\"测试集 group 数量: {len(test_group)}\")\n",
" print(f\"训练集日均样本数: {np.mean(train_group):.1f}\")\n",
" print(f\"验证集日均样本数: {np.mean(val_group):.1f}\")\n",
" print(f\"测试集日均样本数: {np.mean(test_group):.1f}\")\n",
"else:\n",
" raise ValueError(\"必须配置数据划分器\")"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"================================================================================\n",
"数据划分\n",
"================================================================================\n",
"\n",
"训练集数据规模: (970000, 71)\n",
"验证集数据规模: (242000, 71)\n",
"测试集数据规模: (243000, 71)\n",
"\n",
"训练集 group 数量: 970\n",
"验证集 group 数量: 242\n",
"测试集 group 数量: 243\n",
"训练集日均样本数: 1000.0\n",
"验证集日均样本数: 1000.0\n",
"测试集日均样本数: 1000.0\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\liaozhaorun\\AppData\\Local\\Temp\\ipykernel_29336\\551043002.py:132: DeprecationWarning: `pl.count()` is deprecated. Please use `pl.len()` instead.\n",
"(Deprecated in version 0.20.5)\n",
" pl.count().alias(\"count\")\n"
]
}
],
"execution_count": 7
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.3 数据预处理"
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2026-03-11T13:28:49.680671Z",
"start_time": "2026-03-11T13:28:49.150412Z"
}
},
"source": [
"print(\"\\n\" + \"=\" * 80)\n",
"print(\"数据预处理\")\n",
"print(\"=\" * 80)\n",
"\n",
"fitted_processors = []\n",
"if processors:\n",
" print(\"\\n训练集处理...\")\n",
" for i, processor in enumerate(processors, 1):\n",
" print(f\" [{i}/{len(processors)}] {processor.__class__.__name__}\")\n",
" train_data = processor.fit_transform(train_data)\n",
" fitted_processors.append(processor)\n",
" \n",
" print(\"\\n验证集处理...\")\n",
" for processor in fitted_processors:\n",
" val_data = processor.transform(val_data)\n",
" \n",
" print(\"\\n测试集处理...\")\n",
" for processor in fitted_processors:\n",
" test_data = processor.transform(test_data)\n",
"\n",
"print(f\"\\n处理后训练集形状: {train_data.shape}\")\n",
"print(f\"处理后验证集形状: {val_data.shape}\")\n",
"print(f\"处理后测试集形状: {test_data.shape}\")"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"================================================================================\n",
"数据预处理\n",
"================================================================================\n",
"\n",
"训练集处理...\n",
" [1/3] NullFiller\n",
" [2/3] Winsorizer\n",
" [3/3] StandardScaler\n",
"\n",
"验证集处理...\n",
"\n",
"测试集处理...\n",
"\n",
"处理后训练集形状: (970000, 71)\n",
"处理后验证集形状: (242000, 71)\n",
"处理后测试集形状: (243000, 71)\n"
]
}
],
"execution_count": 8
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.4 训练 LambdaRank 模型"
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2026-03-11T13:28:52.285645Z",
"start_time": "2026-03-11T13:28:49.685562Z"
}
},
"source": [
"print(\"\\n\" + \"=\" * 80)\n",
"print(\"训练 LambdaRank 模型\")\n",
"print(\"=\" * 80)\n",
"\n",
"# 准备数据\n",
"X_train = train_data.select(feature_cols)\n",
"y_train = train_data.select(target_col).to_series()\n",
"\n",
"X_val = val_data.select(feature_cols)\n",
"y_val = val_data.select(target_col).to_series()\n",
"\n",
"print(f\"\\n训练样本数: {len(X_train)}\")\n",
"print(f\"验证样本数: {len(X_val)}\")\n",
"print(f\"特征数: {len(feature_cols)}\")\n",
"print(f\"目标变量: {target_col}\")\n",
"\n",
"print(\"\\n目标变量统计训练集:\")\n",
"print(y_train.describe())\n",
"\n",
"print(\"\\n开始训练...\")\n",
"model.fit(\n",
" X=X_train,\n",
" y=y_train,\n",
" group=train_group,\n",
" eval_set=(X_val, y_val, val_group),\n",
")\n",
"print(\"训练完成!\")"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"================================================================================\n",
"训练 LambdaRank 模型\n",
"================================================================================\n",
"\n",
"训练样本数: 970000\n",
"验证样本数: 242000\n",
"特征数: 49\n",
"目标变量: future_return_5_rank_rank\n",
"\n",
"目标变量统计(训练集):\n",
"shape: (9, 2)\n",
"┌────────────┬──────────┐\n",
"│ statistic ┆ value │\n",
"│ --- ┆ --- │\n",
"│ str ┆ f64 │\n",
"╞════════════╪══════════╡\n",
"│ count ┆ 969665.0 │\n",
"│ null_count ┆ 335.0 │\n",
"│ mean ┆ 9.810091 │\n",
"│ std ┆ 5.346526 │\n",
"│ min ┆ 0.0 │\n",
"│ 25% ┆ 6.0 │\n",
"│ 50% ┆ 10.0 │\n",
"│ 75% ┆ 14.0 │\n",
"│ max ┆ 19.0 │\n",
"└────────────┴──────────┘\n",
"\n",
"开始训练...\n",
"Training until validation scores don't improve for 50 rounds\n",
"Early stopping, best iteration is:\n",
"[50]\ttraining's ndcg@1: 0.676684\ttraining's ndcg@5: 0.440728\ttraining's ndcg@10: 0.361258\ttraining's ndcg@20: 0.296362\tvalid_1's ndcg@1: 0.272472\tvalid_1's ndcg@5: 0.215751\tvalid_1's ndcg@10: 0.198035\tvalid_1's ndcg@20: 0.191275\n",
"训练完成!\n"
]
}
],
"execution_count": 9
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.5 训练指标曲线"
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2026-03-11T13:28:54.767311Z",
"start_time": "2026-03-11T13:28:52.291103Z"
}
},
"source": [
"print(\"\\n\" + \"=\" * 80)\n",
"print(\"训练指标曲线\")\n",
"print(\"=\" * 80)\n",
"\n",
"# 重新训练以收集指标(因为之前的训练没有保存评估结果)\n",
"print(\"\\n重新训练模型以收集训练指标...\")\n",
"\n",
"import lightgbm as lgb\n",
"\n",
"# 准备数据(使用 val 做验证test 不参与训练过程)\n",
"X_train_np = X_train.to_numpy()\n",
"y_train_np = y_train.to_numpy()\n",
"X_val_np = val_data.select(feature_cols).to_numpy()\n",
"y_val_np = val_data.select(target_col).to_series().to_numpy()\n",
"\n",
"# 创建数据集\n",
"train_dataset = lgb.Dataset(X_train_np, label=y_train_np, group=train_group)\n",
"val_dataset = lgb.Dataset(X_val_np, label=y_val_np, group=val_group, reference=train_dataset)\n",
"\n",
"# 用于存储评估结果\n",
"evals_result = {}\n",
"\n",
"# 使用与原模型相同的参数重新训练\n",
"# 正确的三分法train用于训练val用于验证test不参与训练过程\n",
"booster_with_eval = lgb.train(\n",
" MODEL_PARAMS,\n",
" train_dataset,\n",
" num_boost_round=MODEL_PARAMS.get(\"n_estimators\", 1000),\n",
" valid_sets=[train_dataset, val_dataset],\n",
" valid_names=[\"train\", \"val\"],\n",
" callbacks=[\n",
" lgb.record_evaluation(evals_result),\n",
" lgb.early_stopping(stopping_rounds=50, verbose=True),\n",
" ],\n",
")\n",
"\n",
"print(\"训练完成,指标已收集\")\n",
"\n",
"# 获取评估的 NDCG 指标\n",
"ndcg_metrics = [k for k in evals_result[\"train\"].keys() if \"ndcg\" in k]\n",
"print(f\"\\n评估的 NDCG 指标: {ndcg_metrics}\")\n",
"\n",
"# 显示早停信息\n",
"actual_rounds = len(list(evals_result[\"train\"].values())[0])\n",
"expected_rounds = MODEL_PARAMS.get(\"n_estimators\", 1000)\n",
"print(f\"\\n[早停信息]\")\n",
"print(f\" 配置的最大轮数: {expected_rounds}\")\n",
"print(f\" 实际训练轮数: {actual_rounds}\")\n",
"if actual_rounds < expected_rounds:\n",
" print(f\" 早停状态: 已触发连续50轮验证指标未改善\")\n",
"else:\n",
" print(f\" 早停状态: 未触发(达到最大轮数)\")\n",
"\n",
"# 显示各 NDCG 指标的最终值\n",
"print(f\"\\n最终 NDCG 指标:\")\n",
"for metric in ndcg_metrics:\n",
" train_ndcg = evals_result[\"train\"][metric][-1]\n",
" val_ndcg = evals_result[\"val\"][metric][-1]\n",
" print(f\" {metric}: 训练集={train_ndcg:.4f}, 验证集={val_ndcg:.4f}\")"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"================================================================================\n",
"训练指标曲线\n",
"================================================================================\n",
"\n",
"重新训练模型以收集训练指标...\n",
"Training until validation scores don't improve for 50 rounds\n",
"训练完成,指标已收集\n",
"\n",
"评估的 NDCG 指标: ['ndcg@1', 'ndcg@5', 'ndcg@10', 'ndcg@20']\n",
"\n",
"[早停信息]\n",
" 配置的最大轮数: 1000\n",
" 实际训练轮数: 100\n",
" 早停状态: 已触发连续50轮验证指标未改善\n",
"\n",
"最终 NDCG 指标:\n",
" ndcg@1: 训练集=0.7563, 验证集=0.2625\n",
" ndcg@5: 训练集=0.5383, 验证集=0.2203\n",
" ndcg@10: 训练集=0.4355, 验证集=0.2053\n",
" ndcg@20: 训练集=0.3464, 验证集=0.1960\n"
]
}
],
"execution_count": 10
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2026-03-11T13:28:55.115683Z",
"start_time": "2026-03-11T13:28:54.771304Z"
}
},
"source": [
"# 绘制 NDCG 训练指标曲线\n",
"import matplotlib.pyplot as plt\n",
"\n",
"fig, axes = plt.subplots(2, 2, figsize=(14, 10))\n",
"axes = axes.flatten()\n",
"\n",
"for idx, metric in enumerate(ndcg_metrics[:4]): # 最多显示4个NDCG指标\n",
" ax = axes[idx]\n",
" train_metric = evals_result[\"train\"][metric]\n",
" val_metric = evals_result[\"val\"][metric]\n",
" iterations = range(1, len(train_metric) + 1)\n",
" \n",
" ax.plot(iterations, train_metric, label=f\"Train {metric}\", linewidth=2, color=\"blue\")\n",
" ax.plot(iterations, val_metric, label=f\"Val {metric}\", linewidth=2, color=\"red\")\n",
" ax.set_xlabel(\"Iteration\", fontsize=10)\n",
" ax.set_ylabel(metric.upper(), fontsize=10)\n",
" ax.set_title(f\"Training and Validation {metric.upper()}\", fontsize=12, fontweight=\"bold\")\n",
" ax.legend(fontsize=9)\n",
" ax.grid(True, alpha=0.3)\n",
" \n",
" # 标记最佳验证指标点\n",
" best_iter = val_metric.index(max(val_metric))\n",
" best_metric = max(val_metric)\n",
" ax.axvline(x=best_iter + 1, color=\"green\", linestyle=\"--\", alpha=0.7)\n",
" ax.scatter([best_iter + 1], [best_metric], color=\"green\", s=80, zorder=5)\n",
" ax.annotate(\n",
" f\"Best: {best_metric:.4f}\",\n",
" xy=(best_iter + 1, best_metric),\n",
" xytext=(best_iter + 1 + len(iterations) * 0.05, best_metric),\n",
" fontsize=8,\n",
" arrowprops=dict(arrowstyle=\"->\", color=\"green\", alpha=0.7),\n",
" )\n",
"\n",
"plt.tight_layout()\n",
"plt.show()\n",
"\n",
"print(f\"\\n[指标分析]\")\n",
"print(f\" 各NDCG指标在验证集上的最佳值:\")\n",
"for metric in ndcg_metrics:\n",
" val_metric_list = evals_result[\"val\"][metric]\n",
" best_iter = val_metric_list.index(max(val_metric_list))\n",
" best_val = max(val_metric_list)\n",
" print(f\" {metric}: {best_val:.4f} (迭代 {best_iter + 1})\")\n",
"print(f\"\\n[重要提醒] 验证集仅用于早停/调参,测试集完全独立于训练过程!\")"
],
"outputs": [
{
"data": {
"text/plain": [
"<Figure size 1400x1000 with 4 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAABWsAAAPeCAYAAAB6B0gVAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3Qd4FGXXxvE7hRBAem/SpSiIVFGsgCgWivIiKiAivmKXV1EsKFj4bIgFRFEUsSEKWFAQQVRsKIgFBAVRmnTpJoFkv+vMuNmUTUhgs/X/u64hs7Ozs7PzLMkzZ86cJ87j8XgEAAAAAAAAAAip+NC+PQAAAAAAAADAEKwFAAAAAAAAgDBAsBYAAAAAAAAAwgDBWgAAAAAAAAAIAwRrAQAAAAAAACAMEKwFAAAAAAAAgDBAsBYAAAAAAAAAwgDBWgAAAAAAAAAIAwRrAQAAAAAAACAMEKwFItzpp5+uuLg4Z/rjjz8OaxsvvfRS5jbuvfdexZoFCxZkfv7LL7887NrTfnqX2fPh8Hnse+J9D/v+AACA6EV/88jR3yw8+psAYhXBWiBA6tatmxm8OtRknTVEnn379qlUqVKZ7fj777/7Xa9Dhw6Z67z66quKRDt37nQ6yDaFezA26wmktc+2bdvy/L+5YsUKv8vj4+NVvHhxVa1aVe3bt9ewYcMOefHj448/Vp8+fXT00UcrOTlZVapUUbt27TRy5EitXbs21/pr1qzR//73Px1//PEqW7asSpQooXr16jn7P3r0aK1atSrP97J9ueWWW9SsWTPnM1aqVMl5r4cfflg7duzw+xpbPnz4cJ122mkqWbJk2FyQAAAcPvqb0Y/+Zniiv7njkBch/E2xmAgEBIQHQEDUqVPHY/+lCjJ98sknATvqP/74o+fzzz93ppSUlMPaxubNmzO38eeff3pijbWHt20GDBiQ77oXX3xx5rqjR4/O9fzatWs9cXFxzvMlSpTw7Nmzp1D7ctppp2Vuf82aNc4ya1dv+1h7B/Lz5MXe27sN26ec7Hvi3Sf7/oRS1mNm0/Dhw/P8v/nLL7/4Xe5vKlasmOfZZ5/N9X5paWmefv365fvaG2+8MdtrJk6c6ElKSsr3NRdeeKHfzzdmzBhPcnJynq+rVq2aZ86cOble9/333/td/3C/EwCA0KO/Gbnob+ZGfzPy+5tZv9f+pnvuuecI/tcAsSsxMCFfAG+99ZZSUlIyD0Tv3r21adMmZ/7JJ5/UCSeckPlc8+bN872SXhh5baswLCPQJhzaxRdfrDfeeMOZf/PNN3X77bdne37atGl2EcyZP/fcc3XUUUcd8WG1jM+OHTuGVfNYNqlN4WjcuHFOZmy5cuUK/Br7P2r/l/7880+9+OKL+vTTT3XgwAH997//VeXKldWzZ8/MdW+++WZNmTLFmbeM3MGDB+u8885zsmt/+umnXJnIM2bM0FVXXZX5vbDMa3uNZUft2bNH3333naZOnep3vyxL15uR0LZtW/Xr109NmzZVWlqali9frtdee03ff/+9LrjgAs2dO1ennHJK5muTkpJ06qmn6qSTTtKWLVs0adKkQh5JAEC4ob8ZG+hvuuhvhn9/M6uc57zeNgRwGEIdLQZiIfMhayZtzivIn376qefEE090rmR6M96ef/55z1lnneWpXbu2p2TJkp7ixYt7GjZs6Lnuuus8W7duPWQmZs73WLRokef00093Mj2rVq3qufPOOz3p6emZ23jxxRf9Xv3Muu0ffvjBef/KlSs7+3r22Wd7/vjjj2z7YtscOXKkp2bNms572Xtadp+/fczL+vXrPQMHDvS0aNHCU7FiRU9iYqKnfPnynjPOOMMzY8aMfDMUZs+e7WnTpo1zvOzYPfHEE7m2790f+wy2n/fee69n7ty5Bc46TE1N9ZQrVy5z/d9++y3b89aW3ufefvvtImnPw/089l276KKLnPcuW7ascyW/evXqnt69ezvt62WvyevquPf97XviXWbfn6wWL17svI991+w97Kddxf/uu++yrZfzezdlyhTPscce62QENGrUyDN16tR828LfMfNO9j0sTGZt1v+jGRkZzv57n6tbt67nwIEDznP2+vj4+MznnnrqqVz7Y69fsWKFM2+vs9d717djnfX/XtbX5Mya/uyzz5z3srZ6//33/X52e9348eM9CQkJTvvv3bvX73rPPPMMmbUAEIXob9LfpL9JfzOU/c2s52OBvHsUiHUEa4EQdp5r1KiR7XYTb2Cta9eueQbLmjZt6vnnn38KHNyzYJwFTnNux26TKUywtn79+rm2cfLJJ2f7zDfccEOudewPf9bOw6GCtV999VW+t9JMnjzZb+fAjnfWIJp3ssCllwVWbX9yrmOB4YIGa80VV1yRuf4DDzyQrTSAtwRCmTJlMtspkO2ZNVhb2M9jZRvy2g8LIi9fvvyIg7XvvPOOE6D191pbbs/7+975+35Ze3qDnvnJeswsWG8/K1SokFmCorDBWm85i6zfJyv3YEaNGpW5zILeBw8ezHffrAOc9fNs2LDBU1Cnnnqq0yn+4osvnMfz58/3NGvWzFOqVCnP0KFDPddee23m9+Tpp5925v3dRmcI1gJAdKK/SX+T/ib9zVD2N7Oej9m5rSVdWGJLly5dsp2HASgcBhgDQmjjxo2qVauWXnnlFX3wwQfq0aOHs9wGLbJblmfNmuUUbbef/fv3d5775ZdfNH369AK/x19//aVWrVrpnXfe0Q033JC5/Nlnny3Uvm7dulUTJkxw9tV7e/kXX3yhZcuWOfMrV67UU089lXmrzogRI/Tee+85gyAdaqCmrKpVq6b/+7//09tvv+0M4PTJJ59o8uTJzq3o5v777/f7Ort9/fzzz3fe024d8/c57777bu3atcuZt1t0Zs6c6exzfgM7+ZN1+1YKIeutid5bj7p37+7cphTo9syqsJ/H2sKef/fdd53jarcxPfTQQ85z+/fv1+OPP+7M33nnnU45B6+WLVvq888/dyZvG+dVxmPQoEFO+QAzZMgQ53t9zTXXOI9tuT1v6+Vkg7XZc++//746derkLMvIyNDzzz9fqGNy0003OaVEbHCt8ePH63DVrl1bNWvWzHy8dOlS5+cPP/yQucxuL0tISMh3O1nXb9y4sWrUqJHtuYULF2abUlNTnedsgLLPPvvMuX3NW8bAvt92K5odvzFjxmjOnDmZ27Jjbdu24w0AQFb0N3Ojv1lw9Ddzo7/5QZ6/a6x0gg1UbOcZZ511VtgPVAyErUIGdwEEMNMhr8xBy+obPHiwp169es4t8zkzDm+++eYCZ2La1c1NmzY5y+12GMugtOV2xbMwmbWPP/545vKrr746c/nMmTOdZQ899JDfwvU7duzIltl7qMxa89JLL3lOOeUUZx+9mapZp127duW6klulSpXMAdbs83qXt2zZMvOzH3XUUZnLly1blvl+VhaiMJm1lk1p7+d9zcqVK53l7du3z1z2wQcfFEl7ejNbD+fz7Nu3zymT0Lx588zvQdbphBNOKPCAD/4ya6dPn565rHXr1tnWt8fe57zlLLJ+744//vjMdb/++uvM5T169Dhke2Q9Zh9++KHnf//7X+Z3Yv/+/YeVWWvatWuX+fz999/vLOvcuXPmsttuu+2Q+2av867foUOHPI9JzjZ/5ZVXnMeWaW6s3exx27ZtPbNmzXIyHXK+plu3bk4mhD9k1gJAdKK/6aK/SX/T0N8Mfn/TsnqtXJ2VBrN++Ouvv555p5tNdhdgXmW6AOSNAcaAEGrUqJGTbZeVFYC3TLr169fn+Tq7WllQTZo0UdWqVTMzXsuXL+9kURZmG+a0007LnK9YsWKufbHMSK/27dtnztv72T5YUfqCsOzOoUOH5ruOvWeZMmWyLTvxxBOdgbjy2j/LTNy7d68zb5mXzZo1y5ZxWhiWTWkDyNlAVt7sWsuUXbRoUeb7d+nSpUja0+twPk/fvn2drNpA7kdWv/76q9/vgHefFi9enGu9gn6/CuOWW25x2saO0XPPPafDtWHDhsz5smXLZvvpzR44lKzr5/cdyMm7bRvcwdhAEmbs2LHO96lbt25OW2b
},
"metadata": {},
"output_type": "display_data",
"jetTransient": {
"display_id": null
}
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"[指标分析]\n",
" 各NDCG指标在验证集上的最佳值:\n",
" ndcg@1: 0.2725 (迭代 50)\n",
" ndcg@5: 0.2203 (迭代 97)\n",
" ndcg@10: 0.2108 (迭代 74)\n",
" ndcg@20: 0.1970 (迭代 86)\n",
"\n",
"[重要提醒] 验证集仅用于早停/调参,测试集完全独立于训练过程!\n"
]
}
],
"execution_count": 11
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.6 模型评估"
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2026-03-11T13:28:55.390466Z",
"start_time": "2026-03-11T13:28:55.124417Z"
}
},
"source": [
"print(\"\\n\" + \"=\" * 80)\n",
"print(\"模型评估\")\n",
"print(\"=\" * 80)\n",
"\n",
"# 准备测试集\n",
"X_test = test_data.select(feature_cols)\n",
"y_test = test_data.select(target_col).to_series()\n",
"\n",
"# 预测\n",
"print(\"\\n生成预测...\")\n",
"predictions = model.predict(X_test)\n",
"\n",
"# 添加预测列\n",
"test_data = test_data.with_columns([pl.Series(\"prediction\", predictions)])\n",
"\n",
"# 计算 NDCG 指标\n",
"print(\"\\n计算 NDCG 指标...\")\n",
"ndcg_results = evaluate_ndcg_at_k(\n",
" y_true=y_test.to_numpy(),\n",
" y_pred=predictions,\n",
" group=test_group,\n",
" k_list=[1, 5, 10, 20],\n",
")\n",
"\n",
"print(\"\\nNDCG 评估结果:\")\n",
"print(\"-\" * 40)\n",
"for metric, value in ndcg_results.items():\n",
" print(f\" {metric}: {value:.4f}\")\n",
"\n",
"# 特征重要性\n",
"print(\"\\n特征重要性Top 20:\")\n",
"print(\"-\" * 40)\n",
"importance = model.feature_importance()\n",
"if importance is not None:\n",
" top_features = importance.sort_values(ascending=False).head(20)\n",
" for i, (feature, score) in enumerate(top_features.items(), 1):\n",
" print(f\" {i:2d}. {feature:30s} {score:10.2f}\")"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"================================================================================\n",
"模型评估\n",
"================================================================================\n",
"\n",
"生成预测...\n",
"\n",
"计算 NDCG 指标...\n",
"\n",
"NDCG 评估结果:\n",
"----------------------------------------\n",
" ndcg@1: 0.3919\n",
" ndcg@5: 0.3768\n",
" ndcg@10: 0.3831\n",
" ndcg@20: 0.3935\n",
"\n",
"特征重要性Top 20:\n",
"----------------------------------------\n",
" 1. max_ret_20 4720.20\n",
" 2. turnover_rank 4345.39\n",
" 3. overnight_intraday_diff 3623.13\n",
" 4. volatility_5 2632.23\n",
" 5. turnover_rate_mean_5 2518.52\n",
" 6. std_return_20 1819.15\n",
" 7. close_vwap_deviation 1525.61\n",
" 8. return_20 1014.14\n",
" 9. return_5_rank 694.17\n",
" 10. EP 412.96\n",
" 11. ma_5 403.47\n",
" 12. BP 369.00\n",
" 13. ma_20 345.33\n",
" 14. upper_shadow_ratio 342.03\n",
" 15. bbi_ratio 339.14\n",
" 16. roa 289.77\n",
" 17. roe 269.37\n",
" 18. drawdown_from_high_60 248.74\n",
" 19. min_ret_20 247.30\n",
" 20. high_low_ratio 215.36\n"
]
}
],
"execution_count": 12
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2026-03-11T13:28:55.620414Z",
"start_time": "2026-03-11T13:28:55.402837Z"
}
},
"source": [
"# 确保输出目录存在\n",
"os.makedirs(OUTPUT_DIR, exist_ok=True)\n",
"\n",
"# 生成时间戳\n",
"start_dt = datetime.strptime(TEST_START, \"%Y%m%d\")\n",
"end_dt = datetime.strptime(TEST_END, \"%Y%m%d\")\n",
"date_str = f\"{start_dt.strftime('%Y%m%d')}_{end_dt.strftime('%Y%m%d')}\"\n",
"\n",
"# 保存每日 Top N\n",
"print(f\"\\n[1/1] 保存每日 Top {TOP_N} 股票...\")\n",
"topn_output_path = os.path.join(OUTPUT_DIR, \"rank_output.csv\")\n",
"\n",
"# 按日期分组,取每日 top N\n",
"topn_by_date = []\n",
"unique_dates = test_data[\"trade_date\"].unique().sort()\n",
"for date in unique_dates:\n",
" day_data = test_data.filter(test_data[\"trade_date\"] == date)\n",
" # 按 prediction 降序排序,取前 N\n",
" topn = day_data.sort(\"prediction\", descending=True).head(TOP_N)\n",
" topn_by_date.append(topn)\n",
"\n",
"# 合并所有日期的 top N\n",
"topn_results = pl.concat(topn_by_date)\n",
"\n",
"# 格式化日期并调整列顺序:日期、分数、股票\n",
"topn_to_save = topn_results.select(\n",
" [\n",
" pl.col(\"trade_date\").str.slice(0, 4)\n",
" + \"-\"\n",
" + pl.col(\"trade_date\").str.slice(4, 2)\n",
" + \"-\"\n",
" + pl.col(\"trade_date\").str.slice(6, 2).alias(\"date\"),\n",
" pl.col(\"prediction\").alias(\"score\"),\n",
" pl.col(\"ts_code\"),\n",
" ]\n",
")\n",
"topn_to_save.write_csv(topn_output_path, include_header=True)\n",
"print(f\" 保存路径: {topn_output_path}\")\n",
"print(f\" 保存行数: {len(topn_to_save)}{len(unique_dates)}个交易日 x 每日top{TOP_N}\")\n",
"print(f\"\\n 预览前15行:\")\n",
"print(topn_to_save.head(15))\n",
"\n",
"print(\"\\n训练流程完成\")"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"[1/1] 保存每日 Top 5 股票...\n",
" 保存路径: output\\rank_output.csv\n",
" 保存行数: 1215243个交易日 x 每日top5\n",
"\n",
" 预览前15行:\n",
"shape: (15, 3)\n",
"┌────────────┬──────────┬───────────┐\n",
"│ trade_date ┆ score ┆ ts_code │\n",
"│ --- ┆ --- ┆ --- │\n",
"│ str ┆ f64 ┆ str │\n",
"╞════════════╪══════════╪═══════════╡\n",
"│ 2025-01-02 ┆ 0.603437 ┆ 600530.SH │\n",
"│ 2025-01-02 ┆ 0.580176 ┆ 600322.SH │\n",
"│ 2025-01-02 ┆ 0.538287 ┆ 605080.SH │\n",
"│ 2025-01-02 ┆ 0.488088 ┆ 000679.SZ │\n",
"│ 2025-01-02 ┆ 0.480476 ┆ 603958.SH │\n",
"│ … ┆ … ┆ … │\n",
"│ 2025-01-06 ┆ 0.963227 ┆ 600807.SH │\n",
"│ 2025-01-06 ┆ 0.737975 ┆ 002816.SZ │\n",
"│ 2025-01-06 ┆ 0.644058 ┆ 603617.SH │\n",
"│ 2025-01-06 ┆ 0.637653 ┆ 000573.SZ │\n",
"│ 2025-01-06 ┆ 0.521599 ┆ 605580.SH │\n",
"└────────────┴──────────┴───────────┘\n",
"\n",
"训练流程完成!\n"
]
}
],
"execution_count": 13
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 5. 总结\n",
"\n",
"本 Notebook 实现了完整的 Learn-to-Rank 训练流程:\n",
"\n",
"### 核心步骤\n",
"\n",
"1. **数据准备**: 计算 49 个特征因子,将 `future_return_5` 转换为 20 分位数标签\n",
"2. **模型训练**: 使用 LightGBM LambdaRank 学习每日股票排序\n",
"3. **模型评估**: 使用 NDCG@1/5/10/20 评估排序质量\n",
"4. **策略分析**: 基于排序分数构建 Top-k 选股策略\n",
"\n",
"### 关键参数\n",
"\n",
"- **Objective**: lambdarank\n",
"- **Metric**: ndcg\n",
"- **Learning Rate**: 0.05\n",
"- **Num Leaves**: 31\n",
"- **N Quantiles**: 20\n",
"\n",
"### 输出结果\n",
"\n",
"- rank_output.csv: 每日Top-N推荐股票格式date, score, ts_code\n",
"- 特征重要性排名\n",
"- Top-k 策略统计和图表\n",
"- NDCG训练指标曲线\n",
"\n",
"### 后续优化方向\n",
"\n",
"1. **特征工程**: 尝试更多因子组合\n",
"2. **超参数调优**: 使用网格搜索优化 LambdaRank 参数\n",
"3. **模型集成**: 结合多个排序模型的预测\n",
"4. **更复杂的分组**: 考虑按行业分组排序"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.0"
}
},
"nbformat": 4,
"nbformat_minor": 4
}