This commit is contained in:
jack
2025-11-14 18:34:24 +08:00
parent 168298ace4
commit 83bac3cf78
13 changed files with 1041 additions and 780 deletions
+52 -31
View File
@@ -7,9 +7,9 @@ from random import uniform
from typing import List, Dict, Any
from core.api_client import WorldQuantBrainSimulate
from core.models import SimulationResult, TrainMetrics, TestMetrics, AlphaInfo
from core.models import SimulationResult
from utils.time_utils import format_time
from utils.file_utils import save_results_to_file
from utils.file_utils import save_results_to_file, save_success_alpha
class AlphaSimulationManager:
@@ -19,7 +19,7 @@ class AlphaSimulationManager:
"""模拟单个Alpha因子(线程安全)"""
def simulate_single_alpha(self, api: WorldQuantBrainSimulate, expression: str,
settings: Dict[str, Any] = None) -> SimulationResult:
settings: Dict[str, Any] = None) -> SimulationResult:
alpha_start_time = time.time()
try:
@@ -30,7 +30,7 @@ class AlphaSimulationManager:
# 根据模拟结果类型处理
if simulation_result["status"] == "success":
# 模拟成功的结果
# 模拟成功的结果 - 直接使用原始metrics数据
metrics = simulation_result["metrics"]
result = SimulationResult(
expression=expression,
@@ -40,10 +40,7 @@ class AlphaSimulationManager:
status="success",
description="/",
simulation_timestamp=time.strftime("%Y-%m-%d %H:%M:%S"),
train_metrics=metrics.train_metrics,
is_metrics=metrics.is_metrics,
test_metrics=metrics.test_metrics,
alpha_info=metrics.alpha_info
metrics=metrics # 直接存储原始metrics数据
)
print(f"✓ 因子模拟成功: {expression}")
print(f" 耗时: {format_time(time_consuming)},Alpha ID: {simulation_result['alpha_id']}")
@@ -60,7 +57,8 @@ class AlphaSimulationManager:
alpha_id="/",
status="error",
description=simulation_result["message"],
simulation_timestamp=time.strftime("%Y-%m-%d %H:%M:%S")
simulation_timestamp=time.strftime("%Y-%m-%d %H:%M:%S"),
metrics=None
)
print(f"✗ 因子模拟失败: {expression}")
print(f" 耗时: {format_time(time_consuming)},错误: {simulation_result['message']}")
@@ -77,7 +75,8 @@ class AlphaSimulationManager:
alpha_id="/",
status="failed",
description=str(e),
simulation_timestamp=time.strftime("%Y-%m-%d %H:%M:%S")
simulation_timestamp=time.strftime("%Y-%m-%d %H:%M:%S"),
metrics=None
)
print(f"✗ 因子模拟异常: {expression}")
print(f" 耗时: {format_time(time_consuming)},异常: {str(e)}")
@@ -85,37 +84,45 @@ class AlphaSimulationManager:
return result
"""打印成功因子的关键指标"""
def _print_success_metrics(self, metrics):
def _print_success_metrics(self, metrics: Dict[str, Any]):
# 添加空值检查
if not metrics:
print(" 无指标数据")
return
print(" 关键指标 (训练集):")
# 从原始metrics数据中提取训练集指标
train_data = metrics.get('train', {}) or {}
key_metrics = [
('夏普比率', metrics.train_metrics.sharpe_ratio),
('年化收益', metrics.train_metrics.annual_return),
('最大回撤', metrics.train_metrics.max_drawdown),
('换手率', metrics.train_metrics.turnover),
('适应度', metrics.train_metrics.fitness),
('PNL', metrics.train_metrics.pnl),
('夏普比率', train_data.get('sharpe')),
('年化收益', train_data.get('returns')),
('最大回撤', train_data.get('drawdown')),
('换手率', train_data.get('turnover')),
('适应度', train_data.get('fitness')),
('PNL', train_data.get('pnl')),
]
for chinese_name, value in key_metrics:
if value is not None:
if isinstance(value, float):
value = f"{value:.4f}"
print(f" {chinese_name}: {value}")
# 显示样本外测试的夏普比率(如果存在)
if metrics.test_metrics.sharpe_ratio is not None:
print(f" 样本外夏普比率: {metrics.test_metrics.sharpe_ratio:.4f}")
print(f" {chinese_name}: {value}") # 衡量风险调整后的收益
# 年化收益率
# 显示样本外测试的夏普比率(如果存在) # 最大亏损幅度
test_data = metrics.get('test', {}) or {} # 交易频率
if test_data.get('sharpe') is not None: # 策略适应度得分
print(f" 样本外夏普比率: {test_data.get('sharpe'):.4f}") # 净盈亏
"""模拟一批Alpha因子(3个一组)"""
def simulate_alpha_batch(self, alpha_batch: List[str], batch_number: int) -> List[SimulationResult]:
print(f"\n{'=' * 60}")
print(f"开始第 {batch_number} 批因子模拟 (共 {len(alpha_batch)} 个因子)")
print(f"\n{'=' * 60}") # 只打印存在的指标
print(f"开始第 {batch_number} 批因子模拟 (共 {len(alpha_batch)} 个因子)") # 格式化浮点数显示
print(f"因子列表: {alpha_batch}")
print(f"{'=' * 60}")
batch_start_time = time.time()
batch_results = []
# 检查是否存在测试集夏普比率
# 创建API客户端实例(每个线程独立的客户端)
api = WorldQuantBrainSimulate(self.credentials_file)
@@ -200,12 +207,26 @@ class AlphaSimulationManager:
print(f"总耗时: {format_time(total_time)}")
print(f"{'=' * 60}")
success_expression_list = []
for i, result in enumerate(results, 1):
status_icon = "✓" if result.status == 'success' else "✗"
print(f"{i}. {status_icon} {result.expression}")
print(f" 状态: {result.status}")
print(f" 耗时: {result.formatted_time}")
print(f" Alpha ID: {result.alpha_id}")
if result.status == 'success':
success_expression_list.append(result.expression)
line_parts = [
f"{i}. {status_icon} {result.expression}",
f"状态: {result.status}",
f"耗时: {result.formatted_time}"
]
if result.alpha_id != '/':
line_parts.append(f"Alpha ID: {result.alpha_id}")
if result.status != 'success':
print(f" 原因: {result.description}")
print()
line_parts.append(f"原因: {result.description}")
print("\t".join(line_parts))
save_success_alpha(success_expression_list)