From 505279c08bbf4da0c83381bd930699407f448452 Mon Sep 17 00:00:00 2001 From: liaozhaorun <1300336796@qq.com> Date: Sun, 8 Mar 2026 20:58:35 +0800 Subject: [PATCH] =?UTF-8?q?fix(data):=20=E4=BF=AE=E5=A4=8D=E8=B4=A2?= =?UTF-8?q?=E5=8A=A1=E5=9B=A0=E5=AD=90=E8=AE=A1=E7=AE=97=E9=9D=9E=E7=A1=AE?= =?UTF-8?q?=E5=AE=9A=E6=80=A7=E9=97=AE=E9=A2=98=20=E9=87=8D=E6=9E=84=20fin?= =?UTF-8?q?ancial=5Floader=20=E7=9A=84=E5=8E=BB=E9=87=8D=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E7=A1=AE=E4=BF=9D=E6=88=AA=E9=9D=A2=E6=8E=92=E5=90=8D?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E7=9A=84=E8=82=A1=E7=A5=A8=E9=9B=86=E5=90=88?= =?UTF-8?q?=E4=B8=80=E8=87=B4=EF=BC=9A=20-=20=E5=BC=95=E5=85=A5"=E9=AB=98?= =?UTF-8?q?=E6=B0=B4=E4=BD=8D=E7=BA=BF"=E7=AE=97=E6=B3=95=E5=89=94?= =?UTF-8?q?=E9=99=A4=E9=99=88=E6=97=A7=E5=8E=86=E5=8F=B2=E8=B4=A2=E6=8A=A5?= =?UTF-8?q?=EF=BC=88=E8=A7=A3=E5=86=B32026=E5=B9=B4=E5=8F=91=E5=B8=832021?= =?UTF-8?q?=E5=B9=B4=E8=B4=A2=E6=8A=A5=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=89?= =?UTF-8?q?=20-=20=E6=94=B9=E5=8F=98=E5=8E=BB=E9=87=8D=E7=AD=96=E7=95=A5?= =?UTF-8?q?=EF=BC=9A=E6=8C=89=E6=8A=A5=E5=91=8A=E6=9C=9F(end=5Fdate)?= =?UTF-8?q?=E8=80=8C=E9=9D=9E=E6=9B=B4=E6=96=B0=E6=A0=87=E8=AF=86(update?= =?UTF-8?q?=5Fflag)=E4=BF=9D=E7=95=99=E6=9C=80=E6=96=B0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=20-=20=E6=89=A9=E5=B1=95=E5=9B=9E=E7=9C=8B=E6=9C=9F=E4=BB=8E1?= =?UTF-8?q?=E5=B9=B4=E5=88=B02=E5=B9=B4=EF=BC=8C=E9=98=B2=E6=AD=A2ST/?= =?UTF-8?q?=E5=81=9C=E7=89=8C=E5=85=AC=E5=8F=B8=E8=B4=A2=E6=8A=A5=E7=BC=BA?= =?UTF-8?q?=E5=A4=B1=20-=20=E7=A1=AE=E4=BF=9D=E7=9B=B8=E5=90=8C=E4=BA=A4?= =?UTF-8?q?=E6=98=93=E6=97=A5=E5=9C=A8=E4=B8=8D=E5=90=8C=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E8=8C=83=E5=9B=B4=E4=B8=8B=E8=BF=94=E5=9B=9E=E4=B8=80=E8=87=B4?= =?UTF-8?q?=E7=9A=84=E8=B4=A2=E5=8A=A1=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2026-03-07-financial-sync-refactor.md | 1490 ----------------- docs/plan/training_module_plan.md | 1025 ------------ src/data/financial_loader.py | 57 +- src/experiment/regression.ipynb | 572 +++---- tests/test_financial_price_merge.py | 189 ++- 5 files changed, 480 insertions(+), 2853 deletions(-) delete mode 100644 docs/plan/2026-03-07-financial-sync-refactor.md delete mode 100644 docs/plan/training_module_plan.md diff --git a/docs/plan/2026-03-07-financial-sync-refactor.md b/docs/plan/2026-03-07-financial-sync-refactor.md deleted file mode 100644 index 72c0899..0000000 --- a/docs/plan/2026-03-07-financial-sync-refactor.md +++ /dev/null @@ -1,1490 +0,0 @@ -# 财务数据同步模块重构计划 - -> **目标**: 重构财务数据同步模块,将同步逻辑从调度中心分离到对应的 API 文件中,建立统一的季度同步基类,实现数据差异检测机制。 - -**架构**: 新增 QuarterBasedSync 基类专门处理按季度同步的财务数据,各财务接口(income/balance/cashflow)实现具体的同步子类,调度中心仅负责协调各同步任务的执行顺序。 - -**影响范围**: -- 新建: `src/data/api_wrappers/base_financial_sync.py` (QuarterBasedSync 基类) -- 重构: `src/data/api_wrappers/financial_data/api_income.py` (实现 IncomeQuarterSync) -- 简化: `src/data/api_wrappers/financial_data/api_financial_sync.py` (仅保留调度) -- 新增: `src/data/api_wrappers/financial_data/api_balance.py` (预留资产负债表接口) -- 新增: `src/data/api_wrappers/financial_data/api_cashflow.py` (预留现金流量表接口) - ---- - -## 重构背景 - -### 当前问题 - -1. **职责混淆**: `api_financial_sync.py` 包含完整的同步逻辑(696行),违反了"调度中心只包含调度"的设计原则 -2. **缺乏统一基类**: 财务数据同步未继承任何公共基类,代码风格与 daily/pro_bar 等模块不一致 -3. **缺少差异检测**: 增量同步时未实现本地 vs 远程数据对比,可能导致财务修正数据遗漏 -4. **扩展性差**: 新增资产负债表、现金流量表时需要重复编写相似的同步逻辑 - -### 重构目标 - -1. **建立 QuarterBasedSync 基类**: 专门处理按季度同步的财务数据,支持增量/全量同步 -2. **实现数据差异检测**: 按股票+季度对比本地与远程数据量,识别差异并补充 -3. **采用先删除后插入策略**: 数据不一致时,先删除旧数据再插入新数据,确保数据一致性 -4. **移除"跳过同步"逻辑**: 财务数据必须每次都进行对比更新,不存在"不需要同步"的情况 -5. **支持报表类型过滤**: 通过 `TARGET_REPORT_TYPE` 类属性灵活配置同步的报表类型(默认合并报表) -6. **不设置唯一约束**: 不创建主键和唯一索引,因为财务数据可能发生多次修正(同一股票同一季度多版本) -7. **分离调度与实现**: 调度中心只负责任务协调,具体同步逻辑下沉到各 API 文件 -8. **统一代码风格**: 与 `StockBasedSync`/`DateBasedSync` 保持一致的结构和命名规范 - ---- - -## 任务清单 - -- [ ] Task 1: 创建 `base_financial_sync.py` - QuarterBasedSync 基类(含自动建表逻辑) -- [ ] Task 2: 重构 `api_income.py` - 实现 IncomeQuarterSync 类 -- [ ] Task 3: 重构 `api_financial_sync.py` - 仅保留调度逻辑 -- [ ] Task 4: 验证测试 - 确保重构后同步功能正常 - ---- - -## Task 1: 创建 QuarterBasedSync 基类 - -**文件**: `src/data/api_wrappers/base_financial_sync.py` (新建) - -**目标**: 创建专门用于财务数据季度同步的抽象基类,提供通用的季度计算、数据差异检测、增量/全量同步能力,以及首次同步时的自动建表逻辑。 - -**核心功能**: -1. 季度计算工具方法(当前季度、前一季度、下一季度) -2. 数据差异检测(本地 vs 远程数据对比) -3. 增量同步策略(获取当前季度+前一季度) -4. 表结构和索引管理 -5. **首次同步自动建表**: 当表不存在时自动创建表结构和索引 - -**代码实现**: - -```python -"""财务数据同步基础抽象模块。 - -提供专门用于按季度同步财务数据的基类 QuarterBasedSync。 -财务数据特点: -- 按季度发布(period: 20231231, 20230930, 20230630, 20230331) -- 使用 VIP 接口一次性获取某季度的全部上市公司数据 -- 数据可能会修正,增量同步需获取当前季度+前一季度 -- 主键为 (ts_code, end_date) - -使用方式: - class IncomeQuarterSync(QuarterBasedSync): - table_name = "financial_income" - api_name = "income_vip" - - def fetch_single_quarter(self, period: str) -> pd.DataFrame: - # 实现单季度数据获取 - ... -""" - -from abc import ABC, abstractmethod -from typing import Optional, Dict, List, Tuple, Set -from datetime import datetime -import pandas as pd -from tqdm import tqdm - -from src.data.client import TushareClient -from src.data.storage import ThreadSafeStorage, Storage -from src.data.utils import get_today_date, get_quarters_in_range, DEFAULT_START_DATE - - -class QuarterBasedSync(ABC): - """财务数据季度同步抽象基类。 - - 专门处理按季度同步的财务数据(利润表、资产负债表、现金流量表)。 - 财务数据同步特点: - 1. 按季度获取:使用 VIP 接口一次性获取某季度全部上市公司数据 - 2. 数据可修正:同一季度数据可能被更新,增量同步需获取当前季度+前一季度 - 3. 差异检测:需对比本地与远程数据量,识别缺失或变更的记录 - 4. 主键:(ts_code, end_date) - - 子类必须实现: - - table_name: 类属性,目标表名 - - api_name: 类属性,Tushare API 接口名 - - fetch_single_quarter(period) -> pd.DataFrame: 获取单季度数据 - - TABLE_SCHEMA: 类属性,表结构定义 - - Attributes: - table_name: 目标表名(子类必须覆盖) - api_name: Tushare API 接口名(子类必须覆盖) - DEFAULT_START_DATE: 默认起始日期(2018Q1) - TABLE_SCHEMA: 表结构定义 {列名: SQL类型} - TABLE_INDEXES: 索引定义 [(索引名, [列名列表]), ...] - TABLE_INDEXES: 索引定义 [(索引名, [列名列表]), ...] - 注意:不要创建唯一索引,因为财务数据可能发生多次修正 - """ - - table_name: str = "" # 子类必须覆盖 - api_name: str = "" # 子类必须覆盖 - DEFAULT_START_DATE = "20180331" # 2018年Q1 - - # 目标报表类型(子类可覆盖) - # 默认只同步合并报表(report_type='1') - # 设为 None 则同步所有报表类型 - TARGET_REPORT_TYPE: Optional[str] = "1" - - # 表结构定义(子类必须覆盖) - TABLE_SCHEMA: Dict[str, str] = {} - - # 索引定义(子类可覆盖) - # 格式: [("index_name", ["col1", "col2"]), ...] - # 注意:不要创建唯一索引,因为财务数据可能发生多次修正 - TABLE_INDEXES: List[Tuple[str, List[str]]] = [] - - def __init__(self): - """初始化季度同步管理器。""" - self.storage = ThreadSafeStorage() - self.client = TushareClient() - self._cached_data: Optional[pd.DataFrame] = None - - # ====================================================================== - # 抽象方法 - 子类必须实现 - # ====================================================================== - - @abstractmethod - def fetch_single_quarter(self, period: str) -> pd.DataFrame: - """获取单季度的全部上市公司数据。 - - Args: - period: 报告期,季度最后一天日期(如 '20231231') - - Returns: - 包含该季度全部上市公司财务数据的 DataFrame - """ - pass - - # ====================================================================== - # 季度计算工具方法 - # ====================================================================== - - def get_current_quarter(self) -> str: - """获取当前季度(考虑是否到季末)。 - - 如果当前日期未到季度最后一天,则返回前一季度。 - 这样可以避免获取尚无数据的未来季度。 - - Returns: - 当前季度字符串 (YYYYMMDD),如 '20231231' - """ - today = get_today_date() - year = int(today[:4]) - month = int(today[4:6]) - - # 确定当前季度 - if month <= 3: - current_q = f"{year}0331" - elif month <= 6: - current_q = f"{year}0630" - elif month <= 9: - current_q = f"{year}0930" - else: - current_q = f"{year}1231" - - # 如果今天还没到季末,返回前一季度 - if today < current_q: - return self.get_prev_quarter(current_q) - - return current_q - - def get_prev_quarter(self, quarter: str) -> str: - """获取前一季度。 - - Args: - quarter: 季度字符串 (YYYYMMDD),如 '20231231' - - Returns: - 前一季度字符串 (YYYYMMDD) - """ - year = int(quarter[:4]) - month_day = quarter[4:] - - if month_day == "0331": - return f"{year - 1}1231" - elif month_day == "0630": - return f"{year}0331" - elif month_day == "0930": - return f"{year}0630" - else: # "1231" - return f"{year}0930" - - def get_next_quarter(self, quarter: str) -> str: - """获取下一季度。 - - Args: - quarter: 季度字符串 (YYYYMMDD) - - Returns: - 下一季度字符串 (YYYYMMDD) - """ - year = int(quarter[:4]) - month_day = quarter[4:] - - if month_day == "0331": - return f"{year}0630" - elif month_day == "0630": - return f"{year}0930" - elif month_day == "0930": - return f"{year}1231" - else: # "1231" - return f"{year + 1}0331" - - # ====================================================================== - # 表结构管理 - # ====================================================================== - - def ensure_table_exists(self) -> None: - """确保表结构存在,如不存在则创建表和索引。 - - 注意:不设置主键和唯一索引,因为财务数据可能发生多次修正, - 同一支股票在同一季度可能有多个版本(不同的ann_date)。 - DuckDB 会自动创建 rowid 作为主键。 - """ - storage = Storage() - - if storage.exists(self.table_name): - return - - if not self.TABLE_SCHEMA: - print(f"[{self.__class__.__name__}] TABLE_SCHEMA not defined, skipping table creation") - return - - # 构建列定义(不设置主键) - columns_def = [] - for col_name, col_type in self.TABLE_SCHEMA.items(): - columns_def.append(f'"{col_name}" {col_type}') - - columns_sql = ", ".join(columns_def) - create_sql = f'CREATE TABLE IF NOT EXISTS "{self.table_name}" ({columns_sql})' - - try: - storage._connection.execute(create_sql) - print(f"[{self.__class__.__name__}] Created table '{self.table_name}'") - except Exception as e: - print(f"[{self.__class__.__name__}] Error creating table: {e}") - raise - - # 创建普通索引(不要创建唯一索引) - for idx_name, idx_cols in self.TABLE_INDEXES: - try: - idx_cols_sql = ", ".join(f'"{col}"' for col in idx_cols) - storage._connection.execute( - f'CREATE INDEX IF NOT EXISTS "{idx_name}" ON "{self.table_name}"({idx_cols_sql})' - ) - print(f"[{self.__class__.__name__}] Created index '{idx_name}' on {idx_cols}") - except Exception as e: - print(f"[{self.__class__.__name__}] Error creating index {idx_name}: {e}") - - # ====================================================================== - # 数据差异检测(核心逻辑) - # ====================================================================== - - def get_local_data_count_by_stock( - self, period: str - ) -> Dict[str, int]: - """获取本地数据库中某季度的各股票数据量。 - - Args: - period: 季度字符串 (YYYYMMDD) - - Returns: - 字典 {ts_code: 记录数} - """ - storage = Storage() - - try: - query = f''' - SELECT ts_code, COUNT(*) as cnt - FROM "{self.table_name}" - WHERE end_date = ? - GROUP BY ts_code - ''' - result = storage._connection.execute(query, [period]).fetchdf() - - if result.empty: - return {} - - return dict(zip(result['ts_code'], result['cnt'])) - except Exception as e: - print(f"[{self.__class__.__name__}] Error querying local data count: {e}") - return {} - - def get_local_records_by_key( - self, period: str - ) -> Dict[tuple, int]: - """获取本地数据库中某季度的记录(按主键分组计数)。 - - 用于更精确的差异检测,按 (ts_code, end_date, report_type) 分组。 - - Args: - period: 季度字符串 (YYYYMMDD) - - Returns: - 字典 {(ts_code, end_date, report_type): 记录数} - """ - storage = Storage() - - try: - query = f''' - SELECT ts_code, end_date, report_type, COUNT(*) as cnt - FROM "{self.table_name}" - WHERE end_date = ? - GROUP BY ts_code, end_date, report_type - ''' - result = storage._connection.execute(query, [period]).fetchdf() - - if result.empty: - return {} - - return { - (row['ts_code'], row['end_date'], row['report_type']): row['cnt'] - for _, row in result.iterrows() - } - except Exception as e: - print(f"[{self.__class__.__name__}] Error querying local records: {e}") - return {} - - def compare_and_find_differences( - self, - remote_df: pd.DataFrame, - period: str - ) -> Tuple[pd.DataFrame, pd.DataFrame]: - """对比远程数据与本地数据,找出差异。 - - 逻辑: - 1. 统计远程数据中每只股票的数据量 - 2. 查询本地数据库中该季度每只股票的数据量 - 3. 对比找出: - - 本地缺失的股票(新增) - - 数据量不一致的股票(有更新,可能包含财务修正) - 4. 返回需要插入的差异数据 - - 注意:主键为 (ts_code, end_date, report_type),因此同一支股票在同一季度 - 可能有多个 report_type 的记录。差异检测按股票级别进行,如果该股票的 - 记录总数不一致,则更新该股票的所有记录。 - - Args: - remote_df: 从 API 获取的远程数据 - period: 季度字符串 - - Returns: - (差异数据DataFrame, 统计信息DataFrame) - 统计信息包含:ts_code, remote_count, local_count, status - """ - if remote_df.empty: - return pd.DataFrame(), pd.DataFrame() - - # 1. 统计远程数据中每只股票的数据量 - remote_counts = remote_df.groupby('ts_code').size().to_dict() - - # 2. 获取本地数据量(按股票汇总) - local_counts = self.get_local_data_count_by_stock(period) - - # 3. 对比找出差异 - diff_stocks = [] # 需要更新的股票列表 - stats = [] - - for ts_code, remote_count in remote_counts.items(): - local_count = local_counts.get(ts_code, 0) - - if local_count == 0: - status = "new" # 本地不存在,全部插入 - diff_stocks.append(ts_code) - elif local_count != remote_count: - status = "modified" # 数据量不一致,可能包含财务修正 - diff_stocks.append(ts_code) - else: - status = "same" # 数据量一致,跳过 - - stats.append({ - 'ts_code': ts_code, - 'remote_count': remote_count, - 'local_count': local_count, - 'status': status - }) - - # 4. 提取差异数据 - if diff_stocks: - diff_df = remote_df[remote_df['ts_code'].isin(diff_stocks)].copy() - else: - diff_df = pd.DataFrame() - - stats_df = pd.DataFrame(stats) - - return diff_df, stats_df - - # ====================================================================== - # 同步核心逻辑 - # ====================================================================== - - def delete_stock_quarter_data( - self, - period: str, - ts_codes: Optional[List[str]] = None - ) -> int: - """删除指定季度和股票的数据。 - - 在同步前删除旧数据,然后插入新数据(先删除后插入策略)。 - - Args: - period: 季度字符串 (YYYYMMDD) - ts_codes: 股票代码列表,None 表示删除该季度所有数据 - - Returns: - 删除的记录数 - """ - storage = Storage() - - try: - if ts_codes: - # 删除指定股票的数据 - placeholders = ', '.join(['?' for _ in ts_codes]) - query = f''' - DELETE FROM "{self.table_name}" - WHERE end_date = ? AND ts_code IN ({placeholders}) - ''' - result = storage._connection.execute(query, [period] + ts_codes) - else: - # 删除整个季度的数据 - query = f'DELETE FROM "{self.table_name}" WHERE end_date = ?' - result = storage._connection.execute(query, [period]) - - deleted_count = result.rowcount if hasattr(result, 'rowcount') else 0 - return deleted_count - except Exception as e: - print(f"[{self.__class__.__name__}] Error deleting data: {e}") - return 0 - - def sync_quarter( - self, - period: str, - dry_run: bool = False - ) -> Dict: - """同步单个季度的数据。 - - 流程: - 1. 获取远程数据 - 2. 根据 TARGET_REPORT_TYPE 过滤报表类型 - 3. 对比本地数据,找出差异股票 - 4. 删除差异股票的旧数据 - 5. 插入新数据(先删除后插入) - - 注意:财务数据同步必须取当前季度和前一季度进行对比更新, - 不存在"不需要同步"的情况。 - - Args: - period: 季度字符串 (YYYYMMDD) - dry_run: 是否为预览模式 - - Returns: - 同步结果字典 { - 'period': 季度, - 'remote_total': 远程总记录数, - 'diff_count': 差异记录数, - 'deleted_count': 删除的记录数, - 'inserted_count': 插入的记录数, - 'dry_run': 是否预览模式 - } - """ - print(f"[{self.__class__.__name__}] Syncing quarter {period}...") - - # 1. 获取远程数据 - remote_df = self.fetch_single_quarter(period) - - if remote_df.empty: - print(f"[{self.__class__.__name__}] No data for quarter {period}") - return { - 'period': period, - 'remote_total': 0, - 'diff_count': 0, - 'deleted_count': 0, - 'inserted_count': 0, - 'dry_run': dry_run - } - - # 2. 根据 TARGET_REPORT_TYPE 过滤报表类型 - if self.TARGET_REPORT_TYPE and 'report_type' in remote_df.columns: - remote_df = remote_df[remote_df['report_type'] == self.TARGET_REPORT_TYPE] - - remote_total = len(remote_df) - print(f"[{self.__class__.__name__}] Fetched {remote_total} records from API") - - # 3. 对比找出差异股票 - diff_df, stats_df = self.compare_and_find_differences(remote_df, period) - - diff_stocks = list(diff_df['ts_code'].unique()) if not diff_df.empty else [] - unchanged_count = len(stats_df[stats_df['status'] == 'same']) if not stats_df.empty else 0 - - print(f"[{self.__class__.__name__}] Comparison result:") - print(f" - Stocks with differences: {len(diff_stocks)}") - print(f" - Unchanged stocks: {unchanged_count}") - - # 4. 执行同步(先删除后插入) - deleted_count = 0 - inserted_count = 0 - - if not dry_run and not diff_df.empty: - # 4.1 删除差异股票的旧数据 - deleted_count = self.delete_stock_quarter_data(period, diff_stocks) - print(f"[{self.__class__.__name__}] Deleted {deleted_count} old records") - - # 4.2 插入新数据 - self.storage.queue_save(self.table_name, diff_df) - self.storage.flush() - inserted_count = len(diff_df) - print(f"[{self.__class__.__name__}] Inserted {inserted_count} new records") - - return { - 'period': period, - 'remote_total': remote_total, - 'diff_count': len(diff_df), - 'deleted_count': deleted_count, - 'inserted_count': inserted_count, - 'dry_run': dry_run - } - - def sync_range( - self, - start_quarter: str, - end_quarter: str, - dry_run: bool = False - ) -> List[Dict]: - """同步指定季度范围的数据。 - - 注意:增量同步会自动包含前一季度以确保数据完整性。 - - Args: - start_quarter: 起始季度 (YYYYMMDD) - end_quarter: 结束季度 (YYYYMMDD) - dry_run: 是否为预览模式 - - Returns: - 各季度同步结果列表 - """ - quarters = get_quarters_in_range(start_quarter, end_quarter) - - if not quarters: - print(f"[{self.__class__.__name__}] No quarters to sync") - return [] - - print(f"[{self.__class__.__name__}] Syncing {len(quarters)} quarters: {quarters}") - - results = [] - for period in tqdm(quarters, desc=f"Syncing {self.table_name}"): - try: - result = self.sync_quarter(period, dry_run=dry_run) - results.append(result) - except Exception as e: - print(f"[{self.__class__.__name__}] Error syncing {period}: {e}") - results.append({ - 'period': period, - 'error': str(e) - }) - - return results - - def sync_incremental( - self, - dry_run: bool = False - ) -> List[Dict]: - """执行增量同步。 - - 策略: - 1. 确保表存在(首次同步时自动建表) - 2. 获取表中最新季度 - 3. 计算当前季度(考虑是否到季末) - 4. 确定同步范围:从最新季度到当前季度 - 5. **重要**:额外包含前一季度以确保数据完整性 - - 注意:财务数据同步与日线数据不同,必须每次都获取数据进行对比 - 更新,不存在"不需要同步"的情况。因为财务数据可能会被修正。 - - Args: - dry_run: 是否为预览模式 - - Returns: - 各季度同步结果列表 - """ - print(f"\n{'='*60}") - print(f"[{self.__class__.__name__}] Incremental Sync") - print(f"{'='*60}") - - # 0. 确保表存在(首次同步时自动建表) - self.ensure_table_exists() - - # 1. 获取最新季度 - storage = Storage() - try: - result = storage._connection.execute( - f'SELECT MAX(end_date) FROM "{self.table_name}"' - ).fetchone() - latest_quarter = result[0] if result and result[0] else None - if hasattr(latest_quarter, 'strftime'): - latest_quarter = latest_quarter.strftime('%Y%m%d') - except Exception as e: - print(f"[{self.__class__.__name__}] Error getting latest quarter: {e}") - latest_quarter = None - - # 2. 获取当前季度 - current_quarter = self.get_current_quarter() - - if latest_quarter is None: - # 无本地数据,执行全量同步 - print(f"[{self.__class__.__name__}] No local data, performing full sync") - return self.sync_range(self.DEFAULT_START_DATE, current_quarter, dry_run) - - print(f"[{self.__class__.__name__}] Latest local quarter: {latest_quarter}") - print(f"[{self.__class__.__name__}] Current quarter: {current_quarter}") - - # 3. 确定同步范围 - # 财务数据必须每次都进行对比更新,不存在"跳过"的情况 - # 同步范围:从最新季度到当前季度(包含前一季度以确保数据完整性) - start_quarter = latest_quarter - if start_quarter > current_quarter: - # 如果本地数据比当前季度还新,仍然需要同步(可能包含修正数据) - start_quarter = current_quarter - else: - # 正常情况:包含前一季度 - start_quarter = self.get_prev_quarter(latest_quarter) - - if start_quarter < self.DEFAULT_START_DATE: - start_quarter = self.DEFAULT_START_DATE - - print(f"[{self.__class__.__name__}] Sync range: {start_quarter} -> {current_quarter}") - print(f" (includes previous quarter for data integrity)") - - return self.sync_range(start_quarter, current_quarter, dry_run) - - def sync_full( - self, - dry_run: bool = False - ) -> List[Dict]: - """执行全量同步。 - - Args: - dry_run: 是否为预览模式 - - Returns: - 各季度同步结果列表 - """ - print(f"\n{'='*60}") - print(f"[{self.__class__.__name__}] Full Sync") - print(f"{'='*60}") - - # 确保表存在 - self.ensure_table_exists() - - current_quarter = self.get_current_quarter() - - return self.sync_range(self.DEFAULT_START_DATE, current_quarter, dry_run) - - # ====================================================================== - # 预览模式 - # ====================================================================== - - def preview_sync(self) -> Dict: - """预览同步信息(不实际同步)。 - - 注意:财务数据同步必须每次都进行,因为数据可能会被修正。 - 预览显示将要同步的季度范围。 - - Returns: - 预览信息字典 - """ - print(f"\n{'='*60}") - print(f"[{self.__class__.__name__}] Preview Mode") - print(f"{'='*60}") - - # 获取最新季度 - storage = Storage() - try: - result = storage._connection.execute( - f'SELECT MAX(end_date) FROM "{self.table_name}"' - ).fetchone() - latest_quarter = result[0] if result and result[0] else None - if hasattr(latest_quarter, 'strftime'): - latest_quarter = latest_quarter.strftime('%Y%m%d') - except Exception: - latest_quarter = None - - current_quarter = self.get_current_quarter() - - if latest_quarter is None: - # 无本地数据,需要全量同步 - start_quarter = self.DEFAULT_START_DATE - message = "No local data, full sync required" - else: - # 财务数据必须每次都进行对比更新 - # 同步范围:从最新季度到当前季度(包含前一季度) - start_quarter = self.get_prev_quarter(latest_quarter) - if start_quarter < self.DEFAULT_START_DATE: - start_quarter = self.DEFAULT_START_DATE - message = f"Incremental sync from {start_quarter} to {current_quarter}" - - preview = { - 'table_name': self.table_name, - 'api_name': self.api_name, - 'latest_quarter': latest_quarter, - 'current_quarter': current_quarter, - 'start_quarter': start_quarter, - 'end_quarter': current_quarter, - 'message': message - } - - print(f"Table: {self.table_name}") - print(f"API: {self.api_name}") - print(f"Latest local: {latest_quarter}") - print(f"Current quarter: {current_quarter}") - print(f"Sync range: {start_quarter} -> {current_quarter}") - print(f"Message: {message}") - print(f"{'='*60}") - - return preview - - -# ====================================================================== -# 便捷函数 -# ====================================================================== - -def sync_financial_data( - syncer_class: type, - force_full: bool = False, - dry_run: bool = False -) -> List[Dict]: - """通用的财务数据同步便捷函数。 - - Args: - syncer_class: QuarterBasedSync 的子类 - force_full: 是否强制全量同步 - dry_run: 是否为预览模式 - - Returns: - 同步结果列表 - """ - syncer = syncer_class() - - if force_full: - return syncer.sync_full(dry_run) - else: - return syncer.sync_incremental(dry_run) - - -def preview_financial_sync(syncer_class: type) -> Dict: - """预览财务数据同步信息。 - - Args: - syncer_class: QuarterBasedSync 的子类 - - Returns: - 预览信息字典 - """ - syncer = syncer_class() - return syncer.preview_sync() -``` - -**验证步骤:** -1. 检查文件是否正确创建 -2. 确认所有抽象方法已定义 -3. 验证类型提示完整 -4. 确认与现有 `base_sync.py` 风格一致 - ---- - -## Task 2: 重构 `api_income.py` - -**文件**: `src/data/api_wrappers/financial_data/api_income.py` (重写) - -**目标**: 重写为基于 `QuarterBasedSync` 的实现,移除旧的 `IncomeSync` 类。 - -**代码实现**: - -```python -"""利润表数据接口 (VIP 版本) - -使用 Tushare VIP 接口 (income_vip) 获取利润表数据。 -按季度同步,一次请求获取一个季度的全部上市公司数据。 - -接口说明: -- income_vip: 获取某一季度全部上市公司利润表数据 -- 需要 5000 积分才能调用 -- period 参数为报告期(季度最后一天,如 20231231) - -使用方式: - # 同步利润表数据 - from src.data.api_wrappers.financial_data.api_income import IncomeQuarterSync, sync_income - - # 方式1: 使用类 - syncer = IncomeQuarterSync() - syncer.sync_incremental() # 增量同步 - syncer.sync_full() # 全量同步 - - # 方式2: 使用便捷函数 - sync_income() # 增量同步 - sync_income(force_full=True) # 全量同步 -""" - -from typing import Optional -import pandas as pd - -from src.data.client import TushareClient -from src.data.api_wrappers.base_financial_sync import QuarterBasedSync, sync_financial_data, preview_financial_sync - - -class IncomeQuarterSync(QuarterBasedSync): - """利润表季度同步实现。 - - 使用 income_vip 接口按季度获取全部上市公司利润表数据。 - - 表结构: financial_income - 主键: (ts_code, end_date) - """ - - table_name = "financial_income" - api_name = "income_vip" - - # 目标报表类型:默认只同步合并报表 - TARGET_REPORT_TYPE = "1" - - # 表结构定义 - TABLE_SCHEMA = { - "ts_code": "VARCHAR(16) NOT NULL", - "ann_date": "DATE", - "f_ann_date": "DATE", - "end_date": "DATE NOT NULL", - "report_type": "INTEGER", - "comp_type": "INTEGER", - "end_type": "VARCHAR(10)", - "basic_eps": "DOUBLE", - "diluted_eps": "DOUBLE", - "total_revenue": "DOUBLE", - "revenue": "DOUBLE", - "int_income": "DOUBLE", - "prem_earned": "DOUBLE", - "comm_income": "DOUBLE", - "n_commis_income": "DOUBLE", - "n_oth_income": "DOUBLE", - "n_oth_b_income": "DOUBLE", - "prem_income": "DOUBLE", - "out_prem": "DOUBLE", - "une_prem_reser": "DOUBLE", - "reins_income": "DOUBLE", - "n_sec_tb_income": "DOUBLE", - "n_sec_uw_income": "DOUBLE", - "n_asset_mg_income": "DOUBLE", - "oth_b_income": "DOUBLE", - "fv_value_chg_gain": "DOUBLE", - "invest_income": "DOUBLE", - "ass_invest_income": "DOUBLE", - "forex_gain": "DOUBLE", - "total_cogs": "DOUBLE", - "oper_cost": "DOUBLE", - "int_exp": "DOUBLE", - "comm_exp": "DOUBLE", - "biz_tax_surchg": "DOUBLE", - "sell_exp": "DOUBLE", - "admin_exp": "DOUBLE", - "fin_exp": "DOUBLE", - "assets_impair_loss": "DOUBLE", - "prem_refund": "DOUBLE", - "compens_payout": "DOUBLE", - "reser_insur_liab": "DOUBLE", - "div_payt": "DOUBLE", - "reins_exp": "DOUBLE", - "oper_exp": "DOUBLE", - "compens_payout_refu": "DOUBLE", - "insur_reser_refu": "DOUBLE", - "reins_cost_refund": "DOUBLE", - "other_bus_cost": "DOUBLE", - "operate_profit": "DOUBLE", - "non_oper_income": "DOUBLE", - "non_oper_exp": "DOUBLE", - "nca_disploss": "DOUBLE", - "total_profit": "DOUBLE", - "income_tax": "DOUBLE", - "n_income": "DOUBLE", - "n_income_attr_p": "DOUBLE", - "minority_gain": "DOUBLE", - "oth_compr_income": "DOUBLE", - "t_compr_income": "DOUBLE", - "compr_inc_attr_p": "DOUBLE", - "compr_inc_attr_m_s": "DOUBLE", - "ebit": "DOUBLE", - "ebitda": "DOUBLE", - "insurance_exp": "DOUBLE", - "undist_profit": "DOUBLE", - "distable_profit": "DOUBLE", - "rd_exp": "DOUBLE", - "fin_exp_int_exp": "DOUBLE", - "fin_exp_int_inc": "DOUBLE", - "transfer_surplus_rese": "DOUBLE", - "transfer_housing_imprest": "DOUBLE", - "transfer_oth": "DOUBLE", - "adj_lossgain": "DOUBLE", - "withdra_legal_surplus": "DOUBLE", - "withdra_legal_pubfund": "DOUBLE", - "withdra_biz_devfund": "DOUBLE", - "withdra_rese_fund": "DOUBLE", - "withdra_oth_ersu": "DOUBLE", - "workers_welfare": "DOUBLE", - "distr_profit_shrhder": "DOUBLE", - "prfshare_payable_dvd": "DOUBLE", - "comshare_payable_dvd": "DOUBLE", - "capit_comstock_div": "DOUBLE", - "net_after_nr_lp_correct": "DOUBLE", - "credit_impa_loss": "DOUBLE", - "net_expo_hedging_benefits": "DOUBLE", - "oth_impair_loss_assets": "DOUBLE", - "total_opcost": "DOUBLE", - "amodcost_fin_assets": "DOUBLE", - "oth_income": "DOUBLE", - "asset_disp_income": "DOUBLE", - "continued_net_profit": "DOUBLE", - "end_net_profit": "DOUBLE", - "update_flag": "VARCHAR(1)", - } - - # 索引定义(不要创建唯一索引) - # 注意:财务数据可能发生多次修正,不设置主键和唯一索引 - TABLE_INDEXES = [ - ("idx_financial_income_ts_code", ["ts_code"]), - ("idx_financial_income_end_date", ["end_date"]), - ("idx_financial_income_ts_period", ["ts_code", "end_date", "report_type"]), - ] - - def __init__(self): - """初始化利润表同步器。""" - super().__init__() - self._fields = None # 默认返回全部字段 - - def fetch_single_quarter(self, period: str) -> pd.DataFrame: - """获取单季度的全部上市公司利润表数据。 - - Args: - period: 报告期,季度最后一天日期(如 '20231231') - - Returns: - 包含该季度全部上市公司利润表数据的 DataFrame - """ - params = {"period": period} - - if self._fields: - params["fields"] = self._fields - - return self.client.query(self.api_name, **params) - - -# ============================================================================= -# 便捷函数 -# ============================================================================= - - -def sync_income( - force_full: bool = False, - dry_run: bool = False, -) -> list: - """同步利润表数据(便捷函数)。 - - Args: - force_full: 若为 True,强制全量同步 - dry_run: 若为 True,仅预览不写入 - - Returns: - 同步结果列表 - - Example: - >>> # 增量同步 - >>> sync_income() - >>> - >>> # 全量同步 - >>> sync_income(force_full=True) - >>> - >>> # 预览 - >>> sync_income(dry_run=True) - """ - return sync_financial_data(IncomeQuarterSync, force_full, dry_run) - - -def preview_income_sync() -> dict: - """预览利润表同步信息。 - - Returns: - 预览信息字典 - """ - return preview_financial_sync(IncomeQuarterSync) - - -def get_income(period: str, fields: Optional[str] = None) -> pd.DataFrame: - """获取利润表数据(原始接口,单季度)。 - - 用于直接获取某个季度的数据,不进行同步管理。 - - Args: - period: 报告期,季度最后一天日期(如 '20231231') - fields: 指定返回字段,默认返回全部字段 - - Returns: - 包含利润表数据的 DataFrame - """ - client = TushareClient() - - if fields is None: - fields = ( - "ts_code,ann_date,f_ann_date,end_date,report_type,comp_type,end_type," - "basic_eps,diluted_eps,total_revenue,revenue,int_income,prem_earned," - "comm_income,n_commis_income,n_oth_income,n_oth_b_income,prem_income," - "out_prem,une_prem_reser,reins_income,n_sec_tb_income,n_sec_uw_income," - "n_asset_mg_income,oth_b_income,fv_value_chg_gain,invest_income," - "ass_invest_income,forex_gain,total_cogs,oper_cost,int_exp,comm_exp," - "biz_tax_surchg,sell_exp,admin_exp,fin_exp,assets_impair_loss,prem_refund," - "compens_payout,reser_insur_liab,div_payt,reins_exp,oper_exp," - "compens_payout_refu,insur_reser_refu,reins_cost_refund,other_bus_cost," - "operate_profit,non_oper_income,non_oper_exp,nca_disploss,total_profit," - "income_tax,n_income,n_income_attr_p,minority_gain,oth_compr_income," - "t_compr_income,compr_inc_attr_p,compr_inc_attr_m_s,ebit,ebitda," - "insurance_exp,undist_profit,distable_profit,rd_exp,fin_exp_int_exp," - "fin_exp_int_inc,transfer_surplus_rese,transfer_housing_imprest," - "transfer_oth,adj_lossgain,withdra_legal_surplus,withdra_legal_pubfund," - "withdra_biz_devfund,withdra_rese_fund,withdra_oth_ersu,workers_welfare," - "distr_profit_shrhder,prfshare_payable_dvd,comshare_payable_dvd," - "capit_comstock_div,net_after_nr_lp_correct,credit_impa_loss," - "net_expo_hedging_benefits,oth_impair_loss_assets,total_opcost," - "amodcost_fin_assets,oth_income,asset_disp_income,continued_net_profit," - "end_net_profit,update_flag" - ) - - return client.query("income_vip", period=period, fields=fields) -``` - -**变更说明:** -1. 新增 `IncomeQuarterSync` 类继承 `QuarterBasedSync` -2. 定义 `TARGET_REPORT_TYPE = "1"` 只同步合并报表 -3. 定义表结构 `TABLE_SCHEMA`、普通索引 `TABLE_INDEXES` 支持自动建表 -4. 保留 `get_income()` 函数作为原始数据获取接口 -5. 移除旧的 `IncomeSync` 类 -6. 添加便捷函数 `sync_income()` 和 `preview_income_sync()` - -**重要说明:** -- **不设置主键和唯一索引**:财务数据可能发生多次修正,同一支股票同一季度可能有多个版本(不同 ann_date)。使用"先删除后插入"策略,避免主键冲突 -- 数据更新采用"先删除后插入"策略,确保数据一致性 -- `TARGET_REPORT_TYPE` 可覆盖以同步其他报表类型 - -**验证步骤:** -1. 确认文件可以被正确导入 -2. 检查类型提示完整 -3. 验证表结构与旧版本一致 - ---- - -## Task 3: 重构 `api_financial_sync.py` - -**文件**: `src/data/api_wrappers/financial_data/api_financial_sync.py` (重写) - -**目标**: 简化调度中心,只保留调度逻辑,移除具体同步实现。 - -**代码实现**: - -```python -"""财务数据统一同步调度中心。 - -该模块作为财务数据同步的调度中心,只负责任务协调和调度。 -具体的同步逻辑已下沉到各 API 文件中。 - -支持的财务数据类型: -- income: 利润表 (已实现) -- balance: 资产负债表 (预留) -- cashflow: 现金流量表 (预留) - -使用方式: - # 同步所有财务数据(增量) - from src.data.api_wrappers.financial_data.api_financial_sync import sync_financial - sync_financial() - - # 全量同步 - sync_financial(force_full=True) - - # 只同步利润表 - sync_financial(data_types=["income"]) - - # 预览同步 - from src.data.api_wrappers.financial_data.api_financial_sync import preview_sync - preview = preview_sync() -""" - -from typing import List, Dict, Optional - -from src.data.api_wrappers.financial_data.api_income import ( - IncomeQuarterSync, - sync_income, - preview_income_sync, -) - - -# 支持的财务数据类型映射 -FINANCIAL_SYNCERS = { - "income": { - "syncer_class": IncomeQuarterSync, - "sync_func": sync_income, - "preview_func": preview_income_sync, - "display_name": "利润表", - }, - # 预留:资产负债表 - # "balance": { - # "syncer_class": BalanceQuarterSync, - # "sync_func": sync_balance, - # "preview_func": preview_balance_sync, - # "display_name": "资产负债表", - # }, - # 预留:现金流量表 - # "cashflow": { - # "syncer_class": CashflowQuarterSync, - # "sync_func": sync_cashflow, - # "preview_func": preview_cashflow_sync, - # "display_name": "现金流量表", - # }, -} - - -def sync_financial( - data_types: Optional[List[str]] = None, - force_full: bool = False, - dry_run: bool = False, -) -> Dict[str, List]: - """同步财务数据(调度函数)。 - - 根据指定的数据类型,调度对应的同步器执行同步。 - - Args: - data_types: 数据类型列表,如 ["income", "balance"] - None 表示同步所有类型 - force_full: 若为 True,强制全量同步 - dry_run: 若为 True,仅预览不写入 - - Returns: - 各类型同步结果字典 {数据类型: 同步结果列表} - - Example: - >>> # 同步所有财务数据 - >>> sync_financial() - >>> - >>> # 只同步利润表 - >>> sync_financial(data_types=["income"]) - >>> - >>> # 全量同步 - >>> sync_financial(force_full=True) - """ - if data_types is None: - data_types = list(FINANCIAL_SYNCERS.keys()) - - results = {} - - print("\n" + "=" * 60) - print("[Financial Sync] 财务数据同步调度中心") - print("=" * 60) - print(f"数据类型: {', '.join(data_types)}") - print(f"同步模式: {'全量' if force_full else '增量'}") - print(f"写入模式: {'预览' if dry_run else '实际写入'}") - print("=" * 60) - - for data_type in data_types: - if data_type not in FINANCIAL_SYNCERS: - print(f"[WARN] 未知的数据类型: {data_type}") - results[data_type] = {"error": f"Unknown data type: {data_type}"} - continue - - config = FINANCIAL_SYNCERS[data_type] - sync_func = config["sync_func"] - display_name = config["display_name"] - - print(f"\n[{display_name}] 开始同步...") - - try: - result = sync_func(force_full=force_full, dry_run=dry_run) - results[data_type] = result - print(f"[{display_name}] 同步完成") - except Exception as e: - print(f"[ERROR] [{display_name}] 同步失败: {e}") - results[data_type] = {"error": str(e)} - - # 打印汇总 - print("\n" + "=" * 60) - print("[Financial Sync] 同步汇总") - print("=" * 60) - for data_type, result in results.items(): - if "error" in result: - status = f"失败: {result['error']}" - elif isinstance(result, list): - total_records = sum(r.get('diff_count', 0) for r in result if isinstance(r, dict)) - status = f"成功 ({len(result)} 个季度, {total_records} 条差异)" - else: - status = "完成" - - display_name = FINANCIAL_SYNCERS.get(data_type, {}).get("display_name", data_type) - print(f" {display_name}: {status}") - print("=" * 60) - - return results - - -def preview_sync(data_types: Optional[List[str]] = None) -> Dict[str, Dict]: - """预览财务数据同步信息。 - - Args: - data_types: 数据类型列表,None 表示所有类型 - - Returns: - 各类型预览信息字典 - - Example: - >>> preview = preview_sync() - >>> print(preview) - """ - if data_types is None: - data_types = list(FINANCIAL_SYNCERS.keys()) - - previews = {} - - print("\n" + "=" * 60) - print("[Financial Sync] 同步预览") - print("=" * 60) - - for data_type in data_types: - if data_type not in FINANCIAL_SYNCERS: - continue - - preview_func = FINANCIAL_SYNCERS[data_type]["preview_func"] - previews[data_type] = preview_func() - - return previews - - -def list_financial_types() -> List[Dict]: - """列出所有支持的财务数据类型。 - - Returns: - 数据类型信息列表 - """ - return [ - { - "name": name, - "display_name": config["display_name"], - } - for name, config in FINANCIAL_SYNCERS.items() - ] - - -# 保持向后兼容的别名 -sync_all_financial = sync_financial - - -if __name__ == "__main__": - import sys - - print("=" * 60) - print("财务数据同步调度中心") - print("=" * 60) - print("\n支持的财务数据类型:") - print("-" * 60) - - for info in list_financial_types(): - print(f" - {info['name']}: {info['display_name']}") - - print("-" * 60) - print("\n使用方式:") - print(" # 同步所有财务数据") - print(" sync_financial()") - print("") - print(" # 同步指定类型") - print(' sync_financial(data_types=["income"])') - print("") - print(" # 全量同步") - print(" sync_financial(force_full=True)") - print("") - print(" # 预览") - print(" preview_sync()") - print("=" * 60) - - # 默认执行预览 - if len(sys.argv) > 1 and sys.argv[1] == "--sync": - print("\n执行同步...") - force_full = "--full" in sys.argv - sync_financial(force_full=force_full) - else: - print("\n执行预览...") - preview_sync() -``` - -**变更说明:** -1. 完全移除 `FinancialSync` 类及其 600+ 行代码 -2. 引入 `FINANCIAL_SYNCERS` 注册表模式 -3. 调度函数 `sync_financial()` 和 `preview_sync()` 仅做任务分发 -4. 保持向后兼容(`sync_all_financial` 别名) - -**验证步骤:** -1. 确认旧接口 `sync_financial()` 仍可正常工作 -2. 检查预览功能正常 -3. 验证导入路径兼容 - ---- - -## Task 4: 验证测试 - -**目标**: 确保重构后的财务数据同步功能正常。 - -### 测试步骤 - -**Step 1: 导入测试** - -```python -# 验证所有模块可以正确导入 -from src.data.api_wrappers.base_financial_sync import QuarterBasedSync -from src.data.api_wrappers.financial_data.api_income import ( - IncomeQuarterSync, - sync_income, - preview_income_sync, - get_income -) -from src.data.api_wrappers.financial_data.api_financial_sync import ( - sync_financial, - preview_sync, - list_financial_types -) - -print("所有模块导入成功") -``` - -**Step 2: 基础功能测试** - -```python -# 测试 QuarterBasedSync 基类方法 -syncer = IncomeQuarterSync() - -# 测试季度计算 -assert syncer.get_prev_quarter("20231231") == "20230930" -assert syncer.get_next_quarter("20231231") == "20240331" -assert syncer.get_prev_quarter("20240331") == "20231231" - -print("季度计算测试通过") -``` - -**Step 3: 预览功能测试** - -```python -# 测试预览功能 -preview = preview_income_sync() -print(f"Preview result: {preview}") - -assert "table_name" in preview -assert "start_quarter" in preview -assert "end_quarter" in preview -assert preview["table_name"] == "financial_income" - -print("预览功能测试通过") -``` - -**Step 4: 调度中心测试** - -```python -# 测试调度中心 -result = preview_sync() -print(f"All previews: {result}") - -types = list_financial_types() -print(f"Available types: {types}") - -print("调度中心测试通过") -``` - -**Step 5: 向后兼容测试** - -```python -# 验证旧接口仍可工作 -from src.data.api_wrappers.financial_data.api_financial_sync import sync_financial - -# 只测试预览模式 -try: - result = sync_financial(data_types=["income"], dry_run=True) - print("向后兼容测试通过") -except Exception as e: - print(f"向后兼容测试失败: {e}") -``` - -### 验证清单 - -- [ ] 所有模块可以正确导入 -- [ ] 季度计算工具方法工作正常 -- [ ] 预览功能返回正确格式(包含 start_quarter, end_quarter) -- [ ] 同步方法始终执行(不跳过) -- [ ] 数据更新采用"先删除后插入"策略 -- [ ] TARGET_REPORT_TYPE 过滤功能正常 -- [ ] 不设置主键和唯一索引(支持财务数据多次修正) -- [ ] 调度中心可以列出所有类型 -- [ ] 旧接口保持向后兼容 -- [ ] 代码风格与现有模块一致 - ---- - -## 提交建议 - -建议按以下顺序提交,每次提交一个完整功能: - -1. **Commit 1**: Task 1 - 创建 `base_financial_sync.py` - ```bash - git add src/data/api_wrappers/base_financial_sync.py - git commit -m "feat: add QuarterBasedSync base class for financial data - - - Add abstract base class for quarter-based financial data sync - - Implement data diff detection (local vs remote comparison) - - Support incremental sync with previous quarter - - Add automatic table creation on first sync - - Add table schema and index management" - ``` - -2. **Commit 2**: Task 2 - 重构 `api_income.py` - ```bash - git add src/data/api_wrappers/financial_data/api_income.py - git commit -m "refactor: rewrite api_income.py with QuarterBasedSync - - - Replace old IncomeSync with IncomeQuarterSync - - Inherit from QuarterBasedSync for consistent patterns - - Add TABLE_SCHEMA and TABLE_INDEXES for auto table creation - - No PRIMARY_KEY to support financial data corrections - - Add convenient sync_income() and preview_income_sync() functions - - Keep get_income() for raw data access" - ``` - -3. **Commit 3**: Task 3 - 简化 `api_financial_sync.py` - ```bash - git add src/data/api_wrappers/financial_data/api_financial_sync.py - git commit -m "refactor: simplify api_financial_sync.py to scheduler only - - - Remove FinancialSync class (600+ lines) - - Add FINANCIAL_SYNCERS registry pattern - - Keep sync_financial() and preview_sync() as dispatchers - - Maintain backward compatibility" - ``` - ---- - -## 总结 - -本次重构将实现以下改进: - -1. **架构清晰**: 调度中心只负责调度,同步逻辑下沉到具体 API 文件 -2. **统一基类**: 新增 `QuarterBasedSync`,与 `StockBasedSync`/`DateBasedSync` 保持一致风格 -3. **先删除后插入**: 数据更新采用删除旧数据后插入新数据的策略,确保数据一致性 -4. **无跳过逻辑**: 财务数据同步必须每次都执行,不存在"不需要同步"的情况 -5. **报表类型过滤**: 通过 `TARGET_REPORT_TYPE` 灵活配置同步的报表类型(默认合并报表) -6. **主键设计**: 主键为 `(ts_code, end_date, report_type)`,支持财务修正数据 -7. **易于扩展**: 新增财务数据类型时只需继承 `QuarterBasedSync` 并注册到调度中心 - -**变更文件汇总:** -- 新建: `src/data/api_wrappers/base_financial_sync.py` (~680行) -- 重构: `src/data/api_wrappers/financial_data/api_income.py` (~160行) -- 简化: `src/data/api_wrappers/financial_data/api_financial_sync.py` (~150行) - -**重要变更说明:** -- **同步策略**: 财务数据同步与日线数据不同,必须每次都进行对比更新 -- **数据更新**: 采用"先删除后插入"策略,先删除旧数据再插入新数据,确保数据一致性 -- **无唯一约束**: 不设置主键和唯一索引,因为财务数据可能发生多次修正(同一股票同一季度多个版本) -- **报表过滤**: 默认只同步 `report_type='1'`(合并报表),可通过 `TARGET_REPORT_TYPE` 覆盖 diff --git a/docs/plan/training_module_plan.md b/docs/plan/training_module_plan.md deleted file mode 100644 index 3b807f8..0000000 --- a/docs/plan/training_module_plan.md +++ /dev/null @@ -1,1025 +0,0 @@ -# 训练模块实现计划 - -## 1. 概述 - -本计划描述 ProStock 训练模块的完整实现方案,支持标准回归模型训练并输出预测结果。 - -### 1.1 目标 -- 提供简洁的训练流程 -- 支持标准回归模型(LightGBM、CatBoost) -- 输出可解释的预测结果 -- 与现有因子引擎无缝集成 - -### 1.2 设计原则 -- **职责分离**:训练流程与建模组件分离 -- **注册机制**:使用装饰器实现即插即用 -- **配置驱动**:所有参数通过配置类管理 -- **阶段感知**:Processor 在训练和测试阶段行为不同 -- **每日筛选**:股票池每日独立筛选(市值动态变化) -- **模型持久化**:支持保存和加载训练好的模型 - -## 2. 模块结构 - -``` -src/ -├── training/ # 训练模块(流程 + 组件) -│ ├── __init__.py # 导出核心类 -│ ├── core/ # 训练流程核心 -│ │ ├── __init__.py -│ │ ├── trainer.py # Trainer 主类 -│ │ └── stock_pool_manager.py # 股票池管理器(每日独立筛选) -│ ├── components/ # 建模组件 -│ │ ├── __init__.py -│ │ ├── base.py # BaseModel, BaseProcessor 抽象基类 -│ │ ├── splitters.py # 时间序列划分策略(一次性划分) -│ │ ├── selectors.py # 股票池选择器配置 -│ │ ├── models/ # 模型实现 -│ │ │ ├── __init__.py -│ │ │ ├── lightgbm.py # LightGBM 回归模型 -│ │ │ └── catboost.py # CatBoost 回归模型 -│ │ ├── processors/ # 数据处理器 -│ │ │ ├── __init__.py -│ │ │ └── transforms.py # 标准化(截面/时序)、缩尾 -│ ├── config/ # 配置管理 -│ │ ├── __init__.py -│ │ └── config.py # TrainingConfig (pydantic) -│ └── registry.py # 组件注册中心 -│ -└── experiment/ # 实验管理(预留结构,暂不实现) - └── __init__.py -``` - -## 3. 核心组件设计 - -### 3.1 抽象基类 (components/base.py) - -#### BaseModel -```python -class BaseModel(ABC): - """模型基类""" - - name: str = "" # 模型名称 - - def fit(self, X: pl.DataFrame, y: pl.Series) -> "BaseModel": - """训练模型""" - raise NotImplementedError - - def predict(self, X: pl.DataFrame) -> np.ndarray: - """预测""" - raise NotImplementedError - - def feature_importance(self) -> Optional[pd.Series]: - """特征重要性""" - return None - - def save(self, path: str) -> None: - """保存模型到文件 - - 默认实现使用 pickle,子类可覆盖 - """ - import pickle - with open(path, 'wb') as f: - pickle.dump(self, f) - - @classmethod - def load(cls, path: str) -> "BaseModel": - """从文件加载模型""" - import pickle - with open(path, 'rb') as f: - return pickle.load(f) -``` - -#### BaseProcessor -```python -class BaseProcessor(ABC): - """数据处理器基类 - - 重要:Processor 在不同阶段行为不同: - - 训练阶段:fit_transform(学习参数并应用) - - 验证/测试阶段:transform(使用训练阶段学到的参数) - - 这意味着 Processor 实例会在训练后被保存, - 用于后续的验证和测试数据转换。 - """ - - name: str = "" - - def fit(self, X: pl.DataFrame) -> "BaseProcessor": - """学习参数(仅在训练阶段调用)""" - return self - - def transform(self, X: pl.DataFrame) -> pl.DataFrame: - """转换数据""" - raise NotImplementedError - - def fit_transform(self, X: pl.DataFrame) -> pl.DataFrame: - """拟合并转换(训练阶段使用)""" - return self.fit(X).transform(X) -``` - -### 3.2 时间序列划分 (components/splitters.py) - -**设计说明**:暂不实现滚动训练,采用一次性训练/测试划分。 - -#### DateSplitter -```python -class DateSplitter: - """基于日期范围的一次性划分 - - 将数据按日期划分为训练集和测试集,不滚动。 - - 示例: - train_start: "20200101", train_end: "20221231" (训练集:3年) - test_start: "20230101", test_end: "20231231" (测试集:1年) - - 特点: - - 一次性划分,不滚动 - - 训练集和测试集互不重叠 - - 基于实际日期范围,而非行数 - """ - - def __init__( - self, - train_start: str, # 训练期开始日期 "YYYYMMDD" - train_end: str, # 训练期结束日期 "YYYYMMDD" - test_start: str, # 测试期开始日期 "YYYYMMDD" - test_end: str, # 测试期结束日期 "YYYYMMDD" - ): - self.train_start = train_start - self.train_end = train_end - self.test_start = test_start - self.test_end = test_end - - def split(self, data: pl.DataFrame) -> Tuple[pl.DataFrame, pl.DataFrame]: - """划分数据为训练集和测试集""" - train_data = data.filter( - (pl.col("trade_date") >= self.train_start) & - (pl.col("trade_date") <= self.train_end) - ) - test_data = data.filter( - (pl.col("trade_date") >= self.test_start) & - (pl.col("trade_date") <= self.test_end) - ) - return train_data, test_data -``` - -### 3.3 股票池选择器配置 (components/selectors.py) - -**设计说明**:股票池每日独立筛选,市值选择需要配合 StockPoolManager 使用。 - -#### StockFilterConfig -```python -@dataclass -class StockFilterConfig: - """股票过滤器配置 - - 用于过滤掉不需要的股票(如创业板、科创板等)。 - 基于股票代码进行过滤,不依赖外部数据。 - """ - - exclude_cyb: bool = True # 是否排除创业板(300xxx) - exclude_kcb: bool = True # 是否排除科创板(688xxx) - exclude_bj: bool = True # 是否排除北交所(8xxxxxx, 4xxxxxx) - exclude_st: bool = True # 是否排除ST股票 - - def filter_codes(self, codes: List[str]) -> List[str]: - """应用过滤条件,返回过滤后的股票代码列表""" - result = [] - for code in codes: - if self.exclude_cyb and code.startswith("300"): - continue - if self.exclude_kcb and code.startswith("688"): - continue - if self.exclude_bj and (code.startswith("8") or code.startswith("4")): - continue - # ST 股票过滤需要额外数据,在 StockPoolManager 中处理 - result.append(code) - return result -``` - -#### MarketCapSelectorConfig -```python -@dataclass -class MarketCapSelectorConfig: - """市值选择器配置 - - 每日独立选择市值最大或最小的 n 只股票。 - 市值数据从 daily_basic 表独立获取,仅用于筛选。 - """ - - enabled: bool = True # 是否启用选择 - n: int = 100 # 选择前 n 只 - ascending: bool = False # False=最大市值, True=最小市值 - market_cap_col: str = "total_mv" # 市值列名(来自 daily_basic) -``` - -### 3.4 股票池管理器 (core/stock_pool_manager.py) - -**设计说明**:每日独立筛选股票池,市值数据从 daily_basic 表独立获取。 - -```python -class StockPoolManager: - """股票池管理器 - 每日独立筛选 - - 重要约束: - 1. 市值数据仅从 daily_basic 表获取,仅用于筛选 - 2. 市值数据绝不混入特征矩阵 - 3. 每日独立筛选(市值是动态变化的) - - 处理流程(每日): - 当日所有股票 - ↓ - 代码过滤(创业板、ST等) - ↓ - 查询 daily_basic 获取当日市值 - ↓ - 市值选择(前N只) - ↓ - 返回当日选中股票列表 - """ - - def __init__( - self, - filter_config: StockFilterConfig, - selector_config: Optional[MarketCapSelectorConfig], - data_router: DataRouter, # 用于获取 daily_basic 数据 - code_col: str = "ts_code", - date_col: str = "trade_date", - ): - self.filter_config = filter_config - self.selector_config = selector_config - self.data_router = data_router - self.code_col = code_col - self.date_col = date_col - - def filter_and_select_daily(self, data: pl.DataFrame) -> pl.DataFrame: - """每日独立筛选股票池 - - Args: - data: 因子计算后的全市场数据,必须包含 trade_date 和 ts_code 列 - - Returns: - 筛选后的数据,仅包含每日选中的股票 - - 注意: - - 按日期分组处理 - - 市值数据从 daily_basic 独立获取 - - 保持市值数据与特征数据隔离 - """ - dates = data.select(self.date_col).unique().sort(self.date_col) - - result_frames = [] - for date in dates.to_series(): - # 获取当日数据 - daily_data = data.filter(pl.col(self.date_col) == date) - daily_codes = daily_data.select(self.code_col).to_series().to_list() - - # 1. 代码过滤 - filtered_codes = self.filter_config.filter_codes(daily_codes) - - # 2. 市值选择(如果启用) - if self.selector_config and self.selector_config.enabled: - # 从 daily_basic 获取当日市值 - market_caps = self._get_market_caps_for_date(filtered_codes, date) - selected_codes = self._select_by_market_cap(filtered_codes, market_caps) - else: - selected_codes = filtered_codes - - # 3. 保留当日选中的股票数据 - daily_selected = daily_data.filter( - pl.col(self.code_col).is_in(selected_codes) - ) - result_frames.append(daily_selected) - - return pl.concat(result_frames) - - def _get_market_caps_for_date( - self, - codes: List[str], - date: str - ) -> Dict[str, float]: - """从 daily_basic 表获取指定日期的市值数据 - - Args: - codes: 股票代码列表 - date: 日期 "YYYYMMDD" - - Returns: - {股票代码: 市值} 的字典 - """ - # 通过 data_router 查询 daily_basic 表 - pass - - def _select_by_market_cap( - self, - codes: List[str], - market_caps: Dict[str, float] - ) -> List[str]: - """根据市值选择股票""" - if not market_caps: - return codes - - # 按市值排序并选择前N只 - sorted_codes = sorted( - codes, - key=lambda c: market_caps.get(c, 0), - reverse=not self.selector_config.ascending - ) - return sorted_codes[:self.selector_config.n] -``` - -### 3.5 模型实现 (components/models/) - -#### LightGBMModel -```python -@register_model("lightgbm") -class LightGBMModel(BaseModel): - """LightGBM 回归模型""" - - name = "lightgbm" - - def __init__(self, - objective: str = "regression", - metric: str = "rmse", - num_leaves: int = 31, - learning_rate: float = 0.05, - n_estimators: int = 100, - **kwargs): - self.params = { - "objective": objective, - "metric": metric, - "num_leaves": num_leaves, - "learning_rate": learning_rate, - "n_estimators": n_estimators, - **kwargs - } - self.model = None - - def fit(self, X: pl.DataFrame, y: pl.Series) -> "LightGBMModel": - """训练模型""" - import lightgbm as lgb - - # 转换为 numpy - X_np = X.to_numpy() - y_np = y.to_numpy() - - # 创建数据集 - train_data = lgb.Dataset(X_np, label=y_np) - - # 训练 - self.model = lgb.train( - self.params, - train_data, - num_boost_round=self.params.get("n_estimators", 100) - ) - return self - - def predict(self, X: pl.DataFrame) -> np.ndarray: - """预测""" - if self.model is None: - raise RuntimeError("Model not fitted yet") - X_np = X.to_numpy() - return self.model.predict(X_np) - - def feature_importance(self) -> pd.Series: - """返回特征重要性""" - if self.model is None: - return None - importance = self.model.feature_importance(importance_type="gain") - return pd.Series(importance, index=self.feature_names_) - - def save(self, path: str) -> None: - """保存模型(使用 LightGBM 原生格式)""" - if self.model is None: - raise RuntimeError("Model not fitted yet") - self.model.save_model(path) - - @classmethod - def load(cls, path: str) -> "LightGBMModel": - """加载模型""" - import lightgbm as lgb - instance = cls() - instance.model = lgb.Booster(model_file=path) - return instance -``` - -### 3.6 数据处理器 (components/processors/) - -#### StandardScaler -```python -@register_processor("standard_scaler") -class StandardScaler(BaseProcessor): - """标准化处理器(时序标准化) - - 在整个训练集上学习均值和标准差, - 然后应用到训练集和测试集。 - """ - - name = "standard_scaler" - - def __init__(self, exclude_cols: List[str] = None): - self.exclude_cols = exclude_cols or ["ts_code", "trade_date"] - self.mean_ = {} - self.std_ = {} - - def fit(self, X: pl.DataFrame) -> "StandardScaler": - """计算均值和标准差(仅在训练集上)""" - numeric_cols = [ - c for c in X.columns - if c not in self.exclude_cols and X[c].dtype.is_numeric() - ] - - for col in numeric_cols: - self.mean_[col] = X[col].mean() - self.std_[col] = X[col].std() - - return self - - def transform(self, X: pl.DataFrame) -> pl.DataFrame: - """标准化(使用训练集学到的参数)""" - expressions = [] - for col in X.columns: - if col in self.mean_: - expr = ((pl.col(col) - self.mean_[col]) / self.std_[col]).alias(col) - expressions.append(expr) - else: - expressions.append(pl.col(col)) - - return X.select(expressions) -``` - -#### CrossSectionalStandardScaler -```python -@register_processor("cs_standard_scaler") -class CrossSectionalStandardScaler(BaseProcessor): - """截面标准化处理器 - - 每天独立进行标准化:对当天所有股票的某一因子进行标准化。 - - 特点: - - 不需要 fit,每天独立计算当天的均值和标准差 - - 适用于截面因子,消除市值等行业差异 - - 公式:z = (x - mean_today) / std_today - """ - - name = "cs_standard_scaler" - - def __init__(self, exclude_cols: List[str] = None, date_col: str = "trade_date"): - self.exclude_cols = exclude_cols or ["ts_code", "trade_date"] - self.date_col = date_col - - def transform(self, X: pl.DataFrame) -> pl.DataFrame: - """截面标准化 - - 按日期分组,每天独立计算均值和标准差并标准化。 - 不需要 fit,因为每天使用当天的统计量。 - """ - numeric_cols = [ - c for c in X.columns - if c not in self.exclude_cols and X[c].dtype.is_numeric() - ] - - # 按日期分组标准化 - result = X.with_columns([ - pl.col(col).mean().over(self.date_col).alias(f"{col}_mean") - for col in numeric_cols - ] + [ - pl.col(col).std().over(self.date_col).alias(f"{col}_std") - for col in numeric_cols - ]) - - # 计算标准化值 - for col in numeric_cols: - result = result.with_columns([ - ((pl.col(col) - pl.col(f"{col}_mean")) / pl.col(f"{col}_std")).alias(col) - ]) - # 删除中间列 - result = result.drop([f"{col}_mean", f"{col}_std"]) - - return result -``` - -#### Winsorizer -```python -@register_processor("winsorizer") -class Winsorizer(BaseProcessor): - """缩尾处理器 - - 对每一列的极端值进行截断处理。 - 可以全局截断(在整个训练集上学习分位数), - 也可以截面截断(每天独立处理)。 - """ - - name = "winsorizer" - - def __init__( - self, - lower: float = 0.01, - upper: float = 0.99, - by_date: bool = False, # True=每天独立缩尾, False=全局缩尾 - date_col: str = "trade_date" - ): - self.lower = lower - self.upper = upper - self.by_date = by_date - self.date_col = date_col - self.bounds_ = {} # 存储分位数边界(全局模式) - - def fit(self, X: pl.DataFrame) -> "Winsorizer": - """学习分位数边界(仅在全局模式下)""" - if not self.by_date: - numeric_cols = [c for c in X.columns if X[c].dtype.is_numeric()] - for col in numeric_cols: - self.bounds_[col] = { - "lower": X[col].quantile(self.lower), - "upper": X[col].quantile(self.upper) - } - return self - - def transform(self, X: pl.DataFrame) -> pl.DataFrame: - """缩尾处理""" - if self.by_date: - # 每天独立缩尾 - return self._transform_by_date(X) - else: - # 全局缩尾 - return self._transform_global(X) - - def _transform_global(self, X: pl.DataFrame) -> pl.DataFrame: - """全局缩尾(使用训练集学到的边界)""" - expressions = [] - for col in X.columns: - if col in self.bounds_: - lower = self.bounds_[col]["lower"] - upper = self.bounds_[col]["upper"] - expr = pl.col(col).clip(lower, upper).alias(col) - expressions.append(expr) - else: - expressions.append(pl.col(col)) - return X.select(expressions) - - def _transform_by_date(self, X: pl.DataFrame) -> pl.DataFrame: - """每日独立缩尾""" - # 按日期分组计算分位数并截断 - # Polars 实现... - pass -``` - -## 4. 训练流程设计 - -### 4.1 Trainer 主类 (core/trainer.py) - -```python -class Trainer: - """训练器主类 - - 整合数据处理、模型训练、评估的完整流程。 - - 关键设计: - 1. 因子先计算(全市场),再筛选股票池(每日独立) - 2. Processor 分阶段行为:训练集 fit_transform,测试集 transform - 3. 一次性训练,不滚动 - 4. 支持模型持久化 - """ - - def __init__( - self, - model: BaseModel, - pool_manager: Optional[StockPoolManager] = None, - processors: List[BaseProcessor] = None, - splitter: DateSplitter = None, - target_col: str = "target", - feature_cols: List[str] = None, - persist_model: bool = False, - model_save_path: Optional[str] = None, - ): - self.model = model - self.pool_manager = pool_manager - self.processors = processors or [] - self.splitter = splitter - self.target_col = target_col - self.feature_cols = feature_cols - self.persist_model = persist_model - self.model_save_path = model_save_path - - # 存储训练后的处理器 - self.fitted_processors: List[BaseProcessor] = [] - self.results: pl.DataFrame = None - - def train(self, data: pl.DataFrame) -> "Trainer": - """执行训练流程 - - 流程: - 1. 股票池每日筛选(如果配置了 pool_manager) - 2. 按日期划分训练集/测试集 - 3. 训练集:processors fit_transform - 4. 训练模型 - 5. 测试集:processors transform(使用训练集学到的参数) - 6. 预测并评估 - 7. 持久化模型(如果启用) - - Args: - data: 因子计算后的全市场数据 - 必须包含 ts_code 和 trade_date 列 - - Returns: - self (支持链式调用) - """ - # 1. 股票池筛选(每日独立) - if self.pool_manager: - print("[筛选] 每日独立筛选股票池...") - data = self.pool_manager.filter_and_select_daily(data) - - # 2. 划分训练/测试集 - print("[划分] 划分训练集和测试集...") - train_data, test_data = self.splitter.split(data) - - # 3. 训练集:processors fit_transform - print("[处理] 处理训练集...") - for processor in self.processors: - train_data = processor.fit_transform(train_data) - self.fitted_processors.append(processor) - - # 4. 训练模型 - print("[训练] 训练模型...") - X_train = train_data.select(self.feature_cols) - y_train = train_data.select(self.target_col).to_series() - self.model.fit(X_train, y_train) - - # 5. 测试集:processors transform - print("[处理] 处理测试集...") - for processor in self.fitted_processors: - test_data = processor.transform(test_data) - - # 6. 预测 - print("[预测] 生成预测...") - X_test = test_data.select(self.feature_cols) - predictions = self.model.predict(X_test) - - # 7. 保存结果 - self.results = test_data.with_columns([ - pl.Series("prediction", predictions) - ]) - - # 8. 持久化模型 - if self.persist_model and self.model_save_path: - print(f"[保存] 保存模型到 {self.model_save_path}...") - self.save_model(self.model_save_path) - - return self - - def predict(self, data: pl.DataFrame) -> pl.DataFrame: - """对新数据进行预测 - - 注意:新数据需要先经过股票池筛选, - 然后使用训练好的 processors 和 model 进行预测。 - """ - # 应用 processors - for processor in self.fitted_processors: - data = processor.transform(data) - - # 预测 - X = data.select(self.feature_cols) - predictions = self.model.predict(X) - - return data.with_columns([pl.Series("prediction", predictions)]) - - def get_results(self) -> pl.DataFrame: - """获取所有预测结果""" - return self.results - - def save_results(self, path: str): - """保存预测结果到文件""" - if self.results is not None: - self.results.write_csv(path) - - def save_model(self, path: str): - """保存模型""" - self.model.save(path) -``` - -### 4.2 配置类 (config/config.py) - -```python -from pydantic import BaseSettings, Field -from typing import List, Dict, Optional -from dataclasses import dataclass - -@dataclass -class StockFilterConfig: - """股票过滤器配置""" - exclude_cyb: bool = True # 排除创业板 - exclude_kcb: bool = True # 排除科创板 - exclude_bj: bool = True # 排除北交所 - exclude_st: bool = True # 排除ST股票 - -@dataclass -class MarketCapSelectorConfig: - """市值选择器配置""" - enabled: bool = True # 是否启用 - n: int = 100 # 选择前 n 只 - ascending: bool = False # False=最大市值, True=最小市值 - market_cap_col: str = "total_mv" # 市值列名(来自 daily_basic) - -@dataclass -class ProcessorConfig: - """处理器配置""" - name: str - params: Dict = Field(default_factory=dict) - -class TrainingConfig(BaseSettings): - """训练配置类""" - - # === 数据配置(必填)=== - feature_cols: List[str] = Field(..., min_items=1) # 特征列名,至少一个 - target_col: str = "target" # 目标变量列名 - date_col: str = "trade_date" # 日期列名 - code_col: str = "ts_code" # 股票代码列名 - - # === 日期划分(必填)=== - train_start: str = Field(..., description="训练期开始 YYYYMMDD") - train_end: str = Field(..., description="训练期结束 YYYYMMDD") - test_start: str = Field(..., description="测试期开始 YYYYMMDD") - test_end: str = Field(..., description="测试期结束 YYYYMMDD") - - # === 股票池配置 === - stock_filter: StockFilterConfig = Field( - default_factory=lambda: StockFilterConfig( - exclude_cyb=True, - exclude_kcb=True, - exclude_bj=True, - exclude_st=True, - ) - ) - stock_selector: Optional[MarketCapSelectorConfig] = Field( - default_factory=lambda: MarketCapSelectorConfig( - enabled=True, - n=100, - ascending=False, - market_cap_col="total_mv", - ) - ) - # 注意:如果 stock_selector = None,则跳过市值选择 - - # === 模型配置 === - model_type: str = "lightgbm" - model_params: Dict = Field(default_factory=dict) - - # === 处理器配置 === - processors: List[ProcessorConfig] = Field( - default_factory=lambda: [ - ProcessorConfig(name="winsorizer", params={"lower": 0.01, "upper": 0.99}), - ProcessorConfig(name="cs_standard_scaler", params={}), - ] - ) - - # === 持久化配置 === - persist_model: bool = False # 默认不持久化 - model_save_path: Optional[str] = None # 持久化路径 - - # === 输出配置 === - output_dir: str = "output" - save_predictions: bool = True -``` - -## 5. 使用示例 - -### 5.1 基本用法 - -```python -from src.training import Trainer, LightGBMModel, DateSplitter -from src.training.config import StockFilterConfig, MarketCapSelectorConfig -from src.training.core.stock_pool_manager import StockPoolManager -from src.training.components.processors import Winsorizer, CrossSectionalStandardScaler -from src.factors import FactorEngine -import polars as pl - -# 1. 因子计算(全市场数据) -engine = FactorEngine() -all_data = engine.compute( - factor_names=["factor1", "factor2", "factor3", "future_return_5d"], - start_date="20200101", - end_date="20231231", - # 不指定 stock_codes,获取全市场数据 -) - -# 2. 创建股票池管理器(每日独立筛选) -pool_manager = StockPoolManager( - filter_config=StockFilterConfig( - exclude_cyb=True, - exclude_kcb=True, - exclude_bj=True, - exclude_st=True, - ), - selector_config=MarketCapSelectorConfig( - enabled=True, - n=100, - ascending=False, # 最大市值 - ), - data_router=data_router, # 用于获取 daily_basic 数据 -) - -# 3. 创建模型 -model = LightGBMModel( - objective="regression", - n_estimators=100, - learning_rate=0.05 -) - -# 4. 创建处理器 -processors = [ - Winsorizer(lower=0.01, upper=0.99, by_date=False), # 全局缩尾 - CrossSectionalStandardScaler(), # 截面标准化(每天独立) -] - -# 5. 创建划分器 -splitter = DateSplitter( - train_start="20200101", - train_end="20221231", - test_start="20230101", - test_end="20231231" -) - -# 6. 创建训练器 -trainer = Trainer( - model=model, - pool_manager=pool_manager, # 每日筛选股票池 - processors=processors, - splitter=splitter, - target_col="future_return_5d", - feature_cols=["factor1", "factor2", "factor3"], - persist_model=True, # 启用持久化 - model_save_path="output/model.pkl", -) - -# 7. 执行训练(传入全市场数据) -trainer.train(all_data) - -# 8. 获取结果 -results = trainer.get_results() # 包含预测值 - -# 9. 保存结果 -trainer.save_results("output/predictions.csv") - -# 10. 加载模型并预测新数据 -loaded_model = LightGBMModel.load("output/model.pkl") -new_predictions = loaded_model.predict(new_data) -``` - -### 5.2 使用配置驱动 - -```python -from src.training.config import TrainingConfig, StockFilterConfig -from src.training import Trainer -from src.training.registry import ModelRegistry, ProcessorRegistry -from src.training.core.stock_pool_manager import StockPoolManager -from src.factors import FactorEngine - -# 1. 配置(必填字段校验) -config = TrainingConfig( - feature_cols=["factor1", "factor2", "factor3"], - target_col="future_return_5d", - train_start="20200101", - train_end="20221231", - test_start="20230101", - test_end="20231231", - stock_filter=StockFilterConfig( - exclude_cyb=True, - exclude_kcb=True, - ), - stock_selector=None, # 跳过市值选择 - persist_model=False, # 不持久化 -) - -# 2. 因子计算 -engine = FactorEngine() -all_data = engine.compute( - factor_names=config.feature_cols + [config.target_col], - start_date=config.train_start, - end_date=config.test_end, -) - -# 3. 从配置创建组件 -model = ModelRegistry.get_model(config.model_type)(**config.model_params) -processors = [ - ProcessorRegistry.get_processor(p.name)(**p.params) - for p in config.processors -] - -# 4. 创建股票池管理器 -pool_manager = StockPoolManager( - filter_config=config.stock_filter, - selector_config=config.stock_selector, - data_router=data_router, -) - -# 5. 创建并运行训练器 -trainer = Trainer( - model=model, - pool_manager=pool_manager, - processors=processors, - splitter=DateSplitter( - train_start=config.train_start, - train_end=config.train_end, - test_start=config.test_start, - test_end=config.test_end, - ), - target_col=config.target_col, - feature_cols=config.feature_cols, -) - -trainer.train(all_data) -results = trainer.get_results() -``` - -## 6. 实现顺序 - -按以下顺序实现和提交: - -### Commit 1: 基础架构 -- `training/__init__.py` -- `training/components/__init__.py` -- `training/components/base.py`(BaseModel, BaseProcessor,含 save/load) -- `training/registry.py`(组件注册中心) - -### Commit 2: 数据划分 -- `training/components/splitters.py`(DateSplitter,仅一次性划分) - -### Commit 3: 股票池选择器配置 -- `training/components/selectors.py`(StockFilterConfig, MarketCapSelectorConfig) - -### Commit 4: 数据处理器 -- `training/components/processors/__init__.py` -- `training/components/processors/transforms.py` - - Winsorizer - - StandardScaler - - CrossSectionalStandardScaler - -### Commit 5: LightGBM 模型 -- `training/components/models/__init__.py` -- `training/components/models/lightgbm.py`(含 save_model/load_model) - -### Commit 6: 股票池管理器 -- `training/core/__init__.py` -- `training/core/stock_pool_manager.py`(每日独立筛选) - -### Commit 7: Trainer 训练器 -- `training/core/trainer.py` - -### Commit 8: 配置管理 -- `training/config/__init__.py` -- `training/config/config.py`(TrainingConfig,含必填校验) - -### Commit 9: 预留实验模块 -- `experiment/__init__.py` - -## 7. 注意事项 - -### 7.1 股票池处理顺序(每日) - -``` -当日所有股票数据 - ↓ -代码过滤(创业板、ST等) - ↓ -查询 daily_basic 获取当日市值 - ↓ -市值选择(前N只) - ↓ -返回当日选中股票 -``` - -- 每日独立筛选,市值动态变化 -- 市值数据仅从 daily_basic 获取 -- 市值数据绝不混入特征矩阵 - -### 7.2 Processor 阶段行为 - -| Processor | 训练集 | 测试集 | -|-----------|--------|--------| -| StandardScaler | fit_transform | transform(使用训练集参数) | -| CrossSectionalStandardScaler | transform | transform(每天独立) | -| Winsorizer (global) | fit_transform | transform(使用训练集参数) | -| Winsorizer (by_date) | transform | transform(每天独立) | - -### 7.3 依赖关系 - -- 使用 Polars 进行数据处理 -- LightGBM 用于模型训练 -- Pydantic 用于配置管理 -- 市值数据来自 daily_basic 表(独立数据源) - -### 7.4 删除的功能 - -以下原计划在本次实现中删除: - -1. **特征选择**(processors/selectors.py) -2. **滚动训练**(WalkForward, ExpandingWindow) -3. **结果分析工具**(复杂分析功能) -4. **validator.py, evaluator.py**(已删除,不实现 metrics) - -### 7.5 新增功能 - -1. **StockPoolManager**(每日独立筛选) -2. **模型持久化**(save/load,默认关闭) -3. **配置必填校验**(feature_cols, 日期范围) diff --git a/src/data/financial_loader.py b/src/data/financial_loader.py index 4b63be1..59ac6a1 100644 --- a/src/data/financial_loader.py +++ b/src/data/financial_loader.py @@ -49,7 +49,13 @@ class FinancialLoader: 清洗后的 Polars DataFrame,已排序,f_ann_date 为 pl.Date 类型 """ # 确保包含必要字段 - required_cols = {"ts_code", "f_ann_date", "report_type", "update_flag"} + required_cols = { + "ts_code", + "f_ann_date", + "report_type", + "update_flag", + "end_date", + } query_cols = list(set(columns) | required_cols) # 从数据库加载原始数据 @@ -61,32 +67,51 @@ class FinancialLoader: # 步骤1: 仅保留合并报表 (report_type 可能是字符串或整数) df = df.filter(pl.col("report_type") == 1) - # 步骤2: 按 update_flag 降序排列后去重 + # 步骤2: 添加辅助列用于排序和过滤 df = df.with_columns( - [pl.col("update_flag").cast(pl.Int32).alias("update_flag_int")] + [ + # 将报告期 20231231 转为整数 + pl.col("end_date").cast(pl.Int32).alias("end_date_int"), + # 将更新标识转为整数,容错处理 null 和空字符串 + pl.col("update_flag") + .fill_null("0") + .cast(pl.Int32, strict=False) + .fill_null(0) + .alias("update_flag_int"), + ] ) - # 排序:ts_code, f_ann_date 升序;update_flag 降序 - df = df.sort( - ["ts_code", "f_ann_date", "update_flag_int"], - descending=[False, False, True], + # 步骤3: 绝对确定性排序 + # 按照: 股票代码(升序) -> 公告日(升序) -> 报告期(升序) -> 更新标识(升序) + # 这样排序后,同一天发布的多份报表中,end_date最大、update_flag最新的, + # 必然排在这一天的最后面 + df = df.sort(["ts_code", "f_ann_date", "end_date_int", "update_flag_int"]) + + # 步骤4: 核心算法 - 计算截至每一个公告日,市场"见过的"最新报告期(最高水位线) + df = df.with_columns( + pl.col("end_date_int").cum_max().over("ts_code").alias("max_end_date_seen") ) - # 去重:保留每个 (ts_code, f_ann_date) 的第一条(update_flag 最高的) - df = df.unique(subset=["ts_code", "f_ann_date"], keep="first") + # 步骤5: 剔除"历史包袱"(解决2026年发2021年财报的问题) + # 如果今天发布的财报,它的 end_date 小于我们之前已经见过的最大值, + # 说明它是陈旧的追溯调整,直接抛弃! + df = df.filter(pl.col("end_date_int") == pl.col("max_end_date_seen")) - # 移除临时列 - df = df.drop("update_flag_int") + # 步骤6: 唯一化处理:满足 join_asof 的前置要求 + # 经过上述处理后,同一个 f_ann_date 的最后一行,必定是 end_date 最大的那一份 + # 我们只保留这最后一行,确保每个 f_ann_date 只有唯一的一条记录暴露给行情去 join + df = df.unique(subset=["ts_code", "f_ann_date"], keep="last") - # 步骤3: 确保 f_ann_date 是 Date 类型并排序 - # 数据库返回的必须是 Date 类型,如果不是则报错 + # 步骤7: 清理临时辅助列 + df = df.drop(["end_date_int", "update_flag_int", "max_end_date_seen"]) + + # 步骤8: 确保 f_ann_date 是 Date 类型并排序(join_asof 要求) if df["f_ann_date"].dtype != pl.Date: raise TypeError( f"f_ann_date 必须是 Date 类型,实际类型为 {df['f_ann_date'].dtype}. " f"请检查数据库表结构,确保日期字段为 DATE 类型。" ) - # 最终排序(join_asof 要求) df = df.sort(["ts_code", "f_ann_date"]) return df @@ -168,14 +193,14 @@ class FinancialLoader: self, start_date: str, end_date: str, - lookback_years: int = 1, + lookback_years: int = 2, ) -> tuple[str, str]: """计算包含回看期的日期范围。 Args: start_date: 原始开始日期(YYYYMMDD) end_date: 原始结束日期(YYYYMMDD) - lookback_years: 回看年数(默认1年) + lookback_years: 回看年数(默认2年,防止ST/停牌公司财报缺失) Returns: (扩展后的开始日期, 结束日期) diff --git a/src/experiment/regression.ipynb b/src/experiment/regression.ipynb index d6f2e10..33638ab 100644 --- a/src/experiment/regression.ipynb +++ b/src/experiment/regression.ipynb @@ -11,8 +11,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2026-03-08T06:10:19.495013Z", - "start_time": "2026-03-08T06:10:18.913682Z" + "end_time": "2026-03-08T12:42:00.925979Z", + "start_time": "2026-03-08T12:42:00.366875Z" } }, "source": [ @@ -49,8 +49,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2026-03-08T06:10:19.508163Z", - "start_time": "2026-03-08T06:10:19.502562Z" + "end_time": "2026-03-08T12:42:00.940517Z", + "start_time": "2026-03-08T12:42:00.935125Z" } }, "cell_type": "code", @@ -124,8 +124,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2026-03-08T06:10:19.519954Z", - "start_time": "2026-03-08T06:10:19.515047Z" + "end_time": "2026-03-08T12:42:00.953087Z", + "start_time": "2026-03-08T12:42:00.947665Z" } }, "cell_type": "code", @@ -210,8 +210,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2026-03-08T06:10:19.527636Z", - "start_time": "2026-03-08T06:10:19.523669Z" + "end_time": "2026-03-08T12:42:00.961926Z", + "start_time": "2026-03-08T12:42:00.959032Z" } }, "source": [ @@ -224,7 +224,7 @@ "VAL_START = \"20240101\"\n", "VAL_END = \"20241231\"\n", "TEST_START = \"20250101\"\n", - "TEST_END = \"20261231\"\n", + "TEST_END = \"20251231\"\n", "\n", "# 模型参数配置\n", "MODEL_PARAMS = {\n", @@ -270,7 +270,7 @@ "PERSIST_MODEL = False\n", "\n", "# Top N 配置:每日推荐股票数量\n", - "TOP_N = 2 # 可调整为 10, 20 等" + "TOP_N = 5 # 可调整为 10, 20 等" ], "outputs": [], "execution_count": 4 @@ -288,8 +288,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2026-03-08T06:10:27.660787Z", - "start_time": "2026-03-08T06:10:19.531220Z" + "end_time": "2026-03-08T12:42:08.872125Z", + "start_time": "2026-03-08T12:42:00.967162Z" } }, "source": [ @@ -434,14 +434,14 @@ "准备数据\n", "================================================================================\n", "\n", - "计算因子: 20200101 - 20261231\n" + "计算因子: 20200101 - 20251231\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "D:\\PyProject\\ProStock\\src\\data\\financial_loader.py:123: UserWarning: Sortedness of columns cannot be checked when 'by' groups provided\n", + "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" ] }, @@ -449,34 +449,34 @@ "name": "stdout", "output_type": "stream", "text": [ - "数据形状: (7255513, 53)\n", - "数据列: ['ts_code', 'trade_date', 'vol', 'low', 'high', 'volume_ratio', 'turnover_rate', 'close', 'total_mv', 'f_ann_date', 'total_profit', 'ebit', 'operate_profit', 'ebitda', 'n_income', 'money_cap', 'total_liab', 'n_cashflow_act', 'ma5', 'ma10', 'ma20', 'ma_ratio', 'volatility_5', 'volatility_20', 'vol_ratio', 'return_10', 'return_20', 'return_diff', 'vol_ma5', 'vol_ma20', 'market_cap_rank', 'high_low_ratio', 'turnover_rate_mean_5', 'bbi_ratio_factor', 'volume_change_rate', 'turnover_deviation', 'vol_std_5', 'std_return_5', 'std_return_90', 'cs_rank_volume_ratio', 'cs_rank_turnover_rate', 'n_income_rank', 'operate_profit_rank', 'total_profit_rank', 'ebit_rank', 'ebitda_rank', 'total_liab_rank', 'money_cap_rank', 'n_cashflow_act_rank', 'profit_to_market_cap', 'cashflow_to_market_cap', 'operate_profit_to_market_cap', 'future_return_5']\n", + "数据形状: (7044952, 53)\n", + "数据列: ['ts_code', 'trade_date', 'turnover_rate', 'volume_ratio', 'high', 'vol', 'close', 'low', 'total_mv', 'f_ann_date', 'total_profit', 'operate_profit', 'ebit', 'n_income', 'ebitda', 'money_cap', 'total_liab', 'n_cashflow_act', 'ma5', 'ma10', 'ma20', 'ma_ratio', 'volatility_5', 'volatility_20', 'vol_ratio', 'return_10', 'return_20', 'return_diff', 'vol_ma5', 'vol_ma20', 'market_cap_rank', 'high_low_ratio', 'turnover_rate_mean_5', 'bbi_ratio_factor', 'volume_change_rate', 'turnover_deviation', 'vol_std_5', 'std_return_5', 'std_return_90', 'cs_rank_volume_ratio', 'cs_rank_turnover_rate', 'n_income_rank', 'operate_profit_rank', 'total_profit_rank', 'ebit_rank', 'ebitda_rank', 'total_liab_rank', 'money_cap_rank', 'n_cashflow_act_rank', 'profit_to_market_cap', 'cashflow_to_market_cap', 'operate_profit_to_market_cap', 'future_return_5']\n", "\n", "前5行预览:\n", "shape: (5, 53)\n", - "┌───────────┬────────────┬───────────┬─────────┬───┬───────────┬───────────┬───────────┬───────────┐\n", - "│ ts_code ┆ trade_date ┆ vol ┆ low ┆ … ┆ profit_to ┆ cashflow_ ┆ operate_p ┆ future_re │\n", - "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ _market_c ┆ to_market ┆ rofit_to_ ┆ turn_5 │\n", - "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ ap ┆ _cap ┆ market_ca ┆ --- │\n", - "│ ┆ ┆ ┆ ┆ ┆ --- ┆ --- ┆ p ┆ f64 │\n", - "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ --- ┆ │\n", - "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ │\n", - "╞═══════════╪════════════╪═══════════╪═════════╪═══╪═══════════╪═══════════╪═══════════╪═══════════╡\n", - "│ 000001.SZ ┆ 20200102 ┆ 1.5302e6 ┆ 1806.75 ┆ … ┆ 721.52104 ┆ 2580.5045 ┆ 938.15146 ┆ -0.004746 │\n", - "│ ┆ ┆ ┆ ┆ ┆ 1 ┆ 33 ┆ 4 ┆ │\n", - "│ 000001.SZ ┆ 20200103 ┆ 1.1162e6 ┆ 1847.15 ┆ … ┆ 708.50174 ┆ 2533.9412 ┆ 921.22323 ┆ -0.02852 │\n", - "│ ┆ ┆ ┆ ┆ ┆ 4 ┆ 96 ┆ 7 ┆ │\n", - "│ 000001.SZ ┆ 20200106 ┆ 862083.5 ┆ 1846.05 ┆ … ┆ 713.06736 ┆ 2550.2701 ┆ 927.15964 ┆ -0.004685 │\n", - "│ ┆ ┆ ┆ ┆ ┆ 8 ┆ 5 ┆ 9 ┆ │\n", - "│ 000001.SZ ┆ 20200107 ┆ 728607.56 ┆ 1850.42 ┆ … ┆ 709.74110 ┆ 2538.3738 ┆ 922.83470 ┆ -0.022743 │\n", - "│ ┆ ┆ ┆ ┆ ┆ 6 ┆ 46 ┆ 6 ┆ │\n", - "│ 000001.SZ ┆ 20200108 ┆ 847824.12 ┆ 1815.49 ┆ … ┆ 730.61584 ┆ 2613.0319 ┆ 949.97690 ┆ -0.008401 │\n", - "│ ┆ ┆ ┆ ┆ ┆ 4 ┆ 01 ┆ 3 ┆ │\n", - "└───────────┴────────────┴───────────┴─────────┴───┴───────────┴───────────┴───────────┴───────────┘\n", + "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬───────────┬──────────┐\n", + "│ ts_code ┆ trade_dat ┆ turnover_ ┆ volume_ra ┆ … ┆ profit_to ┆ cashflow_ ┆ operate_p ┆ future_r │\n", + "│ --- ┆ e ┆ rate ┆ tio ┆ ┆ _market_c ┆ to_market ┆ rofit_to_ ┆ eturn_5 │\n", + "│ str ┆ --- ┆ --- ┆ --- ┆ ┆ ap ┆ _cap ┆ market_ca ┆ --- │\n", + "│ ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ --- ┆ p ┆ f64 │\n", + "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ --- ┆ │\n", + "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ │\n", + "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n", + "│ 000001.SZ ┆ 20200102 ┆ 0.7885 ┆ 2.18 ┆ … ┆ 721.52104 ┆ 2580.5045 ┆ 938.15146 ┆ -0.00474 │\n", + "│ ┆ ┆ ┆ ┆ ┆ 1 ┆ 33 ┆ 4 ┆ 6 │\n", + "│ 000001.SZ ┆ 20200103 ┆ 0.5752 ┆ 1.21 ┆ … ┆ 708.50174 ┆ 2533.9412 ┆ 921.22323 ┆ -0.02852 │\n", + "│ ┆ ┆ ┆ ┆ ┆ 4 ┆ 96 ┆ 7 ┆ │\n", + "│ 000001.SZ ┆ 20200106 ┆ 0.4442 ┆ 0.8 ┆ … ┆ 713.06736 ┆ 2550.2701 ┆ 927.15964 ┆ -0.00468 │\n", + "│ ┆ ┆ ┆ ┆ ┆ 8 ┆ 5 ┆ 9 ┆ 5 │\n", + "│ 000001.SZ ┆ 20200107 ┆ 0.3755 ┆ 0.7 ┆ … ┆ 709.74110 ┆ 2538.3738 ┆ 922.83470 ┆ -0.02274 │\n", + "│ ┆ ┆ ┆ ┆ ┆ 6 ┆ 46 ┆ 6 ┆ 3 │\n", + "│ 000001.SZ ┆ 20200108 ┆ 0.4369 ┆ 0.86 ┆ … ┆ 730.61584 ┆ 2613.0319 ┆ 949.97690 ┆ -0.00840 │\n", + "│ ┆ ┆ ┆ ┆ ┆ 4 ┆ 01 ┆ 3 ┆ 1 │\n", + "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴───────────┴──────────┘\n", "\n", "[配置] 训练期: 20200101 - 20231231\n", "[配置] 验证期: 20240101 - 20241231\n", - "[配置] 测试期: 20250101 - 20261231\n", + "[配置] 测试期: 20250101 - 20251231\n", "[配置] 特征数: 34\n", "[配置] 目标变量: future_return_5\n" ] @@ -495,8 +495,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2026-03-08T06:10:37.221864Z", - "start_time": "2026-03-08T06:10:27.670279Z" + "end_time": "2026-03-08T12:42:17.812047Z", + "start_time": "2026-03-08T12:42:08.881623Z" } }, "source": [ @@ -532,11 +532,11 @@ "[步骤 1/6] 股票池筛选\n", "------------------------------------------------------------\n", " 执行每日独立筛选股票池...\n", - " 筛选前数据规模: (7255513, 53)\n", - " 筛选后数据规模: (4654331, 53)\n", - " 筛选前股票数: 5694\n", - " 筛选后股票数: 3364\n", - " 删除记录数: 2601182\n" + " 筛选前数据规模: (7044952, 53)\n", + " 筛选后数据规模: (4532198, 53)\n", + " 筛选前股票数: 5678\n", + " 筛选后股票数: 3359\n", + " 删除记录数: 2512754\n" ] } ], @@ -546,8 +546,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2026-03-08T06:10:39.192697Z", - "start_time": "2026-03-08T06:10:37.226314Z" + "end_time": "2026-03-08T12:42:19.603242Z", + "start_time": "2026-03-08T12:42:17.822762Z" } }, "source": [ @@ -594,78 +594,79 @@ "------------------------------------------------------------\n", " 训练集数据规模: (2991506, 53)\n", " 验证集数据规模: (769485, 53)\n", - " 测试集数据规模: (893340, 53)\n", + " 测试集数据规模: (771207, 53)\n", " 训练集股票数: 3297\n", " 验证集股票数: 3220\n", - " 测试集股票数: 3220\n", + " 测试集股票数: 3215\n", " 训练集日期范围: 20200102 - 20231229\n", " 验证集日期范围: 20240102 - 20241231\n", - " 测试集日期范围: 20250102 - 20260306\n", + " 测试集日期范围: 20250102 - 20251231\n", "\n", " 训练集前5行预览:\n", "shape: (5, 53)\n", - "┌───────────┬────────────┬───────────┬─────────┬───┬───────────┬───────────┬───────────┬───────────┐\n", - "│ ts_code ┆ trade_date ┆ vol ┆ low ┆ … ┆ profit_to ┆ cashflow_ ┆ operate_p ┆ future_re │\n", - "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ _market_c ┆ to_market ┆ rofit_to_ ┆ turn_5 │\n", - "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ ap ┆ _cap ┆ market_ca ┆ --- │\n", - "│ ┆ ┆ ┆ ┆ ┆ --- ┆ --- ┆ p ┆ f64 │\n", - "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ --- ┆ │\n", - "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ │\n", - "╞═══════════╪════════════╪═══════════╪═════════╪═══╪═══════════╪═══════════╪═══════════╪═══════════╡\n", - "│ 000001.SZ ┆ 20200102 ┆ 1.5302e6 ┆ 1806.75 ┆ … ┆ 721.52104 ┆ 2580.5045 ┆ 938.15146 ┆ -0.004746 │\n", - "│ ┆ ┆ ┆ ┆ ┆ 1 ┆ 33 ┆ 4 ┆ │\n", - "│ 000002.SZ ┆ 20200102 ┆ 1012130.4 ┆ 4824.87 ┆ … ┆ 776.91820 ┆ 47.131053 ┆ 1140.2493 ┆ -0.011057 │\n", - "│ ┆ ┆ ┆ ┆ ┆ 1 ┆ ┆ 95 ┆ │\n", - "│ 000004.SZ ┆ 20200102 ┆ 17853.2 ┆ 90.1 ┆ … ┆ -69.58089 ┆ -52.61755 ┆ -24.82135 ┆ -0.000441 │\n", - "│ ┆ ┆ ┆ ┆ ┆ 5 ┆ 4 ┆ 9 ┆ │\n", - "│ 000005.SZ ┆ 20200102 ┆ 104134.12 ┆ 28.82 ┆ … ┆ 142.55925 ┆ 385.57490 ┆ 208.12520 ┆ 0.022337 │\n", - "│ ┆ ┆ ┆ ┆ ┆ 6 ┆ 4 ┆ 2 ┆ │\n", - "│ 000006.SZ ┆ 20200102 ┆ 124751.76 ┆ 190.24 ┆ … ┆ 633.27582 ┆ 650.95370 ┆ 819.10495 ┆ 0.012964 │\n", - "│ ┆ ┆ ┆ ┆ ┆ ┆ 3 ┆ 5 ┆ │\n", - "└───────────┴────────────┴───────────┴─────────┴───┴───────────┴───────────┴───────────┴───────────┘\n", + "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬───────────┬──────────┐\n", + "│ ts_code ┆ trade_dat ┆ turnover_ ┆ volume_ra ┆ … ┆ profit_to ┆ cashflow_ ┆ operate_p ┆ future_r │\n", + "│ --- ┆ e ┆ rate ┆ tio ┆ ┆ _market_c ┆ to_market ┆ rofit_to_ ┆ eturn_5 │\n", + "│ str ┆ --- ┆ --- ┆ --- ┆ ┆ ap ┆ _cap ┆ market_ca ┆ --- │\n", + "│ ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ --- ┆ p ┆ f64 │\n", + "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ --- ┆ │\n", + "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ │\n", + "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n", + "│ 000001.SZ ┆ 20200102 ┆ 0.7885 ┆ 2.18 ┆ … ┆ 721.52104 ┆ 2580.5045 ┆ 938.15146 ┆ -0.00474 │\n", + "│ ┆ ┆ ┆ ┆ ┆ 1 ┆ 33 ┆ 4 ┆ 6 │\n", + "│ 000002.SZ ┆ 20200102 ┆ 1.0418 ┆ 1.31 ┆ … ┆ 776.91820 ┆ 47.131053 ┆ 1140.2493 ┆ -0.01105 │\n", + "│ ┆ ┆ ┆ ┆ ┆ 1 ┆ ┆ 95 ┆ 7 │\n", + "│ 000004.SZ ┆ 20200102 ┆ 2.1613 ┆ 0.92 ┆ … ┆ -69.58089 ┆ -52.61755 ┆ -24.82135 ┆ -0.00044 │\n", + "│ ┆ ┆ ┆ ┆ ┆ 5 ┆ 4 ┆ 9 ┆ 1 │\n", + "│ 000005.SZ ┆ 20200102 ┆ 0.9843 ┆ 1.35 ┆ … ┆ 142.55925 ┆ 385.57490 ┆ 208.12520 ┆ 0.022337 │\n", + "│ ┆ ┆ ┆ ┆ ┆ 6 ┆ 4 ┆ 2 ┆ │\n", + "│ 000006.SZ ┆ 20200102 ┆ 0.9252 ┆ 1.62 ┆ … ┆ 633.27582 ┆ 650.95370 ┆ 819.10495 ┆ 0.012964 │\n", + "│ ┆ ┆ ┆ ┆ ┆ ┆ 3 ┆ 5 ┆ │\n", + "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴───────────┴──────────┘\n", "\n", " 验证集前5行预览:\n", "shape: (5, 53)\n", - "┌───────────┬────────────┬───────────┬─────────┬───┬───────────┬───────────┬───────────┬───────────┐\n", - "│ ts_code ┆ trade_date ┆ vol ┆ low ┆ … ┆ profit_to ┆ cashflow_ ┆ operate_p ┆ future_re │\n", - "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ _market_c ┆ to_market ┆ rofit_to_ ┆ turn_5 │\n", - "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ ap ┆ _cap ┆ market_ca ┆ --- │\n", - "│ ┆ ┆ ┆ ┆ ┆ --- ┆ --- ┆ p ┆ f64 │\n", - "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ --- ┆ │\n", - "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ │\n", - "╞═══════════╪════════════╪═══════════╪═════════╪═══╪═══════════╪═══════════╪═══════════╪═══════════╡\n", - "│ 000001.SZ ┆ 20240102 ┆ 1.1584e6 ┆ 1074.93 ┆ … ┆ 2217.6093 ┆ 6486.3743 ┆ 2744.2180 ┆ -0.003256 │\n", - "│ ┆ ┆ ┆ ┆ ┆ 09 ┆ 45 ┆ 84 ┆ │\n", - "│ 000002.SZ ┆ 20240102 ┆ 811106.29 ┆ 1844.3 ┆ … ┆ 1736.4093 ┆ 19.432701 ┆ 2329.7434 ┆ -0.026601 │\n", - "│ ┆ ┆ ┆ ┆ ┆ 99 ┆ ┆ 1 ┆ │\n", - "│ 000004.SZ ┆ 20240102 ┆ 28867.0 ┆ 65.23 ┆ … ┆ -168.7552 ┆ -184.4013 ┆ -192.7135 ┆ -0.014789 │\n", - "│ ┆ ┆ ┆ ┆ ┆ 72 ┆ 85 ┆ 84 ┆ │\n", - "│ 000005.SZ ┆ 20240102 ┆ 63028.0 ┆ 10.01 ┆ … ┆ -96.94997 ┆ -295.0388 ┆ -46.06373 ┆ -0.05395 │\n", - "│ ┆ ┆ ┆ ┆ ┆ 7 ┆ 72 ┆ 6 ┆ │\n", - "│ 000006.SZ ┆ 20240102 ┆ 261947.19 ┆ 176.84 ┆ … ┆ -6.971845 ┆ -51.5536 ┆ -5.32671 ┆ -0.013454 │\n", - "└───────────┴────────────┴───────────┴─────────┴───┴───────────┴───────────┴───────────┴───────────┘\n", + "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬───────────┬──────────┐\n", + "│ ts_code ┆ trade_dat ┆ turnover_ ┆ volume_ra ┆ … ┆ profit_to ┆ cashflow_ ┆ operate_p ┆ future_r │\n", + "│ --- ┆ e ┆ rate ┆ tio ┆ ┆ _market_c ┆ to_market ┆ rofit_to_ ┆ eturn_5 │\n", + "│ str ┆ --- ┆ --- ┆ --- ┆ ┆ ap ┆ _cap ┆ market_ca ┆ --- │\n", + "│ ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ --- ┆ p ┆ f64 │\n", + "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ --- ┆ │\n", + "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ │\n", + "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n", + "│ 000001.SZ ┆ 20240102 ┆ 0.5969 ┆ 1.41 ┆ … ┆ 2217.6093 ┆ 6486.3743 ┆ 2744.2180 ┆ -0.00325 │\n", + "│ ┆ ┆ ┆ ┆ ┆ 09 ┆ 45 ┆ 84 ┆ 6 │\n", + "│ 000002.SZ ┆ 20240102 ┆ 0.8348 ┆ 1.71 ┆ … ┆ 1736.4093 ┆ 19.432701 ┆ 2329.7434 ┆ -0.02660 │\n", + "│ ┆ ┆ ┆ ┆ ┆ 99 ┆ ┆ 1 ┆ 1 │\n", + "│ 000004.SZ ┆ 20240102 ┆ 2.2858 ┆ 0.78 ┆ … ┆ -168.7552 ┆ -184.4013 ┆ -192.7135 ┆ -0.01478 │\n", + "│ ┆ ┆ ┆ ┆ ┆ 72 ┆ 85 ┆ 84 ┆ 9 │\n", + "│ 000005.SZ ┆ 20240102 ┆ 0.5958 ┆ 0.43 ┆ … ┆ -96.94997 ┆ -295.0388 ┆ -46.06373 ┆ -0.05395 │\n", + "│ ┆ ┆ ┆ ┆ ┆ 7 ┆ 72 ┆ 6 ┆ │\n", + "│ 000006.SZ ┆ 20240102 ┆ 1.9404 ┆ 0.97 ┆ … ┆ -6.971845 ┆ -51.5536 ┆ -5.32671 ┆ -0.01345 │\n", + "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 4 │\n", + "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴───────────┴──────────┘\n", "\n", " 测试集前5行预览:\n", "shape: (5, 53)\n", - "┌───────────┬────────────┬───────────┬─────────┬───┬───────────┬───────────┬───────────┬───────────┐\n", - "│ ts_code ┆ trade_date ┆ vol ┆ low ┆ … ┆ profit_to ┆ cashflow_ ┆ operate_p ┆ future_re │\n", - "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ _market_c ┆ to_market ┆ rofit_to_ ┆ turn_5 │\n", - "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ ap ┆ _cap ┆ market_ca ┆ --- │\n", - "│ ┆ ┆ ┆ ┆ ┆ --- ┆ --- ┆ p ┆ f64 │\n", - "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ --- ┆ │\n", - "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ │\n", - "╞═══════════╪════════════╪═══════════╪═════════╪═══╪═══════════╪═══════════╪═══════════╪═══════════╡\n", - "│ 000001.SZ ┆ 20250102 ┆ 1.8196e6 ┆ 1455.46 ┆ … ┆ 1791.1304 ┆ 6183.5904 ┆ 2158.1117 ┆ -0.002622 │\n", - "│ ┆ ┆ ┆ ┆ ┆ 08 ┆ 38 ┆ 45 ┆ │\n", - "│ 000002.SZ ┆ 20250102 ┆ 1.1827e6 ┆ 1284.65 ┆ … ┆ -1933.116 ┆ -1110.658 ┆ -1729.069 ┆ -0.022509 │\n", - "│ ┆ ┆ ┆ ┆ ┆ 105 ┆ 303 ┆ 737 ┆ │\n", - "│ 000004.SZ ┆ 20250102 ┆ 119760.37 ┆ 54.17 ┆ … ┆ -199.1144 ┆ -126.8907 ┆ -197.3308 ┆ -0.064897 │\n", - "│ ┆ ┆ ┆ ┆ ┆ 31 ┆ 63 ┆ 47 ┆ │\n", - "│ 000006.SZ ┆ 20250102 ┆ 307195.1 ┆ 285.33 ┆ … ┆ -646.1294 ┆ 74.343232 ┆ -637.5489 ┆ -0.048278 │\n", - "│ ┆ ┆ ┆ ┆ ┆ 33 ┆ ┆ 17 ┆ │\n", - "│ 000007.SZ ┆ 20250102 ┆ 68219.01 ┆ 57.49 ┆ … ┆ 6.740918 ┆ 783.72753 ┆ 22.556002 ┆ 0.015649 │\n", - "│ ┆ ┆ ┆ ┆ ┆ ┆ 9 ┆ ┆ │\n", - "└───────────┴────────────┴───────────┴─────────┴───┴───────────┴───────────┴───────────┴───────────┘\n" + "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬───────────┬──────────┐\n", + "│ ts_code ┆ trade_dat ┆ turnover_ ┆ volume_ra ┆ … ┆ profit_to ┆ cashflow_ ┆ operate_p ┆ future_r │\n", + "│ --- ┆ e ┆ rate ┆ tio ┆ ┆ _market_c ┆ to_market ┆ rofit_to_ ┆ eturn_5 │\n", + "│ str ┆ --- ┆ --- ┆ --- ┆ ┆ ap ┆ _cap ┆ market_ca ┆ --- │\n", + "│ ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ --- ┆ p ┆ f64 │\n", + "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ --- ┆ │\n", + "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ │\n", + "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n", + "│ 000001.SZ ┆ 20250102 ┆ 0.9377 ┆ 1.38 ┆ … ┆ 1791.1304 ┆ 6183.5904 ┆ 2158.1117 ┆ -0.00262 │\n", + "│ ┆ ┆ ┆ ┆ ┆ 08 ┆ 38 ┆ 45 ┆ 2 │\n", + "│ 000002.SZ ┆ 20250102 ┆ 1.2171 ┆ 1.06 ┆ … ┆ -1933.116 ┆ -1110.658 ┆ -1729.069 ┆ -0.02250 │\n", + "│ ┆ ┆ ┆ ┆ ┆ 105 ┆ 303 ┆ 737 ┆ 9 │\n", + "│ 000004.SZ ┆ 20250102 ┆ 9.4831 ┆ 0.8 ┆ … ┆ -199.1144 ┆ -126.8907 ┆ -197.3308 ┆ -0.06489 │\n", + "│ ┆ ┆ ┆ ┆ ┆ 31 ┆ 63 ┆ 47 ┆ 7 │\n", + "│ 000006.SZ ┆ 20250102 ┆ 2.2755 ┆ 0.79 ┆ … ┆ -646.1294 ┆ -325.4842 ┆ -637.5489 ┆ -0.04827 │\n", + "│ ┆ ┆ ┆ ┆ ┆ 33 ┆ 66 ┆ 17 ┆ 8 │\n", + "│ 000007.SZ ┆ 20250102 ┆ 1.9691 ┆ 1.05 ┆ … ┆ 6.740918 ┆ 108.91759 ┆ 22.556002 ┆ 0.015649 │\n", + "│ ┆ ┆ ┆ ┆ ┆ ┆ 8 ┆ ┆ │\n", + "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴───────────┴──────────┘\n" ] } ], @@ -675,8 +676,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2026-03-08T06:10:40.545732Z", - "start_time": "2026-03-08T06:10:39.198908Z" + "end_time": "2026-03-08T12:42:20.933369Z", + "start_time": "2026-03-08T12:42:19.615723Z" } }, "source": [ @@ -731,20 +732,23 @@ "\n", " 训练集处理后前5行预览:\n", "shape: (5, 53)\n", - "┌───────────┬───────────┬───────────┬──────────┬───┬───────────┬───────────┬───────────┬───────────┐\n", - "│ ts_code ┆ trade_dat ┆ vol ┆ low ┆ … ┆ profit_to ┆ cashflow_ ┆ operate_p ┆ future_re │\n", - "│ --- ┆ e ┆ --- ┆ --- ┆ ┆ _market_c ┆ to_market ┆ rofit_to_ ┆ turn_5 │\n", - "│ str ┆ --- ┆ f64 ┆ f64 ┆ ┆ ap ┆ _cap ┆ market_ca ┆ --- │\n", - "│ ┆ str ┆ ┆ ┆ ┆ --- ┆ --- ┆ p ┆ f64 │\n", - "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ --- ┆ │\n", - "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ │\n", - "╞═══════════╪═══════════╪═══════════╪══════════╪═══╪═══════════╪═══════════╪═══════════╪═══════════╡\n", - "│ 000001.SZ ┆ 20200102 ┆ 4.749919 ┆ 7.140527 ┆ … ┆ 1.223327 ┆ 2.58711 ┆ 1.420902 ┆ -0.004746 │\n", - "│ 000002.SZ ┆ 20200102 ┆ 2.92576 ┆ 7.140527 ┆ … ┆ 1.348024 ┆ -0.147052 ┆ 1.826328 ┆ -0.011057 │\n", - "│ 000004.SZ ┆ 20200102 ┆ -0.574944 ┆ 0.102278 ┆ … ┆ -0.557417 ┆ -0.254707 ┆ -0.510901 ┆ -0.000441 │\n", - "│ 000005.SZ ┆ 20200102 ┆ -0.271162 ┆ -0.29962 ┆ … ┆ -0.079896 ┆ 0.218216 ┆ -0.043591 ┆ 0.022337 │\n", - "│ 000006.SZ ┆ 20200102 ┆ -0.19857 ┆ 0.759033 ┆ … ┆ 1.02469 ┆ 0.504628 ┆ 1.182085 ┆ 0.012964 │\n", - "└───────────┴───────────┴───────────┴──────────┴───┴───────────┴───────────┴───────────┴───────────┘\n", + "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬───────────┬──────────┐\n", + "│ ts_code ┆ trade_dat ┆ turnover_ ┆ volume_ra ┆ … ┆ profit_to ┆ cashflow_ ┆ operate_p ┆ future_r │\n", + "│ --- ┆ e ┆ rate ┆ tio ┆ ┆ _market_c ┆ to_market ┆ rofit_to_ ┆ eturn_5 │\n", + "│ str ┆ --- ┆ --- ┆ --- ┆ ┆ ap ┆ _cap ┆ market_ca ┆ --- │\n", + "│ ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ --- ┆ p ┆ f64 │\n", + "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ --- ┆ │\n", + "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ │\n", + "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n", + "│ 000001.SZ ┆ 20200102 ┆ -0.492311 ┆ 2.080178 ┆ … ┆ 1.441327 ┆ 2.715295 ┆ 1.645238 ┆ -0.00474 │\n", + "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 6 │\n", + "│ 000002.SZ ┆ 20200102 ┆ -0.40826 ┆ 0.478477 ┆ … ┆ 1.5879 ┆ -0.110121 ┆ 2.111027 ┆ -0.01105 │\n", + "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 7 │\n", + "│ 000004.SZ ┆ 20200102 ┆ -0.036785 ┆ -0.239526 ┆ … ┆ -0.651808 ┆ -0.221369 ┆ -0.574193 ┆ -0.00044 │\n", + "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 1 │\n", + "│ 000005.SZ ┆ 20200102 ┆ -0.42734 ┆ 0.552119 ┆ … ┆ -0.090517 ┆ 0.267338 ┆ -0.037305 ┆ 0.022337 │\n", + "│ 000006.SZ ┆ 20200102 ┆ -0.446951 ┆ 1.049198 ┆ … ┆ 1.207844 ┆ 0.563309 ┆ 1.370863 ┆ 0.012964 │\n", + "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴───────────┴──────────┘\n", "\n", " 训练集特征统计:\n", " 特征数: 34\n", @@ -764,8 +768,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2026-03-08T06:10:58.361151Z", - "start_time": "2026-03-08T06:10:40.549989Z" + "end_time": "2026-03-08T12:42:38.165178Z", + "start_time": "2026-03-08T12:42:20.939484Z" } }, "source": [ @@ -822,8 +826,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2026-03-08T06:10:58.523203Z", - "start_time": "2026-03-08T06:10:58.364995Z" + "end_time": "2026-03-08T12:42:38.355756Z", + "start_time": "2026-03-08T12:42:38.169740Z" } }, "source": [ @@ -852,14 +856,14 @@ "[步骤 5/6] 测试集数据处理\n", "------------------------------------------------------------\n", " [1/3] 应用处理器: NullFiller\n", - " 处理前记录数: 893340\n", - " 处理后记录数: 893340\n", + " 处理前记录数: 771207\n", + " 处理后记录数: 771207\n", " [2/3] 应用处理器: Winsorizer\n", - " 处理前记录数: 893340\n", - " 处理后记录数: 893340\n", + " 处理前记录数: 771207\n", + " 处理后记录数: 771207\n", " [3/3] 应用处理器: StandardScaler\n", - " 处理前记录数: 893340\n", - " 处理后记录数: 893340\n" + " 处理前记录数: 771207\n", + " 处理后记录数: 771207\n" ] } ], @@ -869,8 +873,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2026-03-08T06:10:59.948592Z", - "start_time": "2026-03-08T06:10:58.533879Z" + "end_time": "2026-03-08T12:42:39.677665Z", + "start_time": "2026-03-08T12:42:38.364128Z" } }, "source": [ @@ -900,15 +904,15 @@ "\n", "[步骤 6/6] 生成预测\n", "------------------------------------------------------------\n", - " 测试样本数: 893340\n", + " 测试样本数: 771207\n", " 预测中...\n", " 预测完成!\n", "\n", " 预测结果统计:\n", - " 均值: -0.000990\n", - " 标准差: 0.008152\n", - " 最小值: -0.145569\n", - " 最大值: 0.102702\n" + " 均值: -0.000501\n", + " 标准差: 0.008088\n", + " 最小值: -0.154524\n", + " 最大值: 0.096327\n" ] } ], @@ -925,8 +929,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2026-03-08T06:11:05.252510Z", - "start_time": "2026-03-08T06:10:59.952123Z" + "end_time": "2026-03-08T12:42:42.772470Z", + "start_time": "2026-03-08T12:42:39.683522Z" } }, "source": [ @@ -1005,19 +1009,19 @@ "重新训练模型以收集训练指标...\n", "Training until validation scores don't improve for 100 rounds\n", "Early stopping, best iteration is:\n", - "[147]\ttrain's l1: 0.0424037\tval's l1: 0.0535696\n", + "[31]\ttrain's l1: 0.0428788\tval's l1: 0.0539432\n", "训练完成,指标已收集\n", "\n", "评估指标: l1\n", "\n", "[早停信息]\n", " 配置的最大轮数: 1000\n", - " 实际训练轮数: 247\n", + " 实际训练轮数: 131\n", " 早停状态: 已触发(连续100轮验证指标未改善)\n", "\n", "最终指标:\n", - " 训练 l1: 0.042166\n", - " 验证 l1: 0.053583\n" + " 训练 l1: 0.042513\n", + " 验证 l1: 0.053961\n" ] } ], @@ -1027,8 +1031,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2026-03-08T06:11:05.495565Z", - "start_time": "2026-03-08T06:11:05.256254Z" + "end_time": "2026-03-08T12:42:43.013683Z", + "start_time": "2026-03-08T12:42:42.777555Z" } }, "source": [ @@ -1076,7 +1080,7 @@ "text/plain": [ "
" ], - "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAemRJREFUeJzt3QecE2X+x/Hf7mYLCyx96VWQLggIBxZQEBAUEUTFQpHDjiJWFEFExYqgougpqP+T4p5iRTkE9VSwICDCiV1BOoj07fm/fs/exElIstlsdjbZ/bx9PWYymSST2QyTfPN7nolzu91uAQAAAAAAABwU7+STAQAAAAAAAIpQCgAAAAAAAI4jlAIAAAAAAIDjCKUAAAAAAADgOEIpAAAAAAAAOI5QCgAAAAAAAI4jlAIAAAAAAIDjCKUAAAAAAADgOEIpAAAAAAAAOI5QCgCAKPTCCy9IXFycp0VCkyZNPI939913R+QxyyrdPta20u0WjezvD32/FPe9UxqvuSTe5wAAIHYQSgEA4Ce0CbV9+OGHbD/IAw884PW++OKLLwJuldGjR3uWS0pKkt27d5fJLVhWAid7WKft119/LfQ+y5YtkxtuuEF69OghqampRb5/IG63W5YsWSKXXXaZHH/88ZKWliaJiYlSu3Zt6d27tzz44IOyffv2sB8fAACnuRx/RgAAUKiTTjpJHn744YhuqTvvvFP2799vpvXLMiJHQwLdvvn5+eb6//3f/0nXrl2PWe7o0aPy6quveq4PHDhQatWqFfXvnZISS+taFLNnz5Y33ngjoo+5ZcsWufjii+WTTz455rZdu3bJihUrTPv222+9KucAAIhmhFIAAPgJbdS+ffvk/vvv91w/88wzpW/fvl7b67jjjgu4/Q4cOGAqGcLRtm1b0yJp7NixEX08/KV+/frm/bF06VJzfeHChTJjxgxTxWK3ePFiOXjwoOf6qFGjIr4ZS+K9U1JiaV2LQiuiGjRoIF26dJG8vDx56623ivV4O3fulJ49e8ovv/zimde0aVMZNGiQqZLSf6s+++wzv4FVpOnrycrKMhVgAAAUF933AACwhTY333yzp/mGOFpdZL/9/PPPl0aNGnl15Xv++eelU6dOUqFCBTnttNPM/fSL5Pjx4+XUU0+Vhg0bSsWKFSU5OdkEGeecc47fL6zBuj716tXLM19DjR9++EGGDx8uNWvWlJSUFPP8/qo0Ao0ppettf66ff/5ZnnrqKTnhhBPM46Wnp8vf//5388XX15EjR2TixIlmO+iyGjDMmTPHvOZwujnqcmPGjDGvoW7dumY76Zff5s2bm25v33zzzTH30W1gPY9uG+2+dMUVV3ju37p1a/nHP/7h9/n08c4++2wTHmrr37+/rFmzRsKh62fZs2ePvPvuu8csoxVUFt2uWimltFpo8ODBpktW9erVTZhVtWpVU2113333yeHDhyPWbS6c16xhmlaD6XtCQxDtdlipUiVp06aNXHfddV5d0nRan9e+PZR9naz3X2HrqpVljz32mJx88slSrVo187z6/AMGDJBXXnnlmOWL816OpPnz55vKJt1uQ4YMKfbj6b8f9kDq6quvlu+//15mzpxp9r+HHnpI/vOf/8h3331nwtFA+0awbWX/G/reb/Pmzebvr9te35u6TQvbv7t16+a53fff0q+//louv/xyE+rrv5X6XjrxxBPNjwBFea8DAMoANwAA8OuXX35x66HSalOmTAl6+6mnnup1vUOHDma5t956y2u+vzZ16lSvx543b57X7XY9e/b0zD/hhBPclStXPubx4uLi3O+//77X/Ro3buz3tXzwwQde9z3llFP8ruNpp53m9XjZ2dnHvGarnXPOOV7X9TlCcdNNNwXdTklJSe5ly5Z53WfkyJGe25s1a+auW7eu3/s+//zzXvf78ssv3ZUqVTpmuZSUFHfv3r0913W7hSIzM9NdtWpVz/3OP/98r9u3b9/uTkhI8Nx+4403em6rUaNG0Nfdvn1798GDB70ez367vl9Cee+E+5qHDh0adP3S0tLc69ev97tf+GvW+y/Yuur2atu2bdDH0fXKyckp9ns5GF1X+3319RWF72ss6v23bdtm9mfr/h07dnTn5eWFdF/7vqH/btj5biv7etnv16JFC3edOnW8ll28eLHXvn/FFVd4PfaPP/7otfzKlSs9tz311FNul8sV8G/apk0b87cHAJQPdN8DACBCPv74Y2ncuLEMHTrUVPfoOC/K5XJJx44dTVceHT9Iq1O0GuDTTz+VDz74wCwzbdo0UyGk1VNFsX79elNBcuONN5qqEq0I0u41mllo9Y0OflxU2gVI76eVYa+//rqnOkkrMbSL0N/+9jdzfdasWeY1W7Qa5dxzzzVVEG+++aaEQ6vItJtS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d9euXd2fffYZfw6UaxdeeKG7bt26Zp+oX7++uf7jjz96bj969Kj7mmuucVerVs2dmprqPu+889zbt28v1XUGStoHH3xgTkHs2/T09io/P9991113uWvXru1OTk529+7d2/3dd995PcbevXvdw4cPd1eqVMmchnj06NHugwcP8sdDudlXjhw54u7bt6+7Vq1a5nT3jRs3do8dO9brNN2KfQVlnb99RNu8efOK9Hnr119/dZ911lnuChUquGvWrOm+6aab3Dk5OaXwioDS2Vc2b97sPu2009zVq1c3n7+aN2/uvuWWW9z79++PuX0lTv9X2sEYAAAAAAAAyhfGlAIAAAAAAIDjCKUAAAAAAADgOEIpAAAAAAAAOI5QCgAAAAAAAI4jlAIAAAAAAIDjCKUAAAAAAADgOEIpAAAAAAAAOI5QCgAAAAAAAI4jlAIAACinPvzwQ4mLizOXAAAATiOUAgAAiJAXXnjBhDyrV68215csWSJ33313qW/fp556yqwbAABANCGUAgAAKCEaSk2dOjVqQ6nTTjtNjh49ai4BAACcRigFAAAQQ9xutwmSIiE+Pl5SUlLMJQAAgNP4BAIAAFACRo0aJbNnzzbT2qXPapb8/HyZOXOmtG3b1gRDtWvXliuvvFL27dvn9ThNmjSRs88+W5YuXSpdunSRChUqyDPPPGNumzdvnpxxxhmSnp4uycnJ0qZNG3n66aePuf/GjRvlo48+8qxDr169go4plZGRIZ07dzbPVbNmTbn00ktl69atx7y+SpUqmfmDBw8207Vq1ZKbb75Z8vLyIrw1AQBAWeQq7RUAAAAoizRg2rZtmyxbtkz+7//+z+/t2qVu9OjRcv3118svv/wiTz75pKxdu1Y+/fRTSUxM9Cz73XffyfDhw819xo4dKy1btjTzNYDSUGvQoEHicrnkrbfekmuuucYEXtdee61ZRoOvcePGmdDozjvvNPM0AAvEWqeTTjpJpk+fLjt37pRZs2aZddJ1q1q1qmdZDZ/69esn3bp1k0ceeUTef/99efTRR+W4446Tq6++OqLbEwAAlD1xbq0BBwAAQLFZgc6XX35pqpquu+46Uy3l+3Hrk08+kVNPPVVefvllufjiiz3ztRqqf//+XvO10um3336T9957zwRAdtqNT6uZ7PT+P/zwg/z000+eee3atTMVT74VUXr99NNPlw8++MBUT+Xk5EiDBg1M5ZW+Bq3gUu+8846p1po8ebJnjCytlHrxxRflnnvukbvuusvzmJ06dTLdAa3B3gEAAAKh+x4AAIDDtHtclSpV5Mwzz5Q9e/Z4mnaZ04omDYnsmjZtekwgpeyB1P79+81j9OzZU37++Wdzvag0SNq1a5eptrICKTVw4EBp1aqVCad8XXXVVV7XNWzT5wcAACgM3fcAAAAcppVMGhppRZI/Ggz5hlL+aJe6KVOmyKpVq+TIkSNet+nja/BVFFqRpazugXYaSmmFl50GVzqOlF21atWOGRcLAADAH0IpAAAAh+mYTxpIaTc9f3yDHt8uekq75/Xu3duERTNmzJCGDRtKUlKSLFmyRB577DHzHCUtISGhxJ8DAACUXYRSAAAAJcR+tj07HQhcBwU/+eST/QZOodBBzbOysuTNN9+URo0aeeb7dv0Lth6+Gjdu7BlYXc/qZ6fzrNsBAAAigTGlAAAASkjFihXN5Z9//uk1/4ILLjBnrps2bdox98nNzT1m+WBVSvZB1LXL3rx58/yuRyiPqYOzawXXnDlzTOBleffdd+Xbb781Y0sBAABECpVSAAAAJUQHLlfXX3+9Gahcg6SLLrrIDEZ+5ZVXyvTp02XdunXSt29fSUxMNGNN6SDos2bNkvPPPz/oY+t9tLveOeecYx7r0KFD8o9//MOEStu3bz9mPZ5++mm59957pXnz5mYZ30oopevw4IMPmjMI6joOHz5cdu7cadZHzwJ44403RngLAQCA8oxQCgAAoIQMGTJExo0bJwsXLpR//vOfpqpJQyml1UgaFj3zzDNyxx13iMvlMsHPpZdearr1FUYHI//Xv/4lkyZNkptvvlnq1KkjV199tRmP6vLLL/dadvLkyWYQ84ceekgOHjxoAid/oZQaNWqUpKamygMPPCC33XabqbI677zzTFhVtWrVCG0ZAAAAkTi3veYbAAAAAAAAcABjSgEAAAAAAMBxhFIAAAAAAABwHKEUAAAAAAAAHEcoBQAAAAAAAMcRSgEAAAAAAMBxhFIAAAAAAABwHKEUAAAAAAAAHEcoBQAAAAAAAMcRSgEAAAAAAMBxhFIAAAAAAABwHKEUAAAAAAAAHEcoBQAAAAAAAMcRSgEAAAAAAECc9v+IF9Spm0Li+gAAAABJRU5ErkJggg==" + "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAdsRJREFUeJzt3Ql8E2X+x/Ff2vQAuY9y36DIIQgIggcqCCirIoiKKIcsnlziCSLIoqJ/BUFBkV1FdxcEu4onogjqqqCAoIgr3ohyFVBueuf/+j0wMUmTNm3TyTT9vH2NmcxMkknydEi++T3PuDwej0cAAAAAAAAAG8XZ+WAAAAAAAACAIpQCAAAAAACA7QilAAAAAAAAYDtCKQAAAAAAANiOUAoAAAAAAAC2I5QCAAAAAACA7QilAAAAAAAAYDtCKQAAAAAAANiOUAoAAAAAAAC2I5QCAMCBnn/+eXG5XN4pEho3buy9v/vvvz8i9xmr9PWxXit93ZzIt31oeylu24nGcy6Jdg4AAEoPQikAAIKENuFOH3zwAa8f5OGHH/ZrF2vXrg35qgwfPty7XWJiouzZsycmX8FYCZx8wzqdtm7dWuBtVqxYIWPHjpVu3bpJ+fLlC337UDwejyxbtkyuu+46Ofnkk6VSpUqSkJAgtWrVkh49esgjjzwiO3fuLPL9AwBgN7ftjwgAAAp0xhlnyKOPPhrRV+ree++VAwcOmHn9sozI0ZBAX9/c3Fxz/V//+pd07tw5z3bHjh2Tl19+2Xu9b9++UrNmTce3nZJSmva1MObOnSuvvfZaRO/z119/lWuuuUY+/vjjPOvS0tJk1apVZvrmm2/8KucAAHAyQikAAIKENuqPP/6Qhx56yHv9wgsvlF69evm9Xs2aNQv5+h08eNBUMhRF69atzRRJI0eOjOj94U/16tUz7eOdd94x1xcvXiwzZ840VSy+li5dKocOHfJeHzZsWMRfxpJoOyWlNO1rYWhFVP369aVTp06Sk5Mjb7zxRrHub/fu3dK9e3f5+eefvcuaNGkil156qamS0mPVp59+GjSwijR9PhkZGaYCDACA4qL7HgAAPqHNHXfc4Z0CQxytLvJdf8UVV0jDhg39uvI9++yz0qFDBylXrpyce+655nb6RXLcuHFyzjnnSIMGDeSkk06SpKQkE2RccsklQb+w5tf16bzzzvMu11Dj+++/l0GDBkmNGjUkOTnZPH6wKo1QY0rpfvs+1k8//SRPPfWUnHbaaeb+UlJS5K9//av54hvo6NGjMmHCBPM66LYaMMybN88856J0c9TtRowYYZ5DnTp1zOukX36bN29uur199dVXeW6jr4H1OPraaPelG264wXv7U089Vf7+978HfTy9v7/85S8mPNSpT58+smHDBikK3T/L3r175e23386zjVZQWfR11UoppdVC/fr1M12yqlWrZsKsKlWqmGqrBx98UI4cORKxbnNFec4apmk1mLYJDUG022GFChWkVatWMmrUKL8uaTqvj+v7eijffbLaX0H7qpVljz/+uJx11llStWpV87j6+BdffLG89NJLebYvTluOpEWLFpnKJn3d+vfvX+z70+OHbyB18803y3fffSezZs0yf3//93//J//973/l22+/NeFoqL+N/F4r3/cw8Hbbtm0z77++9to29TUt6O+7S5cu3vWBx9Ivv/xSrr/+ehPq67FS29Lpp59ufgQoTFsHAMQADwAACOrnn3/26D+V1jRlypR8159zzjl+19u1a2e2e+ONN/yWB5umTp3qd98LFizwW++re/fu3uWnnXaap2LFinnuz+Vyed577z2/2zVq1Cjoc3n//ff9bnv22WcH3cdzzz3X7/4yMzPzPGdruuSSS/yu62OE4/bbb8/3dUpMTPSsWLHC7zZDhw71rm/atKmnTp06QW/77LPP+t1u3bp1ngoVKuTZLjk52dOjRw/vdX3dwpGenu6pUqWK93ZXXHGF3/qdO3d64uPjvetvu+0277rq1avn+7zbtm3rOXTokN/9+a7X9hJO2ynqcx4wYEC++1epUiXPpk2bgv5dBJus9pffvurr1bp163zvR/crKyur2G05P7qvvrfV51cYgc+xsLffsWOH+Xu2bt++fXtPTk5OWLf1/dvQ44avwNfKd798b9eiRQtP7dq1/bZdunSp39/+DTfc4HffP/zwg9/2q1ev9q576qmnPG63O+R72qpVK/PeAwDKBrrvAQAQIR999JE0atRIBgwYYKp7dJwX5Xa7pX379qYrj44fpNUpWg3wySefyPvvv2+2mTZtmqkQ0uqpwti0aZOpILnttttMVYlWBGn3Gs0stPpGBz8uLO0CpLfTyrBXX33VW52klRjaRejMM88012fPnm2es0WrUS677DJTBfH6669LUWgVmXZTatu2rakY0iqKffv2yVtvvWXGysnMzJQxY8bI//73v6C318oYrYjRShK97dNPP21eF6XVJFqdofT10fnDhw+b61rNoeP1aDWZjvm0cuXKQu+7VmVdffXVplJMaQXc/v37TcWTVT2j702wrnva1ev888837UffT90/rYxZsmSJaSv6Hmh1yl133SVFVZznrM9Bu65q1ZlVsaRdyrQSSKtotKvq3XffbQbh1vdN29769evN/lt8x44KZ0yzwYMHy9dff+29rpWJWpmlg4ivWbPGLNP91uqayZMnF6stO5keI45nkMcNHTpU4uLs6+yglZhKK77atWsnv/zyi1SuXNlUwll////5z39kzpw53u6qL774ovf2LVu2lK5du5r51atXm8o6a+w1ff21Uk+7tL7wwgumwlD/tocMGSLvvvuubc8RABA9hFIAAESIjvGi3aCsEMKiX7p00u42GzduNGdb0y9v2gXps88+M13gsrOzzSDF2kWmMDRY0DBBu74oDWS0S49at25dkZ7H5Zdfbr7s631rtyHt8mSFKXqf1hf5f/zjH97baLChX/I1CLICF/2SWVhTp041X1g10NAQSkMd7TJ00UUXmetKL7VrlHaFDEbHc9JwTGm3Qn0OSrs26ZffihUrmtfdtyugjiemwaDS4Ee7FekX5MLSL+pWKKXj7mgXM+1KGNh1T98vDfEsX3zxhRnPTL+0a8ijQZQGQB07djQBitLxqooTShXnOet7nZWVZd5jDSk0hNIgTQOfBQsWmG20/eo2Grpq91btmucbSumycOnrofdn0f3TM8spDaC0K6wVTGk4OmnSpKBBTbht2cm2b9/ud11DHrvpMUXPJuhL26gGxBpy/v7776Z9arfQwFDKtxvnY4895g2ktFugHrus9+2qq67ynhxAg0cN3H3/RgAAsYlQCgCACLn11lvzBFJKx2rRqg8NHPLz22+/FfoxtQLBCqTUKaec4p0v6rg5WmVkje+jVS86VpVWxfjep34R1ZDHMnDgQG8gZX0RLUoopV9GdcwfDWYKeq2ChVJ169b1BlKBr4e1/xpKaejlS98fi4YqOtaXFbYUhn6p1moeq5JLgygNpTZv3myClmBf1PVL+j333GPCFa0Ey+85F0dxnvPChQtNqJNfUKchnK7XsbyKywqcfKuDLPHx8XLttdd6t9FARNuihnhFacvI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K1fKd999Z65/+eWX8vHHH8tFF11EG0OJCOe4pZfaZU+PfxbdXr8jaGUVUJTvAtrNT9sVbQyF4S7U1iiV9u7da8YzqFWrlt9yvb5ly5ao7RdiR25urhnnR7vAtGnTxizTD0OJiYnef5h8252uA8KxePFiUxau3fcC0cYQCT/99JPpWqVd3CdOnGja2pgxY8zxa+jQod7jVbB/QzmWIRz33HOPHDx40PwwEx8fbz6TPfjgg6Zbi3Uso40hksJpU3qpQbwvt9ttflzk2IbC0m6hOsbUoEGDzBhltDEUBqEUgIhUsmzevNn88gtEyq+//ipjx441Y13oCRqAkgrVtVLgoYceMte1UkqPZzoOi4ZSQHG99NJLsnDhQlm0aJG0bt1avvjiC/NDjg4MTBsDUNppz4grr7zSDK6vP/IAhUX3vTKgRo0a5pe5wLOe6fXatWtHbb8QG0aNGmUGx3z//felfv363uXatrTr6P79+/22p90hXNoFVE/G0KFDB/PrrU46YL4O3Krz+osvbQzFpWematWqld+yU089VbZt2+Y9llnHLo5lKIo777zTVEtdffXV5kxV1113nTlJg57FljaGkhDOcUsvA094lJ2dbc7Ix/cDFDaQ+uWXX8yPiFaVFG0MhUEoVQZoF4SOHTua8Qx8fxnW6127do3qvqH00l9DNJBaunSprFq1ypzq2pe2OT2blW+707Ny6Bc92h3C0aNHD/nqq69MVYE1aUWLdnmx5mljKC7tdqzHJl869k+jRo3MvB7b9Aua77FMu2LpmCscyxAOPUuVjtPjS38s1M9itDGUhHCOW3qpPxzqD0AW/Tyn7VLHngLCDaS+//57ee+996R69ep+62ljCBfd98oIHStDS8T1S1znzp1l1qxZ5jSfw4cPj/auoRR32dOuCK+99ppUrFjRO/6ADqRZrlw5czlixAjT9nR8Av3lZPTo0eYfqDPPPDPau49SQNuVNUaZRU9prR96rOW0MRSXVqzoQNTafU8/XK9du1bmz59vJqWDtmpXqwceeEBatGhhvuzpKbC161W/fv14A1CgSy65xIwhpSf60O57GzdulJkzZ8r1119PG0ORHT58WH744Qe/wc31Bxv9zKVtraDjllaE9unTR0aOHGm6K2vAoD82akWfbgfk18a0yviKK64w435qjwkdK8/6LqDrtSiCNoawFe5kfSjN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" }, "metadata": {}, "output_type": "display_data", @@ -1090,9 +1094,9 @@ "text": [ "\n", "[指标分析]\n", - " 最佳验证 l1: 0.053570\n", - " 最佳迭代轮数: 147\n", - " 早停建议: 如果验证指标连续10轮不下降,建议在第 147 轮停止训练\n", + " 最佳验证 l1: 0.053943\n", + " 最佳迭代轮数: 31\n", + " 早停建议: 如果验证指标连续10轮不下降,建议在第 31 轮停止训练\n", "\n", "[重要提醒] 验证集仅用于早停/调参,测试集完全独立于训练过程!\n" ] @@ -1111,8 +1115,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2026-03-08T06:11:05.540372Z", - "start_time": "2026-03-08T06:11:05.504804Z" + "end_time": "2026-03-08T12:42:43.064939Z", + "start_time": "2026-03-08T12:42:43.030137Z" } }, "source": [ @@ -1151,59 +1155,65 @@ "训练结果\n", "================================================================================\n", "\n", - "结果数据形状: (893340, 54)\n", - "结果列: ['ts_code', 'trade_date', 'vol', 'low', 'high', 'volume_ratio', 'turnover_rate', 'close', 'total_mv', 'f_ann_date', 'total_profit', 'ebit', 'operate_profit', 'ebitda', 'n_income', 'money_cap', 'total_liab', 'n_cashflow_act', 'ma5', 'ma10', 'ma20', 'ma_ratio', 'volatility_5', 'volatility_20', 'vol_ratio', 'return_10', 'return_20', 'return_diff', 'vol_ma5', 'vol_ma20', 'market_cap_rank', 'high_low_ratio', 'turnover_rate_mean_5', 'bbi_ratio_factor', 'volume_change_rate', 'turnover_deviation', 'vol_std_5', 'std_return_5', 'std_return_90', 'cs_rank_volume_ratio', 'cs_rank_turnover_rate', 'n_income_rank', 'operate_profit_rank', 'total_profit_rank', 'ebit_rank', 'ebitda_rank', 'total_liab_rank', 'money_cap_rank', 'n_cashflow_act_rank', 'profit_to_market_cap', 'cashflow_to_market_cap', 'operate_profit_to_market_cap', 'future_return_5', 'prediction']\n", + "结果数据形状: (771207, 54)\n", + "结果列: ['ts_code', 'trade_date', 'turnover_rate', 'volume_ratio', 'high', 'vol', 'close', 'low', 'total_mv', 'f_ann_date', 'total_profit', 'operate_profit', 'ebit', 'n_income', 'ebitda', 'money_cap', 'total_liab', 'n_cashflow_act', 'ma5', 'ma10', 'ma20', 'ma_ratio', 'volatility_5', 'volatility_20', 'vol_ratio', 'return_10', 'return_20', 'return_diff', 'vol_ma5', 'vol_ma20', 'market_cap_rank', 'high_low_ratio', 'turnover_rate_mean_5', 'bbi_ratio_factor', 'volume_change_rate', 'turnover_deviation', 'vol_std_5', 'std_return_5', 'std_return_90', 'cs_rank_volume_ratio', 'cs_rank_turnover_rate', 'n_income_rank', 'operate_profit_rank', 'total_profit_rank', 'ebit_rank', 'ebitda_rank', 'total_liab_rank', 'money_cap_rank', 'n_cashflow_act_rank', 'profit_to_market_cap', 'cashflow_to_market_cap', 'operate_profit_to_market_cap', 'future_return_5', 'prediction']\n", "\n", "结果前10行预览:\n", "shape: (10, 54)\n", "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬───────────┬──────────┐\n", - "│ ts_code ┆ trade_dat ┆ vol ┆ low ┆ … ┆ cashflow_ ┆ operate_p ┆ future_re ┆ predicti │\n", - "│ --- ┆ e ┆ --- ┆ --- ┆ ┆ to_market ┆ rofit_to_ ┆ turn_5 ┆ on │\n", - "│ str ┆ --- ┆ f64 ┆ f64 ┆ ┆ _cap ┆ market_ca ┆ --- ┆ --- │\n", - "│ ┆ str ┆ ┆ ┆ ┆ --- ┆ p ┆ f64 ┆ f64 │\n", + "│ ts_code ┆ trade_dat ┆ turnover_ ┆ volume_ra ┆ … ┆ cashflow_ ┆ operate_p ┆ future_re ┆ predicti │\n", + "│ --- ┆ e ┆ rate ┆ tio ┆ ┆ to_market ┆ rofit_to_ ┆ turn_5 ┆ on │\n", + "│ str ┆ --- ┆ --- ┆ --- ┆ ┆ _cap ┆ market_ca ┆ --- ┆ --- │\n", + "│ ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ p ┆ f64 ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ --- ┆ ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ ┆ │\n", "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n", - "│ 000001.SZ ┆ 20250102 ┆ 5.587779 ┆ 7.140527 ┆ … ┆ 4.53796 ┆ 3.597925 ┆ -0.002622 ┆ -0.00503 │\n", - "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 1 │\n", - "│ 000002.SZ ┆ 20250102 ┆ 3.526191 ┆ 7.140527 ┆ … ┆ -1.396605 ┆ -3.929764 ┆ -0.022509 ┆ 0.002998 │\n", - "│ 000004.SZ ┆ 20250102 ┆ -0.216144 ┆ -0.133365 ┆ … ┆ -0.334867 ┆ -0.856969 ┆ -0.064897 ┆ 0.000258 │\n", - "│ 000006.SZ ┆ 20250102 ┆ 0.443786 ┆ 1.382669 ┆ … ┆ -0.117683 ┆ -1.740083 ┆ -0.048278 ┆ 0.008562 │\n", - "│ 000007.SZ ┆ 20250102 ┆ -0.397614 ┆ -0.111591 ┆ … ┆ 0.647925 ┆ -0.415858 ┆ 0.015649 ┆ -0.00104 │\n", - "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 9 │\n", - "│ 000008.SZ ┆ 20250102 ┆ 3.219998 ┆ -0.075651 ┆ … ┆ -0.389118 ┆ -1.046469 ┆ -0.066939 ┆ -0.00301 │\n", + "│ 000001.SZ ┆ 20250102 ┆ -0.442803 ┆ 0.60735 ┆ … ┆ 4.430923 ┆ 3.905767 ┆ -0.002622 ┆ -0.01380 │\n", + "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 2 │\n", + "│ 000002.SZ ┆ 20250102 ┆ -0.350092 ┆ 0.018219 ┆ … ┆ -1.401378 ┆ -3.606928 ┆ -0.022509 ┆ -0.01000 │\n", + "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 2 │\n", + "│ 000004.SZ ┆ 20250102 ┆ 2.392751 ┆ -0.46045 ┆ … ┆ -0.304204 ┆ -0.971788 ┆ -0.064897 ┆ -0.00486 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 4 │\n", - "│ 000009.SZ ┆ 20250102 ┆ 0.204049 ┆ 0.03066 ┆ … ┆ 0.246551 ┆ 0.57786 ┆ -0.036045 ┆ 0.014509 │\n", - "│ 000010.SZ ┆ 20250102 ┆ 0.584268 ┆ -0.299947 ┆ … ┆ -0.787198 ┆ -1.017736 ┆ 0.092123 ┆ -0.00703 │\n", - "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 3 │\n", - "│ 000011.SZ ┆ 20250102 ┆ -0.488782 ┆ -0.241316 ┆ … ┆ -1.745853 ┆ -0.461702 ┆ -0.022094 ┆ 0.002963 │\n", - "│ 000012.SZ ┆ 20250102 ┆ -0.060654 ┆ 0.51434 ┆ … ┆ 0.727138 ┆ 0.565626 ┆ -0.029188 ┆ 0.012271 │\n", + "│ 000006.SZ ┆ 20250102 ┆ 0.001109 ┆ -0.478861 ┆ … ┆ -0.525691 ┆ -1.986389 ┆ -0.048278 ┆ -0.00030 │\n", + "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 9 │\n", + "│ 000007.SZ ┆ 20250102 ┆ -0.100561 ┆ -0.000192 ┆ … ┆ -0.041212 ┆ -0.464999 ┆ 0.015649 ┆ 0.000112 │\n", + "│ 000008.SZ ┆ 20250102 ┆ 0.59965 ┆ -0.810247 ┆ … ┆ -0.360266 ┆ -1.189503 ┆ -0.066939 ┆ -0.01029 │\n", + "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 8 │\n", + "│ 000009.SZ ┆ 20250102 ┆ -0.443002 ┆ 1.178071 ┆ … ┆ 0.296618 ┆ 0.676674 ┆ -0.036045 ┆ -0.00890 │\n", + "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 9 │\n", + "│ 000010.SZ ┆ 20250102 ┆ 1.435875 ┆ 0.478477 ┆ … ┆ -0.214012 ┆ -1.156491 ┆ 0.092123 ┆ -0.00856 │\n", + "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 6 │\n", + "│ 000011.SZ ┆ 20250102 ┆ -0.487201 ┆ -0.073833 ┆ … ┆ -1.762282 ┆ -0.517669 ┆ -0.022094 ┆ -0.00446 │\n", + "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 2 │\n", + "│ 000012.SZ ┆ 20250102 ┆ -0.47635 ┆ 0.496888 ┆ … ┆ 0.793245 ┆ 0.662619 ┆ -0.029188 ┆ -0.01157 │\n", + "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 2 │\n", "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴───────────┴──────────┘\n", "\n", "结果后5行预览:\n", "shape: (5, 54)\n", "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬───────────┬──────────┐\n", - "│ ts_code ┆ trade_dat ┆ vol ┆ low ┆ … ┆ cashflow_ ┆ operate_p ┆ future_re ┆ predicti │\n", - "│ --- ┆ e ┆ --- ┆ --- ┆ ┆ to_market ┆ rofit_to_ ┆ turn_5 ┆ on │\n", - "│ str ┆ --- ┆ f64 ┆ f64 ┆ ┆ _cap ┆ market_ca ┆ --- ┆ --- │\n", - "│ ┆ str ┆ ┆ ┆ ┆ --- ┆ p ┆ f64 ┆ f64 │\n", + "│ ts_code ┆ trade_dat ┆ turnover_ ┆ volume_ra ┆ … ┆ cashflow_ ┆ operate_p ┆ future_re ┆ predicti │\n", + "│ --- ┆ e ┆ rate ┆ tio ┆ ┆ to_market ┆ rofit_to_ ┆ turn_5 ┆ on │\n", + "│ str ┆ --- ┆ --- ┆ --- ┆ ┆ _cap ┆ market_ca ┆ --- ┆ --- │\n", + "│ ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ p ┆ f64 ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ --- ┆ ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ ┆ │\n", "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n", - "│ 605588.SH ┆ 20260306 ┆ -0.594236 ┆ -0.130348 ┆ … ┆ 0.166521 ┆ -0.648847 ┆ null ┆ -0.00224 │\n", - "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 6 │\n", - "│ 605589.SH ┆ 20260306 ┆ 0.108199 ┆ -0.253383 ┆ … ┆ -0.32234 ┆ 0.153492 ┆ null ┆ -0.00560 │\n", - "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 4 │\n", - "│ 605598.SH ┆ 20260306 ┆ -0.54733 ┆ -0.01433 ┆ … ┆ -0.191519 ┆ -0.305813 ┆ null ┆ 0.003137 │\n", - "│ 605599.SH ┆ 20260306 ┆ -0.409848 ┆ -0.309195 ┆ … ┆ 0.812476 ┆ 0.480653 ┆ null ┆ -0.00217 │\n", + "│ 605588.SH ┆ 20251231 ┆ -0.287278 ┆ -0.478861 ┆ … ┆ 0.245664 ┆ -0.750859 ┆ null ┆ -0.00085 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 3 │\n", - "│ 689009.SH ┆ 20260306 ┆ -0.419186 ┆ -0.168059 ┆ … ┆ 1.301768 ┆ 0.905556 ┆ null ┆ 0.001416 │\n", + "│ 605589.SH ┆ 20251231 ┆ -0.211755 ┆ -0.828658 ┆ … ┆ -0.316701 ┆ 0.328847 ┆ null ┆ -0.00538 │\n", + "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 4 │\n", + "│ 605598.SH ┆ 20251231 ┆ 0.754611 ┆ -0.552502 ┆ … ┆ -0.157841 ┆ -0.386306 ┆ null ┆ -0.00914 │\n", + "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 6 │\n", + "│ 605599.SH ┆ 20251231 ┆ -0.565809 ┆ 0.404836 ┆ … ┆ 1.377021 ┆ 1.078554 ┆ null ┆ -0.00074 │\n", + "│ 689009.SH ┆ 20251231 ┆ -0.486869 ┆ -0.570913 ┆ … ┆ 1.185366 ┆ 0.848817 ┆ null ┆ -0.00457 │\n", + "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 1 │\n", "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴───────────┴──────────┘\n", "\n", "每日预测样本数统计:\n", - " 最小: 1040\n", - " 最大: 3192\n", - " 平均: 3167.87\n", + " 最小: 3147\n", + " 最大: 3186\n", + " 平均: 3173.69\n", "\n", "示例日期 20250102 的前10条预测:\n", "shape: (10, 4)\n", @@ -1212,16 +1222,16 @@ "│ --- ┆ --- ┆ --- ┆ --- │\n", "│ str ┆ str ┆ f64 ┆ f64 │\n", "╞═══════════╪════════════╪═════════════════╪════════════╡\n", - "│ 000001.SZ ┆ 20250102 ┆ -0.002622 ┆ -0.005031 │\n", - "│ 000002.SZ ┆ 20250102 ┆ -0.022509 ┆ 0.002998 │\n", - "│ 000004.SZ ┆ 20250102 ┆ -0.064897 ┆ 0.000258 │\n", - "│ 000006.SZ ┆ 20250102 ┆ -0.048278 ┆ 0.008562 │\n", - "│ 000007.SZ ┆ 20250102 ┆ 0.015649 ┆ -0.001049 │\n", - "│ 000008.SZ ┆ 20250102 ┆ -0.066939 ┆ -0.003014 │\n", - "│ 000009.SZ ┆ 20250102 ┆ -0.036045 ┆ 0.014509 │\n", - "│ 000010.SZ ┆ 20250102 ┆ 0.092123 ┆ -0.007033 │\n", - "│ 000011.SZ ┆ 20250102 ┆ -0.022094 ┆ 0.002963 │\n", - "│ 000012.SZ ┆ 20250102 ┆ -0.029188 ┆ 0.012271 │\n", + "│ 000001.SZ ┆ 20250102 ┆ -0.002622 ┆ -0.013802 │\n", + "│ 000002.SZ ┆ 20250102 ┆ -0.022509 ┆ -0.010002 │\n", + "│ 000004.SZ ┆ 20250102 ┆ -0.064897 ┆ -0.004864 │\n", + "│ 000006.SZ ┆ 20250102 ┆ -0.048278 ┆ -0.000309 │\n", + "│ 000007.SZ ┆ 20250102 ┆ 0.015649 ┆ 0.000112 │\n", + "│ 000008.SZ ┆ 20250102 ┆ -0.066939 ┆ -0.010298 │\n", + "│ 000009.SZ ┆ 20250102 ┆ -0.036045 ┆ -0.008909 │\n", + "│ 000010.SZ ┆ 20250102 ┆ 0.092123 ┆ -0.008566 │\n", + "│ 000011.SZ ┆ 20250102 ┆ -0.022094 ┆ -0.004462 │\n", + "│ 000012.SZ ┆ 20250102 ┆ -0.029188 ┆ -0.011572 │\n", "└───────────┴────────────┴─────────────────┴────────────┘\n" ] } @@ -1238,8 +1248,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2026-03-08T06:11:05.964933Z", - "start_time": "2026-03-08T06:11:05.551387Z" + "end_time": "2026-03-08T12:42:43.409508Z", + "start_time": "2026-03-08T12:42:43.073624Z" } }, "cell_type": "code", @@ -1300,9 +1310,9 @@ "保存预测结果\n", "================================================================================\n", "\n", - "[1/1] 保存每日 Top 2 股票...\n", + "[1/1] 保存每日 Top 5 股票...\n", " 保存路径: output\\regression_output.csv\n", - " 保存行数: 564(282个交易日 × 每日top2)\n", + " 保存行数: 1215(243个交易日 × 每日top5)\n", "\n", " 预览(前15行):\n", "shape: (15, 3)\n", @@ -1311,17 +1321,17 @@ "│ --- ┆ --- ┆ --- │\n", "│ str ┆ f64 ┆ str │\n", "╞════════════╪══════════╪═══════════╡\n", - "│ 2025-01-02 ┆ 0.081732 ┆ 603007.SH │\n", - "│ 2025-01-02 ┆ 0.070111 ┆ 603559.SH │\n", - "│ 2025-01-03 ┆ 0.088554 ┆ 603007.SH │\n", - "│ 2025-01-03 ┆ 0.08042 ┆ 603559.SH │\n", - "│ 2025-01-06 ┆ 0.087152 ┆ 603007.SH │\n", + "│ 2025-01-02 ┆ 0.086703 ┆ 603007.SH │\n", + "│ 2025-01-02 ┆ 0.073642 ┆ 603559.SH │\n", + "│ 2025-01-02 ┆ 0.047455 ┆ 603959.SH │\n", + "│ 2025-01-02 ┆ 0.019551 ┆ 600530.SH │\n", + "│ 2025-01-02 ┆ 0.014435 ┆ 600608.SH │\n", "│ … ┆ … ┆ … │\n", - "│ 2025-01-09 ┆ 0.043328 ┆ 605118.SH │\n", - "│ 2025-01-09 ┆ 0.039754 ┆ 603848.SH │\n", - "│ 2025-01-10 ┆ 0.037324 ┆ 002309.SZ │\n", - "│ 2025-01-10 ┆ 0.027656 ┆ 603848.SH │\n", - "│ 2025-01-13 ┆ 0.050825 ┆ 002309.SZ │\n", + "│ 2025-01-06 ┆ 0.087354 ┆ 603007.SH │\n", + "│ 2025-01-06 ┆ 0.053317 ┆ 603959.SH │\n", + "│ 2025-01-06 ┆ 0.033367 ┆ 000573.SZ │\n", + "│ 2025-01-06 ┆ 0.019381 ┆ 603848.SH │\n", + "│ 2025-01-06 ┆ 0.017292 ┆ 603226.SH │\n", "└────────────┴──────────┴───────────┘\n" ] } @@ -1339,8 +1349,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2026-03-08T06:11:05.972569Z", - "start_time": "2026-03-08T06:11:05.968651Z" + "end_time": "2026-03-08T12:42:43.418164Z", + "start_time": "2026-03-08T12:42:43.414098Z" } }, "source": [ @@ -1360,39 +1370,39 @@ "text": [ "\n", "特征重要性:\n", - "ebitda_rank 12044.385847\n", - "bbi_ratio_factor 1996.570270\n", - "std_return_90 1900.096352\n", - "return_10 1707.237531\n", - "cs_rank_turnover_rate 1700.674361\n", - "ma_ratio 1449.246176\n", - "std_return_5 1112.916802\n", - "high_low_ratio 1002.711145\n", - "vol_ma20 800.361497\n", - "ma20 743.156761\n", - "cs_rank_volume_ratio 620.018650\n", - "vol_ratio 614.280431\n", - "turnover_rate_mean_5 574.150844\n", - "return_20 530.409461\n", - "volume_change_rate 516.283890\n", - "return_diff 427.252813\n", - "market_cap_rank 367.685596\n", - "volatility_20 297.221084\n", - "vol_std_5 245.201921\n", - "volatility_5 210.447650\n", - "ma10 175.131429\n", - "ma5 137.251949\n", - "vol_ma5 105.623339\n", - "ebit_rank 102.653185\n", - "profit_to_market_cap 65.704505\n", - "operate_profit_rank 64.448026\n", - "operate_profit_to_market_cap 59.952241\n", - "cashflow_to_market_cap 40.900113\n", - "n_income_rank 34.135645\n", - "n_cashflow_act_rank 27.246159\n", - "money_cap_rank 22.246325\n", - "total_liab_rank 21.635597\n", - "total_profit_rank 17.579179\n", + "ebitda_rank 14994.629439\n", + "bbi_ratio_factor 1948.020045\n", + "cs_rank_turnover_rate 1686.329153\n", + "std_return_90 1566.943976\n", + "return_10 1430.825613\n", + "std_return_5 1242.399894\n", + "ma_ratio 979.636333\n", + "high_low_ratio 932.793097\n", + "volume_change_rate 652.408669\n", + "vol_ratio 651.873589\n", + "cs_rank_volume_ratio 649.430382\n", + "vol_ma20 649.122400\n", + "turnover_rate_mean_5 615.645898\n", + "ma20 535.948738\n", + "return_20 452.979679\n", + "market_cap_rank 407.870511\n", + "return_diff 304.914024\n", + "ebit_rank 294.325396\n", + "profit_to_market_cap 287.904060\n", + "vol_std_5 243.944097\n", + "operate_profit_to_market_cap 232.366538\n", + "ma10 201.935446\n", + "volatility_20 169.372244\n", + "volatility_5 161.736089\n", + "ma5 111.549055\n", + "n_income_rank 79.050783\n", + "vol_ma5 73.284933\n", + "operate_profit_rank 57.328938\n", + "total_profit_rank 35.760864\n", + "n_cashflow_act_rank 34.917162\n", + "money_cap_rank 32.511166\n", + "total_liab_rank 24.127689\n", + "cashflow_to_market_cap 20.326702\n", "turnover_deviation 0.000000\n", "dtype: float64\n", "\n", @@ -1419,8 +1429,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2026-03-08T06:11:05.983915Z", - "start_time": "2026-03-08T06:11:05.981218Z" + "end_time": "2026-03-08T12:42:43.429903Z", + "start_time": "2026-03-08T12:42:43.423547Z" } }, "source": [ @@ -1461,8 +1471,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2026-03-08T06:11:06.124862Z", - "start_time": "2026-03-08T06:11:05.993617Z" + "end_time": "2026-03-08T12:42:43.605795Z", + "start_time": "2026-03-08T12:42:43.439482Z" } }, "cell_type": "code", @@ -1512,7 +1522,7 @@ "text/plain": [ "
" ], - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9kAAAMWCAYAAADlCkWLAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA6KFJREFUeJzs3QmcjfX7//HLvmbNnuyyZCuRKCJLJEpI1laVJUnJN7JEiFCIdtFeClmTSkq2LJGlFJF9yf61DPN/vD/f/31+Z86cMwY3M2Zez8fjZOY+97nPPefcM533fV2fz50iOjo62gAAAAAAwAVLeeGbAAAAAAAAhGwAAAAAAHxEJRsAAAAAAJ8QsgEAAAAA8AkhGwAAAAAAnxCyAQAAAADwCSEbAAAAAACfELIBAAAAAPAJIRsAAAAAAJ8QsgEAAC6xrVu3Wvr06e2nn366JM/XoUMHK1y48Hk99tlnn7WqVav6vk8AkFQRsgEAScqECRMsRYoUYW8KCxfDwoULrV+/fnbgwAFLrK/HsmXL7HL12muvuZ8jKRkwYIALrtWrV49134IFC6xFixZWoEABS5s2rWXNmtWtq8fs2rXrku9rt27dbNWqVTZt2rRL/twAcDlKndA7AADAxaBAUqRIkRjLrr322osWsvv37++qhdmyZbsoz5GcKWRfeeWV7vVNCvbs2WPvvfeeu4V6/vnn7YUXXrCiRYu6n1f/Hj9+3H755Rd7+eWX3WP+/PPPc37ON998086cOXNe+5s3b15r0qSJDR8+3O68887z2gYAJCeEbABAknT77bdb5cqV7XJ29OhRy5QpkyVXx44ds4wZM1pS8/7771vq1KmtcePGMZZ/8sknLmCrij1p0iRXxQ42cuRIdzsfadKkuaB91j41b97c/vrrLxf8AQCR0S4OAEiWZs2aZTfffLMLsVdccYU1atTIfvvttxjr/Prrr4FqosbPqqL3wAMP2L59+wLrqE386aefdl+rcu61pm/evNnd9HW4Vmct12ODt6Nla9eutfvuu8+yZ89uNWrUiBHMrr/+esuQIYPlyJHD7r33Xjeu93zoZ8qcObNt2bLF7rjjDve1WpPHjh3r7l+9erXVrl3bvTaFChWyDz/8MGwL+g8//GAdO3a0nDlzWpYsWaxdu3b277//hq1Ely1b1tKlS2f58+e3Tp06xWqtr1Wrlus0UMX2lltuceH6P//5jxtHrPdl/vz5gddW68r+/futR48eVq5cOfczaB90ckWtzcG+//5797hPP/3UBg0aZFdddZV7P+vUqWMbN26Mtb+LFy+2hg0buvdAr0H58uXtlVdeibHO+vXr7Z577nHvhbalEzrxbaeeMmWKa//WPodWsVWxf/vtt2MFbFHbePAxI1OnTnXHrl5Xvb7FihVzQf306dNxjsn2jk1Vp9944w33OD3+hhtusKVLl8Z67ttuuy3wfACAuFHJBgAkSQcPHrS9e/fGWKYAI6oStm/f3urXr29Dhw51FdNx48a5ULtixYpAGJk7d66r3N1///0uYCvsKZDo30WLFrmQcvfdd9vvv/9uH330kasyes+RK1cu1xZ8rlQtLFGihL344osWHR3tlikY9unTx1UTH3roIbfd0aNHuzCq/T2fFnWFMAVSbeOll16yDz74wDp37uxC5XPPPWetW7d2P9v48eNdeK5WrVqs9nutr+dW8NuwYYN7Df/+++9AqBXdp1Z6hbTHHnsssJ6CnCb9Cq6w6uSF9kknENq0aWN58uRxgbpLly4ukGq/RMtF740Cq14z7ZvGK7/++utWs2ZNd7JCwTPYkCFDLGXKlC6Y6/jQz62fU6Hao/dcJx7y5ctnTzzxhHvf161bZ9OnT3ffi95/jaXWiQmN89drpgDftGlTmzx5st11110RX/dTp065n12vRTAdQ7rp/Q0N33HRCQ+t3717d/fvt99+68L6oUOHbNiwYWd9vE6gHD582J0s0Xum10Tvu17b4PdGAV9BXO/Zk08+Ge/9A4BkKRoAgCTk3XffVTINe5PDhw9HZ8uWLfrhhx+O8bidO3dGZ82aNcbyY8eOxdr+Rx995Lb1ww8/BJYNGzbMLdu0aVOMdfW9lmufQml53759A9/ray1r1apVjPU2b94cnSpVquhBgwbFWL569ero1KlTx1oe6fVYunRpYFn79u3dshdffDGw7N9//43OkCFDdIoUKaI//vjjwPL169fH2ldvm9dff330yZMnA8tfeuklt3zq1Knu+927d0enTZs2ul69etGnT58OrDdmzBi33jvvvBNYVrNmTbds/PjxsX6GsmXLuvtDHT9+PMZ2vdc8Xbp00QMGDAgs++6779y2S5cuHX3ixInA8ldeecUt12spUVFR0UWKFIkuVKiQez2CnTlzJvB1nTp1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+OEHa9y4seXPn99SpEhhU6ZMiXF/dHS0Pf/885YvXz7LkCGD3XbbbfbHH3/EWGf//v3WunVry5Ili2XLls0efPBBO3LkSOD+77//3po0aeK2kSlTJnc8fvDBB3Hu14QJE9z+hLvt3r3brbNjxw677777rGTJkpYyZUrr1q1brO389ttv1qxZMytcuLB77KhRoy7wFQMAAABwWYfsnTt3WpcuXaxo0aKWLl06K1iwoAtF8+bNs6QkPmFo3LhxVr58eRfmdKtWrZrNmjUrQfY3qTh69KhVqFDBxo4dG/b+l156yV599VUbP368LV682IXk+vXr2/HjxwPrKGDr/Zs7d65Nnz7dBfdHHnkkcP/ChQvd+zZ58mT79ddf7f7777d27dq5dSNp2bKlC9HBNz1vzZo1LXfu3G6dEydOWK5cuax3797uZwjn2LFj7ndnyJAhljdv3gt4pQAAAAD4IbUloM2bN1v16tVddXDYsGFWrlw5O3XqlM2ZM8c6depk69evt6TCC0PNmze3J598Muw6V111lQtLJUqUcBXW9957z1VIV6xYYWXLlj2n56s6eJ5Fpc5kydXmIY3cv7fffru7haPXWCc7FGL1OsvEiRMtT548ruJ977332rp162z27Nm2dOlSq1y5sltn9OjR1rBhQxs+fLirkP/nP/+Jsd0nnnjCvv76a/viiy/sjjvuCPvcqprr5tmzZ499++239vbbbweW6YTMK6+84r5+5513wm7nhhtucDd59tlnz+k1AgAAAJDEKtmPP/64q+ouWbLEVXnVFqsw2b17d1u0aJFbZ8uWLS4AZc6c2VV3W7RoYbt27Yq4zVq1asVqq23atKl16NAhRngZOHCgqzZqu4UKFbJp06a5oOM9lyqTy5Yti9Heq5MBOgFQunRpt06DBg1cBTI+FIR0IkHBTRX7cFTBV3hTyNZrMWjQIPc83msBf23atMl1UqhF3JM1a1arWrWq/fzzz+57/av33QvYovXVvq3KdyQHDx60HDlyxHtfFO4zZsxo99xzz3n/PAAAAACSccjWOFdVCFWxVotuKAWbM2fOuNCrdefPn+/adf/66y/XanuhRo4c6aroqhI3atTI2rZt60J3mzZtbPny5VasWDH3vaqdwdVoVS8nTZrkWoZ1AqBHjx52MZw+fdo+/vhj1+6stnH4TwFbVLkOpu+9+/Sv177t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537WkiVL2syZMy2p+ffff6169eqWJk0amzVrlq1du9Zefvlly549e2Cdo0ePunA7dOjQs25v1KhRLmCfzbFjx2z58uXWp08f96+C/IYNG+zOO++Msd4dd9zhAvO3335rv/zyi1WoUMEt07Eop0+fdgH75MmTtnDhQnvvvfdswoQJ9vzzz5/X6wEAAAAgaUhtidzmzZtdGMuWLZsNGzbMVSBVjZwzZ44Lo+vXr7ekQoGtbt26rir6+eefW4ECBezvv/92P/u5qjp4nkWlzmSJ0eYhjVxw1smSd999N7C8SJEiMdZr27bt/9bfvDnO7anCrYCuKrhOTsQla9asNnfu3BjLxowZY1WqVHGV6auvvtr27t1rf/zxh7399ttWvnx5t86QIUPstddeszVr1ljevHnt66+/dicGvvnmG8uTJ4/rlHjhhRdclVydE2nTpj3n1wUAAADA5S/RV7Iff/xxV6FcsmSJNWvWzFV2y5Yta927d7dFixa5dRSO1NqbOXNm19rbokUL27VrV8Rt1qpVy7p16xZjWdOmTa1Dhw6B7wsXLmwDBw50rcTabqFChWzatGm2Z8+ewHMpgAW3N6uSqUCsEwClS5d26zRo0MB27NgRr5/1nXfesf3797t2Z51Y0D7UrFnTVVGTGr2WlStXtubNm7uTCpUqVbI333zznLejyvR9991nY8eOdeH3fBw8eNAdY97JDLWnX3PNNTZx4kRXTVdF+/XXX3f7ef3117t1fv75Z3fCRwHbU79+fTt06JD99ttv57UfAAAAAC5/iTpkK3DOnj3bVaw1fjaUQtGZM2dc6NW68+fPd1XKv/76y1q2bHnBzz9y5EgXdlesWOFag1VZVejWOGK1GhcrVsx9r/HAwaFv+PDhNmnSJPvhhx/cCYAePXrEO3hWq1bN/bwKb9dee629+OKLrjU5qdF7NG7cOCtRooQ7KfHYY49Z165dXdv1uXjyySftpptucsfA+Th+/LirPrdq1cqdoBEFblWo9b5fccUVlj59ehsxYoQ7Fr12drWNBwds8b73WsoBAAAAJD+Jul1848aNLsCWKlUq4joal7169WrbtGmTaz8WVSBV7V66dKndcMMN5/38DRs2tI4dO7qvNdZWoVDbU/VVFM4UilU196qoamUfP368C+DSuXNnGzBgQLyDp8YAt27d2o3D1s+vSr622bdv37CP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AADAJ4RsAAAAAAB8QsgGAAAAAMAnhGxcdP369bMUKVLEuJUqVSpwf8eOHa1YsWKWIUMGy5UrlzVp0sTWr18fYxtbtmyxRo0aWcaMGS137tz29NNPW1RUVLye/8SJE1axYkX3vCtXroxx36+//mo333yzpU+f3goWLGgvvfRSjPtPnTplAwYMcPundSpUqGCzZ8++oNcDAAAAQNKVMrmEPIUsJJyyZcvajh07Arcff/wxcN/1119v7777rq1bt87mzJlj0dHRVq9ePTt9+rS7X/8qYJ88edIWLlxo7733nk2YMMGef/75eD33M888Y/nz54+1/NChQ+55ChUqZL/88osNGzbMHStvvPFGYJ3evXvb66+/bqNHj7a1a9fao48+anfddZetWLHCl9cFAAAAQNJyWYTsnTt3WpcuXaxo0aKWLl06V3Fs3LixzZs3z5KaUaNG2TXXXOOquvo5n3zySTt+/Lhd7lKnTm158+YN3K688srAfY888ojdcsstVrhwYbvuuuts4MCBtnXrVtu8ebO7/+uvv3YB9/3333cnS26//XZ74YUXbOzYsS54x2XWrFnu8cOHD4913wcffOAe/84777iTAPfee6917drVRowYEVhn0qRJ9p///McaNmzojr/HHnvMff3yyy/7+voAAAAASBpSWyKnoFW9enXLli2bqzSWK1fOtfCq4tmpU6dYbcWXsw8//NCeffZZF/puuukm+/33361Dhw6uzTk4+MVH1cHzLCp1Jktom4c0cv/+8ccfrpqslutq1arZ4MGD7eqrr461/tGjR11Vu0iRIu4kg/z888/ufc+TJ09gvfr167vA+9tvv1mlSpXCPveuXbvs4YcftilTprg281DarsJ92rRpY2x36NCh9u+//1r27Nldq7n2OZhOgARX4gEAAADgsqlkP/744y5kLlmyxJo1a2YlS5Z0Vcfu3bvbokWLAuN1NY43c+bMliVLFmvRooULWJHUqlXLunXrFmNZ06ZNXaD1qKqqimq7du3cdtVSPG3aNNuzZ0/gucqXL2/Lli0LPEYtzDoZoBMApUuXdus0aNDAtUfHh1qhdULhvvvuc8+vVuZWrVq5n/1yVrVqVffaaCzzuHHjbNOmTW4c9OHDhwPrvPbaa+710k3V57lz5wbCrzoZggO2eN/rvnDUcq73U+3dlStXDrtOfLar0K0THDpJ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008/2X333RdxfW1z+fLl1qdPH/fvF198YRs2bLA777wzxnp33HGHRUVF2bfffmu//PKLVahQwS3buXNnrG0++OCDVr58ed5nAAAAAIk7ZCvQdOnSxYoWLWrp0qWzggULWuPGjW3evHmWlPz222/WrFkzK1y4sKuGjho1Kux627ZtszZt2ljOnDld1VbV2GXLltnlLHXq1JY3b97ATZVjT7du3ezZZ5+1G2+8MexjFYKfeOIJGzZsmD366KNWsmRJK1OmjLVo0SLi82XNmtXmzp3r1rnmmmvctseMGeOC9JYtW9w6e/futT/++MM9t8JziRIlbMiQIS6gr1mzJsb2xo0b56rXPXr08O01AQAAAJA0pU7IJ9+8ebNVr17dsmXL5kKUAqVafefMmWOdOnWy9evXJ+Tu+UrhTScSmjdvbk8++WTYdf7991/3etx66602a9Ysy5UrlwuCao8+V1UHz7Oo1JksIW0e0sj9q59BLdvp06e3atWq2eDBg+3qq6+O1zZUidaJh5QpU1qlSpXcSRl1Luh4ufbaa+O9LwcPHnQnN3SsiU5iKIBPnDjRrrvuOneC5/XXX7fcuXPb9ddfH3jc2rVrbcCAAbZ48WL766+/zvk1AAAAAJC8JGgl+/HHH3fBZ8mSJa7KqyqlWou7d+9uixYtcuuo8qhxs5kzZ3bjZlWd3LVrV8RtanyvqqPBNH63Q4cOge9VTR44cKAbp6vtFipUyKZNm2Z79uwJPJeqm8EV5AkTJriAphMApUuXduuozVntz/Fxww03uGB47733ukAXztChQ10l/91337UqVapYkSJFrF69elasWDG7XGkctV672bNnu4rwpk2b7Oabb7bDhw/H6/FesNWwgN69e9v06dPdSQe9z/v374/XNo4fP+7GaLdq1codQ6Lj7ptvvrEVK1bYFVdc4U4AjBgxwu2nd1LjxIkT7jF63+J7UgAAAABA8pZglWwFJAWaQYMGucmpQinQnjlzJhB658+f71qHVeFu2bKlff/99xf0/CNHjrQXX3zRjdvV1xrze9NNN9kDDzzgQpVCmUK42rwVyLxq9PDhw23SpEmusqq2brUQf/DBB+YHBf369eu7ard+3gIFCrgTEQ8//HDExygI6uY5dOiQ+zddymhLlSraEpK6Em677bbA9zo5oapx8eLF7aOPPnJjrD16b73H6OY5efKk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AAAAAD4hyAYAAAAAwCcE2QAAAAAA+IQgGwAAAAAAnxBkAwAAAADgE4JsAAAAAAB8QpANAAAAAIBPCLIBAAAAAPAJQTaSNGrUKKtXr57ly5fPihcvbm3btrWNGzeGrfPLL7/YjTfeaMWKFbP8+fNb+/btbc+ePcHlc+fOtUyZMkV8LF26NOJ+Dxw4YL169bILL7zQcuXKZWXLlrXevXvboUOHguusWrXKbr31VitTpoxbp1q1avbcc8+FbWfXrl1222232QUXXGCZM2e2Pn368K4DAAAAOCcyRJA9dOhQu+SSS1L7MNKtefPm2f3332+LFi2ymTNn2smTJ+3aa6+1v/76yy3XT/2tgHn27Nn23Xff2YkTJ+z666+3U6dOuXUaNWrkgt3Qx913320VKlSwunXrRtzvb7/95h5PP/20rV271iZOnGjTp0+3u+66K7jODz/84AL/d99919atW2ePPvqoDRw40F544YXgOsePH3fB/6BBg+ziiy8+59cLAAAAQMaV1dKB3bt32xNPPGFTp061nTt3uqBKQbMyks2aNbNYoSDyzjvvDHsuR44c9vfff1tqUmCb8Dj1HijAbdKkiQuqt27daitWrHBZbHnrrbesUKFCLui+5pprLHv27FayZMngNhSof/755y5TreA8kpo1a9rHH38c/LtSpUquHdx+++0WFxdnWbNmta5du4a9pmLFirZw4UL75JNPrGfPnu658uXLB7Pbb7zxho9XBgAAAADSWZCt4O3yyy+3ggUL2lNPPWUXXXSRC9BmzJjhsqs//vijxRIFqaGl2NEC0KQ0GDXL4rLmOevj2Tq69WnPeeXahQsXDmaKdZy6IeDJmTOnK81esGCBC7IT+uKLL2z//v2n3VRIivata6QAO7F1vGMDAAAAgJSU5svF77vvPhfALVmyxG6++WbXr7ZGjRrWt29fV74s27ZtszZt2ljevHkj9gdO6MorrzytX676GXfp0iX4t7KfI0aMsDvuuMNtt1y5ci4w/P3334P7qlWrli1btiwsw6ubAboBoL7BWqdly5auNDq5dK7K+HqPEiVKWFqi8m9dO934UKZZLrvsMsuTJ48NGDDAjh496srHH3roIYuPj4967q+//rq1aNHCSpcunex979u3z4YPH27dunWLus73339v77//fqLrAAAAAECGzGRr4CuVKqtEWEFcQgpo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TzYAAAAAAD4hyAYAAAAAwCcE2QAAAAAA+IQgGwAAAAAAnxBkAwAAAADgE4JsAAAAAAB8QpANAAAAAIBPCLIBAAAAAPAJQTYAAIhJ+/fvt+LFi9vWrVvPyfbLly9vY8eOTfb669evt9KlS9tff/11To4HAJA2EGQDAJAGdOnSxdq2bWtplQLVTJky2cqVKy29eOKJJ6xNmzYuGA718ccf29VXX22FChWyXLly2YUXXmhdu3a1FStWnNH2ly5dat26dUv2+tWrV7fLLrvMxowZc0b7AQCkLwTZAAAgUSdOnEh3V+jo0aP2+uuv21133RX2/IABA6xDhw52ySWX2BdffGEbN260yZMnW8WKFW3gwIFntI9ixYpZ7ty5z+g1d955p02YMMHi4uLO6HUAgPSDIBsAgDToyiuvtF69elmfPn1cxrVEiRL26quvulJjBWr58uWzypUr29dffx18zdy5c122eerUqVarVi3LmTOny5yuXbv2tExujRo1LEeOHC7L+8wzz4Qt13PDhw+3O+64w/Lnz++ytRUqVHDLateu7fah4/Oyuc2bN7eiRYtagQIFrGnTprZ8+fKw7Wn91157zW688UYXlFapUsUFuKHWrVtn//rXv9z+dG5XXHGF/fLLL8Hlen21atXcOVWtWtVefPHFRK/ftGnT3Pnp/D2LFi2yJ5980mWS9dA+ypYta5deeqkNGjQo7Fpq38qC67rnzZvX6tWrZ998802i5eLJOU9dqwMHDti8efMSPX4AQPpFkA0AQBr11ltvueB1yZIlLuDu0aOHtWvXzho1auQC2WuvvdY6derksrah+vfv7wJnBcDKtl5//fV28uRJt+yHH36w9u3b2y233GJr1qyxoUOH2uDBg23ixIlh23j66aft4osvdiXUWq5jEAWau3btsk8++cT9/eeff1rnzp1twYIFLohVYNmqVSv3fKhhw4a5/a5evdot79ixows2ZefOndakSRMXFM+ePdsdo8q3vWzvpEmTbMiQIa78e8OGDTZy5Eh3TLo+0cyfP98Fz6Hee+89FzDfd999EV+jINlz5MgRd5yzZs1y16Bly5buOm7bti3R9yyx85Ts2bO7LLqODwAQowIAACDVde7cOdCmTZvg302bNg00btw4+HdcXFwgT548gU6dOgWf27VrV0D/lC9cuND9PWfOHPf3lClTguvs378/kCtXrsD777/v/r7tttsCzZs3D9t3//79A9WrVw/+Xa5cuUDbtm3D1tmyZYvb9ooVKxI9j/j4+EC+fPkCX375ZfA5vW7QoEHBv48cOeKe+/rrr93fAwcODFSoUCFw4sSJiNusVKlSYPLkyWHPDR8+PNCwYcOox6Fr2bVr17DnWrZsGahVq1bYc88884y7rt7j4MGDUbdZo0aNwLhx48Ku07PPPpvs8/TceOONgS5dukTdDwAgfSOTDQBAGqWSb0+WLFmsSJEidtFFFwWfUymz7N27N+x1DRs2DP5euHBhN7CXMsCin5dffnnY+vr7559/tvj4+OBzdevWTdYx7tmzx+655x6XwVa5uMq9lQVOmPENPZc8efK49bzj1mBqKt3Oli3badtXebxKt9W3Wllo7zFixIiwcvKEjh075krLk6KMufb/8ssvu339L1b+Xyb7oYceciXqBQsWdPvUtUsqk53YeXo02FrC6gMAQOzImtoHAAAAIksYdKqcOfQ5r7z51KlTvl9CBYjJoVJxTZX13HPPWbly5VzJt4L8hIOlRToX77gVdEajYFfUH71BgwZhy3TjIRqV2f/xxx9hz+lGgMraVTrvHY8CaD127NgRtq4C7JkzZ7qyefV91zH++9//TnIQuMTO06Py8UqVKiW6HQBA+kUmGwCAGKO+0R4Fmj/99JPLyIp+fvfdd2Hr6+8LLrgg0aBVfYklNNvtvbZ3796u/7E3mNq+ffvO6HiV/VUfZa/feChl60uVKmWbN292wW7owxuMLRIN0KZ5qUPdeuutLmhPatA077w0rZoGMVP1QMmSJX2bb1sD0en4AACxiUw2AAAx5vHHH3el5QpQH330UZfV9ebg7tevnxspW6OHayqrhQsX2gsvvJBk4Fm8eHGXzZ0+fbqVLl3alWKrPFzZ4XfeeceVlx8+fNgNupZYZjqSnj172rhx49xgbJpGS9vVjYL69eu7UncNJqZAXs9rALLjx4/bsmXL3A2Evn37RtxmixYt3La0jkZnF2XYdf56/Prrr3bTTTdZmTJl3EBumu5LWefMmf+Xf9B5aXA3DXam5zXQmh8VAwrUNdDbNddcc9bbAgCkTWSyAQCIMaNHj7YHHnjAja69e/du+/LLL4OZ6Dp16tgHH3xgU6ZMsZo1a7pRuxWUK2ubmKxZs9rzzz/v+i4rs6zprUTBqQJZbVcjnSsYVkB+JnRDQKOKK8usKcB03CoP90qv7777bjc11ptvvumyylpHo6EnlsnWet65hlL5t+bF1ojhmjJMwbRGbFcArRsO6kMtmuJLwblGclegraBd2ztbGuFco8KrtB4AEJsyafSz1D4IAABw9jRP9lVXXeWCXvUzzug0X7gy6yrP9jLUqUn9uRXUK8hPOPgcACB2UC4OAABiUuvWrd2o6SrPVll4atPI5I888ggBNgDEODLZAADECDLZAACkPoJsAAAAAAB8kvodlAAAAAAAiBEE2QAAAAAA+IQgGwAAAAAAnxBkAwAAAADgE4JsAAAAAAB8QpANAAAAAIBPCLIBAAAAAPAJQTYAAAAAAD4hyAYAAAAAwPzx/wBUrbUNB11gugAAAABJRU5ErkJggg==" + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9kAAAMWCAYAAADlCkWLAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA8BVJREFUeJzs3Qm4TeX7//HbPCZDpoQyRSIyZcg8RaKEyhiVypCppFSIEEXfTM2iuVQUkhTxlSlDKEqIMpYpZD7/6/N8/2v/9tln7+Mcds5yzvt1XTvn7L322sOzdPms+36elSomJibGAAAAAADAeUt9/rsAAAAAAACEbAAAAAAAoohKNgAAAAAAUULIBgAAAAAgSgjZAAAAAABECSEbAAAAAIAoIWQDAAAAABAlhGwAAAAAAKKEkA0AAAAAQJQQsgEAAC6w7du3W8aMGe2///3vBXm9Tp062ZVXXnlOz3300UetSpUqUX9PAJBcEbIBAMnK5MmTLVWqVGFvCgv/hsWLF9ugQYPswIED5tfvY8WKFXaxmjBhgvscycmQIUNccK1evXqcxxYuXGitW7e2AgUKWPr06e3SSy912+o5u3fvvuDvtVevXrZmzRqbMWPGBX9tALgYpU3qNwAAwL9BgeSqq66Kdd+11177r4XswYMHu2ph9uzZ/5XXSMkUsi+77DL3/SYHe/futTfffNPdQj355JP29NNPW5EiRdzn1Z/Hjh2z77//3p577jn3nF9//TXRr/nKK6/YmTNnzun95suXz5o3b26jR4+2W2655Zz2AQApCSEbAJAs3XTTTVaxYkW7mB05csSyZMliKdXRo0ctc+bMlty89dZbljZtWmvWrFms+99//30XsFXFnjp1qqtiBxszZoy7nYt06dKd13vWe2rVqpVt3rzZBX8AQGS0iwMAUqTZs2fbjTfe6ELsJZdcYk2bNrX169fH2uaHH34IVBM1f1YVvc6dO9tff/0V2EZt4g8//LD7WZVzrzV969at7qafw7U66349N3g/uu/HH3+0u+66y3LkyGE1atSIFcwqVKhgmTJlspw5c9odd9zh5vWeC32mrFmz2rZt2+zmm292P6s1efz48e7xtWvXWt26dd13U7hwYXvnnXfCtqB/++231rVrV8uVK5dly5bNOnToYPv37w9biS5durRlyJDBLr/8cuvWrVuc1vratWu7TgNVbGvWrOnC9WOPPebmEWtcFixYEPhuta3s27fP+vXrZ2XKlHGfQe9BJ1fU2hxs/vz57nkffPCBDRs2zK644go3nvXq1bNNmzbFeb9Lly61Jk2auDHQd1C2bFl74YUXYm2zYcMGu/32291YaF86oZPQdupPP/3UtX/rPYdWsVWxf+211+IEbFHbePAxI9OnT3fHrr5Xfb9FixZ1Qf306dPxzsn2jk1Vp19++WX3PD2/UqVKtnz58jivXb9+/cDrAQDiRyUbAJAsHTx40P78889Y9ynAiKqEHTt2tEaNGtnIkSNdxXTixIku1K5atSoQRubOnesqd3fffbcL2Ap7CiT6c8mSJS6k3Hbbbfbzzz/bu+++66qM3mvkzp3btQUnlqqFxYsXt2eeecZiYmLcfQqGTzzxhKsm3nPPPW6/L774ogujer/n0qKuEKZAqn08++yz9vbbb1v37t1dqHz88cetbdu27rNNmjTJheeqVavGab/X9nptBb+NGze67/C3334LhFrRY2qlV0h74IEHAtspyGnRr+AKq05e6D3pBEK7du0sb968LlD36NHDBVK9L9H9orFRYNV3pvem+covvfSS1apVy52sUPAMNmLECEudOrUL5jo+9Ln1ORWqPRpznXjInz+/PfTQQ27cf/rpJ/v888/d76Lx11xqnZjQPH99ZwrwLVq0sGnTptmtt94a8Xs/efKk++z6LoLpGNJN4xsavuOjEx7avk+fPu7Pr7/+2oX1Q4cO2ahRo876fJ1A+fvvv93JEo2ZvhONu77b4LFRwFcQ15j17t07we8PAFKkGAAAkpE33nhDyTTsTf7++++Y7Nmzx9x7772xnrdr166YSy+9NNb9R48ejbP/d9991+3r22+/Ddw3atQod9+WLVtibavfdb/eUyjd/9RTTwV+18+6784774y13datW2PSpEkTM2zYsFj3r127NiZt2rRx7o/0fSxfvjxwX8eOHd19zzzzTOC+/fv3x2TKlCkmVapUMe+9917g/g0bNsR5r94+K1SoEHPixInA/c8++6y7f/r06e73PXv2xKRPnz6mYcOGMadPnw5sN27cOLfd66+/HrivVq1a7r5JkybF+QylS5d2j4c6duxYrP1633mGDBlihgwZErjvm2++cfsuVapUzPHjxwP3v/DCC+5+fZdy6tSpmKuuuiqmcOHC7vsIdubMmcDP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G0CCHDlyxK666qqw4VShuUWLFrZ582abPn26rVq1yoXx+vXru+eFGjt2rAvYoQ4fPuzCeaFChWzp0qW2aNEiu+SSS1zQPnnyZMT31rt3b/vss8/sww8/tAULFtiOHTvstttuCzz+/fffW548eeytt96y9evX2+OPP24DBgywcePGBbbZsmWLNW3a1OrUqWOrV6+2Xr162T333GNz5szhCAEAAECKkOQhe9euXdajRw8rUqSIq3ypStasWTObN2+eJScKJaoMXnnllS4YKSCFO2Ggx4JvJUuWTJL3i3+Hwm/btm1dmA6livWSJUts4sSJVqlSJbv66qvdz//884+9++67sbZVgH3uuefs9ddfj7OfDRs22L59+2zIkCFuH6VLl7annnrKVaV/++23sO/r4MGD9tprr9nzzz9vdevWtQoVKtgbb7xhixcvdu9JOnfu7E4O1KpVy/19bdeund1999328ccfB/YzadIkdxJB702V7u7du9vtt99uY8aMicK3BwAAAPhf2qR88a1bt1r16tVdS+uoUaOsTJkyrtKmqpfaVhUWkoujR4+6YNKqVStXMYxEgeirr74K/J427bkNUZXh8+xU2izn9Fz8O7aOaBrv48ePH3d/ZsyYMXBf6tSp3cknVaNVEfaOpbvuusvGjx9v+fLli7MfBWu1fCs0P/bYY3b69Gn3s0KvTvKEoyq1/u6pau7RCR5Vw7/77ju74YYbIobznDlzBn7XtsH7EFXQVdEGAAAAUoIkrWQ/+OCDrlq7bNkyV+UtUaKEC5l9+vQJVM+2bdtmzZs3d3NEs2XLZq1bt441TzRU7dq14/yDXlVDzXP1KGhoXmyHDh3cftWSO2PGDNu7d2/gtcqWLWsrVqwIPEfzSnUyQCcAFFa0jaqSO3fuTNBnVWVSJxLuuOMOF5oiUahWcPJul112WYL2j4ufF2rVgr1//347ceKEjRw50n7//fdYx5lO0lSrVs0dq+GoNVzzotXWrbnTOla/+OILmz17dsSTNuooSZ8+vTvGg+XNm9c9Fo6q3O+//77dd999sfaj54Tu49ChQ64iDwAAACR3SVbJVjur/uE/bNgwy5IlbsVV/9g/c+ZMIPRqjuipU6dchbtNmzYuRJwPta8+88wz9sQTT7if27dv74KLWmIVhvv37+9CuNq8vXmvqiCOHj3apk6d6iqMapft16+f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LHPmzFa4cGEbNWrUOX5bAAAAQMqQLEK2AoWCAHAhHTlyxK677jobP3582Md//fVXq1Gjhgu78+fPtx9++MEee+wxS5cuXWCbDh062MaNG23GjBm2du1au+2226x169a2atWqwDYK3Qrid999t61Zs8b++9//2l133RXveytRooSNGzfO7XPRokV25ZVXWsOGDQMBf8OGDXbmzBl76aWXbP369TZmzBibNGmSe3+e2bNnW9u2be3++++3devW2YQJE9x22i8AAAAAH4dsVfN69OhhRYoUsQwZMljBggVdhXDevHmWnLzyyit24403usqiV11ctmxZ4PGTJ09a//79rUyZMq4CqQqpQtiOHTuS9H0jvJtuusmGDh1qt956a9jHH3/8cWvSpIk9++yzVr58eVct1nGdPXv2wDaLFy92x37lypXd8T9w4ED3+Pfff+8eP3XqlD300EOugqywq/B8zTXXuCAeH4VwHV/aZ+nSpe3555+3Q4cOuaAvjRs3tjfeeMMFb22janu/fv3s448/Duxj6tSprmKu19U2TZs2tQEDBtjIkSMtJiaGwwIAAAAII60lMbWtVq9e3QULBQkFTIXNOXPmWLdu3VzFLblQNfPOO++0atWqWcaMGV1YUchRJbFAgQJ29OhRW7lypT3xxBOuQrp//34XsBSAVqxYkajXqjJ8np1Km+Vf+ywp2dYRTc+6jarEavF+5JFHrFGjRq4yrdbshx9+OFYlW8fC+++/7wKs/g6oPfvYsWNWu3Zt97iOhz/++MNSp07tgrpOSKlrQ39Xrr322gS9X7WAv/zyy65lXcdVJAcPHrScOXMGfj9+/LhrEw+m1vLff//dfvvtN1cdBwAAAOCzSvaDDz7o5rOqotuyZUtXqVPlrU+fPrZkyRK3zbZt26x58+aWNWtWy5Ytm6vi7d69O+I+FVB69eoV6z5V5Dp16hT4XQFBVUhVirVfzTdVy67aab3XKlu2bKxwO3nyZBeEdAKgVKlSbhtVBHfu3Jmgz/r222+7z6uQpBbiV1991YUxr2KvEDR37lz3+a6++mq74YYbXGuuqpr6DnDx2LNnjx0+fNhGjBjhjpEvv/zSVbw1tmq99ihU66RSrly5XBdH165d7ZNPPrFixYq5xzdv3hyYEqEq9+eff+66IHSM79u3L973oG11jOqEjtq8dWxddtllYbfdtGmT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2YMGDbJy5col9dtAMvTtt99as2bN7PLLL7dUqVLZp59+GuvxTp06ufuDb40bN46zn5kzZ1qVKlUsW7Zs1rZtW2vZsmWcbSZPnmxly5a1jBkzWp48eaxbt27xvrdff/3Vbr31VsudO7fbb+vWrW337t1htz1+/Lj7O6L3t3r16rDbbNq0yS655BLLnj37Wb4VAAAAAL4O2bt27bIePXpYkSJFLEOGDFawYEEXbObNm2fJySuvvGI33nij5ciRw93q169vy5Yti7VNTEyMPfnkk5Y/f37LlCmT2+aXX35Jsvec0h05csSuu+46Gz9+fMRtFKp37twZuL377ruxHp82bZq1b9/e7r77bluxYoWNGDHC7rjjjljbPP/88/b444/bo48+auvXr7evvvrKGjVqFO/7atiwoQvNX3/9tf33v/+1EydOuL83Z86cibP9I4884k4URHLy5Em788473fEJAAAA4NyltSS2detWq169uquejRo1ysqUKeP+wT9nzhxXyduwYYMlF/Pnz3dBplq1aq5aOXLkSBeUFKoKFCjgtnn22WftP//5j7355pt21VVX2RNPPOHC1o8//uiek1BVhs+zU2mz/IufJvnbOqKp3XTTTe4WH50YypcvX9jHTp06ZQ899JA7trt06eKObVWMmzRpEthm//79NnDgQPvss8+sXr16gftV1Y5EoVp/d1atWuWq2KJjRidvFLp1csYze/Zs+/LLL13Y18/h6PVLlizpXn/x4sXxfl4AAAAAPq5kP/jgg64ap4quWmhLlChhpUuXtj59+tiSJUvcNtu2bbPmzZtb1qxZz9oWK7Vr17ZevXrFuq9Fixautddz5ZVX2tChQ61Dhw5uv4ULF7YZM2bY3r17A6+lkKPKY3A7r04G6ARAqVKl3DZeFTMh3n77bfd51barQPPqq6+6qqNXsVcVe+zYsS7w6D3o9adMmWI7duyI06YMf508UXv31VdfbQ888ID99ddfgcdWrlxpf/zxh6VOndrKly9vhQoVsiFDhti6desC28ydO9cdB9pOx9UVV1zhjvHt27dHfE21f+vvjQK+Rydh9DqLFi0K3Ke/J/fee69NnTrVMmfOHHZfCuUffvhhvNV6AAAAABdByN63b5998cUXrmKdJUvcqqsCrcKHAqe2XbBggQskmzdvtjZt2pz3648ZM8ZV0VUNbNq0qWvp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mtnll19uqVKlsk8//TTid3L//fe7bcaOHRvr/ltuucUKFSpkGTNmtPz581v79u1tx44dsbb54YcfrE6dOtaqVSsrUqSIPfvss2f97pcvX2716tWz7NmzW44cOaxRo0a2Zs2awOPz58+35s2bu9fMkiWLlStXzt5+++04+zlw4IB169bNbZchQwYrUaKEzZo1K8WPPQAAABBtKSJkDxo0yIUPIJwjR47YddddZ+PHj4/3C/rkk09syZIlLoyHUnj+4IMPbOPGjTZt2jT79ddf7fbbbw88fujQIWvYsKEL4s8995wNHz7cHZcvv/xyxNc7fPiwNW7c2D1n6dKltmjRIrvkkktc0D558qTbZvHixVa2bFn3mgrxd999t3Xo0ME+//zzwH5OnDhhDRo0sK1bt9pHH33k3uMrr7xiBQoU4IAAAAAAoiytXQR27dplw4YNs5kzZ9off/xhefLkcaG5V69ersqXXNSuXdsWLFgQ5/4mTZq4z45/x0033eRu8dFx16NHD5szZ441bdo0zuO9e/cO/Fy4cGF79NFHrUWLFi4Mp0uXzlWXFXYVbr/66is3puvWrbPnn3/e7rvvvrCvuWHDBtu3b58NGTLEChYs6O576qmnXKj+7bffrFixYvbYY4/Fes5DDz1kX375pX388cd28803u/tef/11tx8Fcr0XufLKK8/hmwIAAABw0YdsVd+qV6/u2mVHjRplZcqUccFFYUftrwoiyYWCkYKY56+//nIVVrUXJ1aV4fPsVNosUX6Hyc/WEXEDc6gzZ8649u+HH37YSpcufdbtFWgVqqtVqxYItd99953VrFnT0qdPH9hOFemRI0fa/v37XSt4qKuvvtpy5cplr732mgvTp0+fdj+XKlUq3pB88OBBt41nxowZVrVqVff3Zfr06ZY7d2676667rH///pYmTZqzfh4AAAAAyahd/MEHH3RzYJctW2YtW7Z0c0kVdPr06eNad2Xbtm1uXmrWrFktW7Zs1rp1a9u9e3e8FWNVwYOp6tipU6fA7woxQ4cOda232q+qkwore/fuDbyWKoorVqwIPGfy5MnuZIBOACjkaBu1++7cuTNBnzVnzpyWL1++wG3u3LmWOXPmcwrZiB4F4bRp01rPnj3j3U6hVfOiFYx1TCrQBndj5M2bN9b23u96LBy1hmvO9VtvvWWZMmVyx9MXX3xhs2fP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QKzHtO/rr7/eMmTIYMWKFbPJkyfHef748ePtyiuvtIwZM1qVKlVs2bJlCX5tAAAAAMkwZO/atct69OhhRYoUcWGiYMGCLhjNmzfPkpP169dby5YtXSBSoBo7dmycbf7++2/r1auXFS5c2DJlymTVqlWz5cuXJ8n7TQ6OHDli1113nQuioY4ePWorV660J554wv358ccf28aNG+2WW24Ju69HHnnEBfFQixcvtrJly9q0adPshx9+sLvvvtuF9c8//zxB77FLly7u+aG2bNliTZs2tTp16rhQr+PinnvusTlz5gS2ef/9961Pnz721FNPuc+gz9qoUSPbs2dPgl4bAAAAQPSltSS0detWq169umXPnt1GjRrlqoqqMCpIdOvWzTZs2GDJhUKdTiS0atXKevfuHXYbhah169bZ1KlTXaB76623rH79+vbjjz9agQIFEvV6VYbPs1Nps1hKtXVEU7vpppvcLZxLL73U5s6dG+u+cePGWeXKlW3btm1WqFChwP2zZ8+2L7/80gVp/Rzssccei/X7Qw895LZVaL/55pvjfY8TJ0501esnn3wyzn4nTZpkV111lT333HPu91KlStmiRYtszJgxLkjL888/b/fee68L9t5zZs6caa+//ro9+uijCfiWAAAAACSrSvaDDz7oqrpqcVWVt0SJEla6dGlXnVuyZInbRoFH7bhZs2a1bNmyWevWrW337t0R91m7dm1X9QvWokUL69SpU+B3VZOHDh3qKo7aryrHM2bMsL179wZeS9XFFStWBJ6jVl2dDNAJAAUebdO4cWPbuXNngj5rpUqV3ImEO+64w1XsQ/3zzz8uxD377LNWs2ZN1x6sVnj9qTCGf9/Bgwfd8ahx9uhYU5DViY/MmTMneD85c+aMdxudOBkyZIhNmTLFUqeO+9fwu+++cydYgilc6345ceKEff/997G20X70u7cNAAAAgBQUsvft22dffPGFq1hrLmsoBZ0zZ8640KttFyxY4CqPmzdvtjZt2pz366siqCr6qlWrXFtu+/btXehu166da70tWrSo+z0mJiZWNXr06NEucGm+r04A9OvXz6Lh1KlTdvr0aTe3NpjaxlXBxL/r2LFjbo72nXfe6U7miMZeJ2fuv/9+q1ixYoL288EHH7gWf6+6HI66NXS86aRLcMU8dBpF3rx5Y92n3w8dOuROyPz555/u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LV261L744gv3fXbq1Cne1z5y5IjVqFHDRo4cGfZx7Ve30aNH27p162zy5Mlu3126dAls8/3331uePHnsrbfecq/5+OOP24ABA2zcuHHn/J0AAAAASL7SJuWLb9261QUwVSdHjRrlKpwnT560OXPmWLdu3WzDhg2WXBw9etSdSGjVqpX17t07Yii87rrrrHPnznbbbbed1+tVGT7PTqXNYklp64imLuDqxMkbb7wRuP+qq64KW+3WyRaNfdOmTWM99vnnn7uQPn78eEud+n/nhSZNmmRly5a1TZs2ufAdTvv27f/3PrZuDfv4tddea9OmTQv8XrRoURs2bJirup86dcrSpk3rxiKYxvC7775zVfLu3bsn6vsAAAAAkPwlaSX7wQcfdBXbZcuWuSpviRIlrHTp0tanTx9X0ZRt27ZZ8+bNLWvWrJYtWzZr3bq17d69O+I+a9eubb169Yp1X4sWLWJVPVVNHjp0qHXo0MHtt3DhwjZjxgzbu3dv4LUU4IJbmlXl1MkAhUC1DGubxo0b286dOxP0WStVquROJNxxxx2uYh/OTTfd5N7XrbfeasmFvteKFSu6kwuqCJcvX95eeeWVWNucOXPGBeKHH37YjX+o48ePW/r06QMBW9S6LYsWLYrq+1WruI4zBez4tsmZM2dUXxcAAABA8pBkIVvzYdWaq4p1lixxK64KtApfCr3adsGCBTZ37lzbvHmztWnT5rxff8yYMa6KvmrVKlc5VchT6FYVU/N/VdXU7zExMbGq0Wotnjp1qmvt1gmAfv36nfd7Sc40XhMnTrTixYu7ExQPPPCAm/f85ptvBrZRtVuhVveHU7duXTetQCcpTpw44VrQH330UfdYQk9yJMSff/5pTz/9tJvvHcnixYvt/fffj3cbAAAAAClXkrWLq81XAbZkyZIRt9G87LVr19qWLVtcy7FMmTLFVTuXL1/uqsPnqkmTJta1a1f385NPPumCoPaniqv079/fqlat6qrm+fLlc/eplV1tygrgonbhIUOGWFJSlVc3z6FDh9yfGVLHWJo0/3eCICno+9KJkgoVKtjgwYMDLdo//PCD+77vuusud0JDC4lprrVatD2nT592zxd1OLz22mv2yCOPuPnQadKkcd993rx53THkbRff+/D+jLStvjcdE+pS0LzrcNtp3rZO+gwcONDq1Klz1tc923uB/zA+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yAYAAAAAIEoI2QAAAAAARAkhGwAAAACAKCFkAwAAAAAQJYRsAAAAAACihJANAAAAAECUELIBAAAAAIgSQjYAAAAAAFFCyAYAAAAAIEoI2QAAAAAARAkhGwAAAACAKCFkAwAAAAAQJYRsAAAAAACihJANAAAAAECUELIRFYMGDbJUqVLFupUsWTLweNeuXa1o0aKWKVMmy507tzVv3tw2bNgQax+hz9ftvffei/d1V65caQ0aNLDs2bNbrly57L777rPDhw+H3favv/6yK664wu33wIEDsR4bP368lSpVyr2/q6++2qZMmXJe3wcAAACAlCl1SgmA5cqVS+q3keyVLl3adu7cGbgtWrQo8FiFChXsjTfesJ9++snmzJljMTEx1rBhQzt9+nSsfWib4H20aNEi4uvt2LHD6tevb8WKFbOlS5faF198YevXr7dOnTqF3b5Lly5WtmzZOPdPnDjRBgwY4I4TPX/w4MHWrVs3++yzz87r+wAAAACQ8lwUIXvXrl3Wo0cPK1KkiGXIkMEKFixozZo1s3nz5lly8sorr9iNN95oOXLkcDcFyGXLltnFIm3atJYvX77A7bLLLgs8pgpzzZo17corr7Trr7/ehg4datu3b7etW7fG2ocq0sH7yJgxY8TX+/zzzy1dunSuCq3qc6VKlWzSpEk2bdo027RpU5wgrep1v3794uxn6tSprtLepk0bd4zdcccd7v2OHDkyKt8LAAAAgJQjrfmcQlj16tVd+Bo1apSVKVPGTp486aqhqjaGthxfzObPn2933nmnVatWzYVLhTxVe1VdLVCgQKL2VWX4PDuVNotdCFtHNHV//vLLL3b55Ze79161alUbPny4FSpUKM72R44ccRXrq666yp0wCaYxveeee1zYvf/+++3uu+927d3hHD9+3NKnT2+pU//fuSK1e4uq6Kpwy48//mhDhgxx1e7NmzeH3U9omNd+dIJDx5qCPAAAAAAki0r2gw8+6EKWAk/Lli2tRIkSri25T58+tmTJErfNtm3b3BzfrFmzWrZs2ax169a2e/fuiPusXbu29erVK9Z9aksObjNWxVXV1g4dOrj9Fi5c2GbMmGF79+4NvJZaj1esWBF4zuTJk93JAJ0A0PxebdO4cWPX9pwQb7/9tvu8am3XfOZXX33Vzpw5c1FU7KtUqeI+v1q2VTXesmWLq8r//fffgW0mTJjgvhPdZs+ebXPnznUh2aMg/MEHH7j7Ndb6Ll588cWIr1m3bl3X5aCTLydOnLD9+/fbo48+6h7zvnMFaJ240DbhAr80atTIfdfff/+9a2PXmOp3Bew///wzit8SAAAAgOTO15Xsffv2udA2bNgwy5IlblVWgVYh1Au9CxYssFOnTrlqqFp/VRk+H2PGjLFnnnnGnnjiCfdz+/btXZW5c+fOLrT179/fhXBVmr1q69GjR2306NGuBVkV1nbt2rkWZQXoxNK+FPRy5swZcRuFSN08hw4dcn9mSB1jadLE2IWg96jWdo9OMKglXJXkd99911WjRSc/dIJDwfj555+3Vq1auTHzqsheQJZrr73WfRZ9zw888EDY19UJl9dee80eeeQRN6c6TZo01r17d8ubN68Ly3pfGiO1kut40O86Prz3rJv3uprffcMNN7jn6fkat+eee87NGfe2i9Z3Ffwn/IXx8TfGx98YH39jfPyPMfI3xsffTl6Af2MnZt++DtmaV6vQE7xKdShVedeuXesqp17rsVaGVrV7+fLlbp7uuWrSpImbqytPPvmkq9BqfwqHogCntmhVzTV/2PvyNS9YK2mLQp8qtOdC+1f7dXCADaWWbC3UFWpg+TOWOXPsRcX+LbNmzQp7f548eezLL790oTWUugYUZLXYmOZqh6OTFL///rtNnz49Ysv2pZdeai+99JKbb635+jrZMXbsWPe73peeq04HzdMOpvHSOKrKLbfeequb56/naT683rdaxnUMBbejR4uq9fAvxsffGB9/Y3z8jfHxP8bI3xiflDs+R48eTR4hWwH7bLRatcJ18Nzea665xlW59dj5hOzglai9oKg54aH37dmzJxCyM2fOHAjYkj9/fvd4Yo0YMcJdvkrV+PgW/1IFV63zHlV/9V0MXZXaTqVLYxfCukGN4tyny2jpklmaT6+TFaFUfVd41ViFe1zWrFnjAq86FRJKLev6vh5++GF3DKiK/c8//wQeV0v4vffe675XzfvWiYBwFNRvueUWu/nmmy2adBJGf/l12THmevsP4+NvjI+/MT7+xvj4H2Pkb4yPv528AP/G9jqGL/qQXbx4cVeZjPbiZgp3oQE+XPk/eIC8dvBw96llPdxzvG0ScrIgmNrNFbK/+uqrsJecCqbqrW6hjp9JZadOh18wLNr0mdUSr0qw5q6r9fqpp55y7duqVmsV8ffff98t4qZrZKs6rc+nSrGeo+frclnqCFDLtkKy/pJo4Tft1/tONS9f7fnqXvAWghs3bpxr4dd0AT1H4Vr71utIaBfEwYMHAydLFMLl559/dvvWvHLN61Yru6YAqCPi3/pLqv0Ssv2L8fE3xsffGB9/Y3z8jzHyN8Yn5Y5PukTs19chW3ORtSiVLtHUs2fPOPOy1dqr+b8Kcbp51WytJq3HVCUNRwEseDEyzbtdt26d1alTx5Las88+6+aga/G0ihUrnvN+lg6oZ7ly5bILRcFZrdeqXuv7rVGjhluYTj/rBMbChQtddVghVh0AahFfvHhxoJLsXYqrd+/e7qSE5nMr7KrqHNyisXHjxlgnRBSOFehVOVegVuu45s4nhsZf86+1b70PHQd6b1r8DgAAAAASw9chWxS81HJcuXJlN7dZlV0tXqWqpeZIK1CrKtm2bVsX4vSYVqWuVatWxJCqVanVYj1z5kzX2q0wp1Ce1FS51dzvd955xwU8LRAm3orcfqbW9kg0rzzSvG2PVmHXLT5aNC20K0DV5sQItw+dqFm1alWi9gMAAAAAF+UlvDRvduXKla662LdvX7fqtHrt1TKskK12bC1upbm7qo5qkTA9R+3JkWh18I4dO7rWY4Vxbe+HKrY+jy5Fdfvtt7u53N5N7eMAAAAAAP/zfSVbFDQ191a3cHT9YwXtSLSCtW4etQTrms26RbJ169Y494VWQFVtDr5PK2YHX2vbu/52Qudkh3tNAAAAAMDFw/eVbAAAAAAALhaE7AvIm1sd7qaFwQAAAAAAF7eLol08uVi9enXEx7xLUgEAAAAALl6E7AtIl6UCAAAAACRftIsDAAAAABAlhGwAAAAAAKKEkA0AAAAAQJQQsgEAAAAAiBJCNgAAAAAAUULIBgAAAAAgSgjZAAAAAABECSEbAAAAAIAoIWQDAAAAABAlhGwAAAAAAKKEkA0AAAAAQJQQsgEAAAAAiBJCNgAAAAAAUULIBgAAAAAgSgjZAAAAAABECSEbAAAAAIAoIWTjvI0YMcJSpUplvXr1CtxXu3Ztd1/w7f777w88vmbNGrvzzjutYMGClilTJitVqpS98MILZ32tlStXWoMGDSx79uyWK1cuu+++++zw4cOxtlm+fLnVq1fPbZMjRw5r1KiRe71gP/zwg914442WMWNG9x6effZZjgQAAAAA5y1FhOxBgwZZuXLlkvptJEsKtC+99JKVLVs2zmP33nuv7dy5M3ALDrLff/+95cmTx9566y1bv369Pf744zZgwAAbN25cxNfasWOH1a9f34oVK2ZLly61L774wj23U6dOgW0UuBs3bmyFChVy2yxatMguueQSF7RPnjzptjl06JA1bNjQChcu7N7HqFGj3DHy8ssvR/37AQAAAJCyXBQhe9euXdajRw8rUqSIZciQwVUemzVrZvPmzbPkZuzYsXb11Ve76q4+Z+/eve3YsWPmRwq0bdu2tVdeecVVjENlzpzZ8uXLF7hly5Yt8Fjnzp1d5bpWrVpuXNu1a2d33323ffzxxxFf7/PPP7d06dLZ+PHj3XdUqVIlmzRpkk2bNs02bdrkttmwYYPt27fPhgwZ4rYpXbq0PfXUU7Z792777bff3DZvv/22nThxwl5//XX3+B133GE9e/a0559//l/5ngAAAACkHGnN57Zu3WrVq1d3rb+qOJYpU8ZVJOfMmWPdunVzoSq5eOedd+zRRx914a9atWr2888/uyqtWq0TGwCrDJ9np9Jm+Vfe59YRTd2f+v6bNm3qqstDhw6Ns53CrCrVCtg6KfLEE0+44B3JwYMHLWfOnBEfP378uKVPn95Sp/6/c0M6GSGqWKvCrWCtNvLXXnvNHnvsMTt9+rT7We3oV155pdv2u+++s5o1a7p9eVTpHjlypO3fvz/sCQMAAAAASBaV7AcffNCFzGXLllnLli2tRIkSrvrYp08fW7Jkidtm27Zt1rx5c8uaNaurlrZu3dpVLiPRfOHg+cPSokWLWG3HCmQKjh06dHD7VWvxjBkzbO/evYHXUov0ihUrAs+ZPHmyOxmgEwAKddpGrctqlU6IxYsXuxMKd911l3t9tTRr3rI+u9+89957bn708OHDwz6uz6CA/c0337g28KlTp7pqdXyf/f3333dzrCOpW7eu62rQyRZVohWIdVJCvO9YreHz5893r60ArjFQW/ns2bMtbdr/nVPSPvLmzRtr397vegwAAAAAkmUlW22/CkjDhg2zLFniVmUVaM+cORMIvQsWLLBTp065CmubNm1c2DofY8aMsWeeecZVYPVz+/btXYVZrc4Kev3793chXPOCdSJAjh49aqNHj3ahUhVXBct+/fq5qu7ZaN8KhwrVlStXts2bN9usWbPc68ZX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AACECUE2AAAAAABhQpANAAAAAECYEGQDAAAAABAmBNkAAAAAAIQJQTYAAAAAAGFCkA0AAAAAQJgQZAMAAAAAECYE2QAAAAAAhAlBNgAAAAAAYUKQDQAAAABAmBBkAwAAAAAQJgTZAAAAAACECUE2AAAAAABhQpCNWI0YMcJq1qxpWbJksbx581qrVq1s+/bt0bb5+eefrXXr1pYnTx7LmjWrtW3b1g4ePBjr/k6dOmVVq1a1FClS2Pr16+O96g8++KCVLFnSMmTI4PbdsmVL++GHH4LPb9iwwdq3b2+FCxd225QvX95effXVaPtYvHixO1bM24EDB2hxAAAAAFfMVR9kDx061AVvCK8lS5bYww8/bCtWrLD58+fbmTNn7Pbbb7e//vrLPa+vuq/AddGiRfbtt9/a6dOnrUWLFnb+/PkL9vfEE09YgQIFEnTs6tWr28SJE23btm02b948CwQC7ljnzp1zz69Zs8YF/h999JFt2bLFnn76aRs0aJC9/vrrF+xLHQP79+8P3vQ6AAAAALhSUluEKbM4fPhwmz17tu3bt88FQQqaH330UWvYsKElF++884598MEHtnnz5mAg+eKLL1qtWrWibafAcuDAgS7IPXv2rFWoUME+++wzK1KkSJKe79y5c6PdnzRpkmsbBbj169d3QfXu3btt3bp1Lost77//vuXIkcMF3Y0aNQq+9quvvrL//d//de9D31/MAw88EPy+WLFiNmzYMLv++uvd8ZTh7tatW7TtS5QoYcuXL7fp06db7969oz2nc86ePfslXwcAAAAAuGqCbAVN9erVc0HQyy+/bJUrV3YZU2UvlUUNLRG+2ql8WSXOdevWtfTp09u///1vl51VJrZgwYLB8uubbrrJunfvbs8995wLXvW8tk+s2iMW2tnUmRL9ut0jm8f6+PHjx93XnDlzBsu/lcVOly5dcBudZ8qUKW3ZsmXBIFvl4z169LAZM2ZYxowZE30+ypgrq128eHFXHh4XnZ93bqHUYaNzrVSpkqt60M8bAAAAACTLcvFevXq5QG3VqlV29913W5kyZaxixYrWr18/V6Yse/bscWNyM2fOfNFxv3LLLbe4LHgojSfu2rXrBdnRzp07u/0WLVrUZs6cab///nvwWFWqVLHVq1dHy+SqM0AdABoDrG2aNm3qSpATYvLkye79KugrV66c/ec//3Fl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AAAAQJgQZAMAAAAAECYE2QAAAAAAhMlVH2QPHTrUqlatGunTSFZGjBhhNWvWtCxZsljevHmtVatWtn379mjbHDhwwDp16mT58+e3TJky2Q033GCfffZZ8PnFixdbihQpYr19//33cR77559/ttatW1uePHksa9as1rZtWzt48GC0bY4cOWIdOnRwz2fPnt26d+9uJ0+ejHV/O3bscO9D2wEAAABAsg+yFaz16dPHSpQoYenSpbPChQtbixYtbOHChZacTJ8+3WrUqOGCPQWl6hj48MMPL9jm9ttvt1y5crlgdP369RE51yVLltjDDz9sK1assPnz59uZM2fcef3111/BbTp37uwC75kzZ9qmTZvsrrvucgHxunXr3PN169a1/fv3R7vdf//9Vrx4cXcdYqP96zh674sWLbJvv/3WTp8+7X4ezp8/H9xOAfaWLVvcuX355Zf2zTff2AMPPHDB/nTe7du3t5tvvvmKXCcAAAAAiCm1RdDu3butXr16LvB8+eWXrXLlyi4wmjdvngvyfvjhB0sucubMaU8//bSVK1fO0qZN64LD++67z2WKmzRpEgwyb7rpJhes9ujR47KOV3vEQjubOlOiX7d7ZHObO3dutMcmTZrkznPNmjVWv35999h3331nEyZMsFq1arn7gwcPtjFjxrhtqlWr5t6jstwetesXX3zhOlQURMdGQbV+JhSoK0st77//vuXIkcMF3Y0aNbJt27a581M23AvWx40bZ82aNbNRo0ZZgQIFgvvTOel6N2zY0J0vAAAAACTrTHavXr1cwLVq1Sq7++67rUyZMlaxYkXr16+fy6LKnj17rGXLlpY5c+Y4y4dD3XLLLfboo49Ge0zlzl27dg3eL1asmA0bNsxlY7XfokWLuozs77//HjxWlSpVbPXq1dECTXUGqAOgfPnybpumTZu6DG1C6LxUBq3XlixZ0h555BF3jGXLlgW3Ufn1kCFDXDDpJ8ePHw92FHiUqf7kk09c6bayzFOnTrV//vnHvc/Y6PoePnzYdSzE5dSpU+7nQRUNnvTp01vKlCmD12n58uWuHUKz4bpe2mblypXBxxSUf/rppzZ+/PjLfPcAAAAAcBUE2QrOlJFUxlrl0zEpkFLwpqBX26qEWeXBO3futHbt2l328ZV1VRZdWdPmzZu7AFdBd8eOHW3t2rUuENb9QCAQfE1UVJTL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" }, "metadata": {}, "output_type": "display_data", @@ -1526,39 +1536,39 @@ "text": [ "\n", "[特征重要性排名 - Gain]\n", - "ebitda_rank 12044.385847\n", - "bbi_ratio_factor 1996.570270\n", - "std_return_90 1900.096352\n", - "return_10 1707.237531\n", - "cs_rank_turnover_rate 1700.674361\n", - "ma_ratio 1449.246176\n", - "std_return_5 1112.916802\n", - "high_low_ratio 1002.711145\n", - "vol_ma20 800.361497\n", - "ma20 743.156761\n", - "cs_rank_volume_ratio 620.018650\n", - "vol_ratio 614.280431\n", - "turnover_rate_mean_5 574.150844\n", - "return_20 530.409461\n", - "volume_change_rate 516.283890\n", - "return_diff 427.252813\n", - "market_cap_rank 367.685596\n", - "volatility_20 297.221084\n", - "vol_std_5 245.201921\n", - "volatility_5 210.447650\n", - "ma10 175.131429\n", - "ma5 137.251949\n", - "vol_ma5 105.623339\n", - "ebit_rank 102.653185\n", - "profit_to_market_cap 65.704505\n", - "operate_profit_rank 64.448026\n", - "operate_profit_to_market_cap 59.952241\n", - "cashflow_to_market_cap 40.900113\n", - "n_income_rank 34.135645\n", - "n_cashflow_act_rank 27.246159\n", - "money_cap_rank 22.246325\n", - "total_liab_rank 21.635597\n", - "total_profit_rank 17.579179\n", + "ebitda_rank 14994.629439\n", + "bbi_ratio_factor 1948.020045\n", + "cs_rank_turnover_rate 1686.329153\n", + "std_return_90 1566.943976\n", + "return_10 1430.825613\n", + "std_return_5 1242.399894\n", + "ma_ratio 979.636333\n", + "high_low_ratio 932.793097\n", + "volume_change_rate 652.408669\n", + "vol_ratio 651.873589\n", + "cs_rank_volume_ratio 649.430382\n", + "vol_ma20 649.122400\n", + "turnover_rate_mean_5 615.645898\n", + "ma20 535.948738\n", + "return_20 452.979679\n", + "market_cap_rank 407.870511\n", + "return_diff 304.914024\n", + "ebit_rank 294.325396\n", + "profit_to_market_cap 287.904060\n", + "vol_std_5 243.944097\n", + "operate_profit_to_market_cap 232.366538\n", + "ma10 201.935446\n", + "volatility_20 169.372244\n", + "volatility_5 161.736089\n", + "ma5 111.549055\n", + "n_income_rank 79.050783\n", + "vol_ma5 73.284933\n", + "operate_profit_rank 57.328938\n", + "total_profit_rank 35.760864\n", + "n_cashflow_act_rank 34.917162\n", + "money_cap_rank 32.511166\n", + "total_liab_rank 24.127689\n", + "cashflow_to_market_cap 20.326702\n", "turnover_deviation 0.000000\n", "dtype: float64\n", "\n", diff --git a/tests/test_financial_price_merge.py b/tests/test_financial_price_merge.py index 8936d8e..b6bd6aa 100644 --- a/tests/test_financial_price_merge.py +++ b/tests/test_financial_price_merge.py @@ -16,7 +16,7 @@ def create_mock_price_data() -> pl.DataFrame: """创建模拟行情数据。""" return pl.DataFrame( { - "ts_code": ["000001.SZ"] * 10, + "ts_code": ["000001.SZ"] * 12, "trade_date": [ "20240101", "20240102", @@ -28,8 +28,24 @@ def create_mock_price_data() -> pl.DataFrame: "20240110", "20240111", "20240112", + # 添加2024-04-30之后的日期,用于测试同日不同报告期场景 + "20240501", + "20240502", + ], + "close": [ + 10.0, + 10.2, + 10.3, + 10.1, + 10.5, + 10.6, + 10.4, + 10.7, + 10.8, + 10.9, + 11.0, + 11.1, ], - "close": [10.0, 10.2, 10.3, 10.1, 10.5, 10.6, 10.4, 10.7, 10.8, 10.9], } ) @@ -37,31 +53,63 @@ def create_mock_price_data() -> pl.DataFrame: def create_mock_financial_data() -> pl.DataFrame: """创建模拟财务数据(覆盖多种场景)。 + 场景说明: + 1. 2024-01-02 发布 2023Q3 报告(end_date=20230930) + 2. 2024-01-02 发布 2023Q3 更正版(update_flag=1) + 3. 2024-04-30 同时发布 2023年报(end_date=20231231)和 2024Q1季报(end_date=20240331) + 4. 2024-04-30 发布 2023年报更正版 + + 预期结果: + - 2024-01-02 保留 2023Q3 更正版 + - 2024-04-30 保留 2024Q1 季报(end_date 最新) + 注意:f_ann_date 必须是 Date 类型(与数据库保持一致)。 """ return pl.DataFrame( { - "ts_code": ["000001.SZ", "000001.SZ", "000001.SZ", "000001.SZ"], - # 场景1: 2023Q3 报告,正常公告 - # 场景2: 同日多版(update_flag 区分) - # 场景3: 隔日修改 + "ts_code": [ + "000001.SZ", + "000001.SZ", + "000001.SZ", + "000001.SZ", + "000001.SZ", + ], "f_ann_date": [ date(2024, 1, 2), - date(2024, 1, 2), - date(2024, 1, 5), - date(2024, 1, 10), + date(2024, 1, 2), # 同日多版 + date(2024, 4, 30), + date(2024, 4, 30), + date(2024, 4, 30), # 同日不同报告期 + ], + "end_date": [ + "20230930", + "20230930", # 2023Q3 + "20231231", + "20240331", + "20231231", # 年报和季报同一天发布 + ], + "report_type": [1, 1, 1, 1, 1], # 整数类型(与数据库一致) + "update_flag": [0, 1, 0, 0, 1], # 年报也有更正版 + "net_profit": [ + 1000000.0, + 1100000.0, # 2023Q3 + 5000000.0, + 1500000.0, + 5500000.0, # 年报更正后550万,季报150万 + ], + "revenue": [ + 5000000.0, + 5200000.0, # 2023Q3 + 20000000.0, + 8000000.0, + 22000000.0, ], - "end_date": ["20230930", "20230930", "20230930", "20231231"], - "report_type": [1, 1, 1, 1], # 整数类型(与数据库一致) - "update_flag": [0, 1, 1, 1], # 整数类型(与数据库一致) - "net_profit": [1000000.0, 1100000.0, 1100000.0, 1200000.0], - "revenue": [5000000.0, 5200000.0, 5200000.0, 6000000.0], } ) def test_financial_data_cleaning(): - """测试财务数据清洗逻辑。""" + """测试财务数据清洗逻辑 - 确保同日多报告期时选 end_date 最新的。""" print("=== 测试 1: 财务数据清洗 ===") df_finance = create_mock_financial_data() @@ -70,36 +118,61 @@ def test_financial_data_cleaning(): loader = FinancialLoader() - # 手动执行清洗(模拟 load_financial_data 的逻辑) - # 步骤1: 仅保留合并报表 + # 手动执行新的清洗逻辑 df = df_finance.filter(pl.col("report_type") == 1) - # 步骤2: 按 update_flag 降序排列后去重 + # 添加辅助列 df = df.with_columns( - [pl.col("update_flag").cast(pl.Int32).alias("update_flag_int")] + [ + pl.col("end_date").cast(pl.Int32).alias("end_date_int"), + pl.col("update_flag") + .fill_null("0") + .cast(pl.Int32, strict=False) + .fill_null(0) + .alias("update_flag_int"), + ] ) - df = df.sort( - ["ts_code", "f_ann_date", "update_flag_int"], descending=[False, False, True] + # 确定性排序 + df = df.sort(["ts_code", "f_ann_date", "end_date_int", "update_flag_int"]) + + # 累积最大报告期 + df = df.with_columns( + pl.col("end_date_int").cum_max().over("ts_code").alias("max_end_date_seen") ) - df = df.unique(subset=["ts_code", "f_ann_date"], keep="first") - df = df.drop("update_flag_int") + # 过滤历史包袱 + df = df.filter(pl.col("end_date_int") == pl.col("max_end_date_seen")) - # 步骤3: 排序(f_ann_date 已经是 Date 类型) + # 去重保留最后一条(end_date 最大的) + df = df.unique(subset=["ts_code", "f_ann_date"], keep="last") + + # 清理辅助列 + df = df.drop(["end_date_int", "update_flag_int", "max_end_date_seen"]) df = df.sort(["ts_code", "f_ann_date"]) print("\n清洗后的财务数据:") print(df) - # 验证:应该有3条记录(第1-2行去重为1条,第3行,第4行) - assert len(df) == 3, f"清洗后应该有3条记录,实际有 {len(df)} 条" + # 验证:应该有2条记录(2024-01-02 和 2024-04-30) + assert len(df) == 2, f"清洗后应该有2条记录,实际有 {len(df)} 条" - # 验证:2024-01-02 的 update_flag 应该是 1 + # 验证:2024-01-02 的 end_date 应该是 20230930 row_jan02 = df.filter(pl.col("f_ann_date") == date(2024, 1, 2)) - assert len(row_jan02) == 1, "应该有1条 2024-01-02 的记录" - assert row_jan02["update_flag"][0] == 1, "update_flag 应该为 1" - assert row_jan02["net_profit"][0] == 1100000.0, "net_profit 应该为 1100000" + assert len(row_jan02) == 1 + assert row_jan02["end_date"][0] == "20230930" + assert row_jan02["update_flag"][0] == 1 + print("[验证 1] 2024-01-02 正确保留了 2023Q3 更正版") + + # 验证:2024-04-30 应该保留 2024Q1(end_date=20240331),而不是年报 + row_apr30 = df.filter(pl.col("f_ann_date") == date(2024, 4, 30)) + assert len(row_apr30) == 1 + assert row_apr30["end_date"][0] == "20240331", ( + f"2024-04-30 应该保留 end_date 最新的 20240331," + f"实际为 {row_apr30['end_date'][0]}" + ) + assert row_apr30["net_profit"][0] == 1500000.0 + print("[验证 2] 2024-04-30 正确保留了 2024Q1 季报(end_date 最新)") print("\n[通过] 财务数据清洗测试通过!") return df @@ -114,17 +187,44 @@ def test_financial_price_merge(): loader = FinancialLoader() - # 步骤1: 清洗财务数据(手动执行) + # 步骤1: 清洗财务数据(手动执行新的清洗逻辑) # 注意:f_ann_date 已经是 Date 类型,不需要转换 df_finance = df_finance_raw.filter(pl.col("report_type") == 1) + + # 添加辅助列 df_finance = df_finance.with_columns( - [pl.col("update_flag").cast(pl.Int32).alias("update_flag_int")] + [ + pl.col("end_date").cast(pl.Int32).alias("end_date_int"), + pl.col("update_flag") + .fill_null("0") + .cast(pl.Int32, strict=False) + .fill_null(0) + .alias("update_flag_int"), + ] ) + + # 确定性排序 df_finance = df_finance.sort( - ["ts_code", "f_ann_date", "update_flag_int"], descending=[False, False, True] + ["ts_code", "f_ann_date", "end_date_int", "update_flag_int"] + ) + + # 累积最大报告期 + df_finance = df_finance.with_columns( + pl.col("end_date_int").cum_max().over("ts_code").alias("max_end_date_seen") + ) + + # 过滤历史包袱 + df_finance = df_finance.filter( + pl.col("end_date_int") == pl.col("max_end_date_seen") + ) + + # 去重保留最后一条(end_date 最大的) + df_finance = df_finance.unique(subset=["ts_code", "f_ann_date"], keep="last") + + # 清理辅助列 + df_finance = df_finance.drop( + ["end_date_int", "update_flag_int", "max_end_date_seen"] ) - df_finance = df_finance.unique(subset=["ts_code", "f_ann_date"], keep="first") - df_finance = df_finance.drop("update_flag_int") df_finance = df_finance.sort(["ts_code", "f_ann_date"]) print("清洗后的财务数据:") @@ -166,15 +266,22 @@ def test_financial_price_merge(): assert jan04["net_profit"][0] == 1100000.0, "2024-01-04 应延续使用 2023Q3 数据" print("[验证 3] 2024-01-04 net_profit=1100000 - 正确(延续使用)") - # 20240110 应切换到 2023Q4 数据(新公告) + # 20240110 应延续使用 2023Q3 数据(2024-04-30 还未公告) jan10 = merged.filter(pl.col("trade_date") == "20240110") - assert jan10["net_profit"][0] == 1200000.0, "2024-01-10 应切换到 2023Q4 数据" - print("[验证 4] 2024-01-10 net_profit=1200000 - 正确(新财报公告)") + assert jan10["net_profit"][0] == 1100000.0, "2024-01-10 应延续使用 2023Q3 数据" + print("[验证 4] 2024-01-10 net_profit=1100000 - 正确(延续使用 2023Q3)") - # 20240112 应继续延续使用 2023Q4 数据 + # 20240112 应继续延续使用 2023Q3 数据 jan12 = merged.filter(pl.col("trade_date") == "20240112") - assert jan12["net_profit"][0] == 1200000.0, "2024-01-12 应继续使用 2023Q4 数据" - print("[验证 5] 2024-01-12 net_profit=1200000 - 正确(延续使用)") + assert jan12["net_profit"][0] == 1100000.0, "2024-01-12 应继续使用 2023Q3 数据" + print("[验证 5] 2024-01-12 net_profit=1100000 - 正确(延续使用 2023Q3)") + + # 20240501 应切换到 2024Q1 数据(2024-04-30 已公告,且选择 end_date 最新的) + may01 = merged.filter(pl.col("trade_date") == "20240501") + assert may01["net_profit"][0] == 1500000.0, "2024-05-01 应切换到 2024Q1 数据" + print( + "[验证 6] 2024-05-01 net_profit=1500000 - 正确(切换到 2024Q1,end_date 最新)" + ) print("\n[通过] 所有验证通过,无未来函数!") return merged