feat(data): 为数据同步添加事务支持和同步日志

- Storage/ThreadSafeStorage 添加事务支持(begin/commit/rollback)
- 新增 SyncLogManager 记录所有同步任务的执行状态
- 集成事务到 StockBasedSync、DateBasedSync、QuarterBasedSync
- 在 sync_all 和 sync_financial 调度中心添加日志记录
- 新增测试验证事务和日志功能
This commit is contained in:
2026-03-23 21:10:15 +08:00
parent 31b25074c3
commit bace4cc5f4
10 changed files with 1468 additions and 177 deletions

View File

@@ -101,14 +101,14 @@ EXCLUDED_FACTORS = [
'GTJA_alpha005',
'GTJA_alpha036',
'GTJA_alpha027',
'GTJA_alpha053',
'GTJA_alpha044',
'GTJA_alpha073',
'GTJA_alpha104',
'GTJA_alpha103',
'GTJA_alpha087',
'GTJA_alpha105',
'GTJA_alpha092',
'GTJA_alpha087',
'GTJA_alpha085',
'GTJA_alpha044',
'GTJA_alpha062',
'GTJA_alpha124',
'GTJA_alpha133',
@@ -203,23 +203,37 @@ print("\n" + "=" * 80)
print("开始训练")
print("=" * 80)
# 步骤 1: 股票池筛选
print("\n[步骤 1/6] 股票池筛选")
# 步骤 1: 应用过滤器ST股票过滤等
print("\n[步骤 1/7] 应用数据过滤器")
print("-" * 60)
filtered_data = data
if st_filter:
print(" 应用 ST 股票过滤器...")
data_before = len(filtered_data)
filtered_data = st_filter.filter(filtered_data)
data_after = len(filtered_data)
print(f" 过滤前记录数: {data_before}")
print(f" 过滤后记录数: {data_after}")
print(f" 删除 ST 股票记录数: {data_before - data_after}")
else:
print(" 未配置 ST 过滤器,跳过")
# 步骤 2: 股票池筛选
print("\n[步骤 2/7] 股票池筛选")
print("-" * 60)
if pool_manager:
print(" 执行每日独立筛选股票池...")
filtered_data = pool_manager.filter_and_select_daily(data)
print(f" 筛选前数据规模: {data.shape}")
print(f" 筛选后数据规模: {filtered_data.shape}")
print(f" 筛选前股票数: {data['ts_code'].n_unique()}")
print(f" 筛选后股票数: {filtered_data['ts_code'].n_unique()}")
print(f" 删除记录数: {len(data) - len(filtered_data)}")
pool_data_before = len(filtered_data)
filtered_data = pool_manager.filter_and_select_daily(filtered_data)
pool_data_after = len(filtered_data)
print(f" 筛选前数据规模: {pool_data_before}")
print(f" 筛选后数据规模: {pool_data_after}")
print(f" 删除记录数: {pool_data_before - pool_data_after}")
else:
filtered_data = data
print(" 未配置股票池管理器,跳过筛选")
# %%
# 步骤 2: 划分训练/验证/测试集(正确的三分法)
print("\n[步骤 2/6] 划分训练集、验证集和测试集")
# 步骤 3: 划分训练/验证/测试集(正确的三分法)
print("\n[步骤 3/7] 划分训练集、验证集和测试集")
print("-" * 60)
if splitter:
# 正确的三分法train用于训练val用于验证/早停test仅用于最终评估
@@ -251,8 +265,8 @@ else:
test_data = filtered_data
print(" 未配置划分器,全部作为训练集")
# %%
# 步骤 3: 数据质量检查(必须在预处理之前)
print("\n[步骤 3/7] 数据质量检查")
# 步骤 4: 数据质量检查(必须在预处理之前)
print("\n[步骤 4/7] 数据质量检查")
print("-" * 60)
print(" [说明] 此检查在 fillna 等处理之前执行,用于发现数据问题")
@@ -269,8 +283,8 @@ check_data_quality(test_data, feature_cols, raise_on_error=True)
print(" [成功] 数据质量检查通过,未发现异常")
# %%
# 步骤 4: 训练集数据处理
print("\n[步骤 4/7] 训练集数据处理")
# 步骤 5: 训练集数据处理
print("\n[步骤 5/7] 训练集数据处理")
print("-" * 60)
fitted_processors = []
if processors:
@@ -296,7 +310,7 @@ for col in feature_cols[:5]: # 只显示前5个特征的缺失值
if null_count > 0:
print(f" {col}: {null_count} ({null_count / len(train_data) * 100:.2f}%)")
# %%
# 步骤 4: 训练模型
# 步骤 5: 训练模型
print("\n[步骤 5/7] 训练模型")
print("-" * 60)
print(f" 模型类型: LightGBM")
@@ -318,7 +332,7 @@ print("\n 开始训练...")
model.fit(X_train, y_train)
print(" 训练完成!")
# %%
# 步骤 5: 测试集数据处理
# 步骤 6: 测试集数据处理
print("\n[步骤 6/7] 测试集数据处理")
print("-" * 60)
if processors and test_data is not train_data:
@@ -334,7 +348,7 @@ if processors and test_data is not train_data:
else:
print(" 跳过测试集处理")
# %%
# 步骤 6: 生成预测
# 步骤 7: 生成预测
print("\n[步骤 7/7] 生成预测")
print("-" * 60)
X_test = test_data.select(feature_cols)