update
This commit is contained in:
@@ -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)
|
||||
Reference in New Issue
Block a user