feat(data): 为数据同步添加事务支持和同步日志
- Storage/ThreadSafeStorage 添加事务支持(begin/commit/rollback) - 新增 SyncLogManager 记录所有同步任务的执行状态 - 集成事务到 StockBasedSync、DateBasedSync、QuarterBasedSync - 在 sync_all 和 sync_financial 调度中心添加日志记录 - 新增测试验证事务和日志功能
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user