MND-IA/test_vector_calculation.py
2025-12-31 19:58:09 +08:00

200 lines
6.0 KiB
Python

"""
测试向量点积计算逻辑
======================
验证 Strategist 推导的宏观因子向量与 PM 的敏感度矩阵计算是否正确
"""
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent))
from core.world_book import WorldBook
from skills.strategist import MacroStrategist
from skills.pm import PortfolioManager
def test_macro_vector_calculation():
"""测试宏观因子向量计算"""
print("=" * 60)
print("测试 1: 宏观因子向量推导")
print("=" * 60)
# 创建 WorldBook
wb = WorldBook(data_dir="data/test")
# 创建 Strategist
strategist = MacroStrategist(wb)
# 模拟新闻分析结果
narrative_json = {
"narratives": [
{
"topic": "央行宣布全面降息,支持数字经济发展",
"level_a_count": 1,
"level_b_count": 0,
"avg_score": 85,
"max_score": 90,
"related_etfs": ["515230"],
"lifecycle_stage": "fermentation"
},
{
"topic": "地缘紧张局势升级,避险情绪升温",
"level_a_count": 0,
"level_b_count": 1,
"avg_score": 70,
"max_score": 75,
"related_etfs": ["518880"],
"lifecycle_stage": "incubation"
}
]
}
# 推导宏观因子向量
print("\n输入新闻:")
for n in narrative_json['narratives']:
print(f" - {n['topic']} (Level A: {n['level_a_count']}, Level B: {n['level_b_count']})")
print("\n推导宏观因子向量:")
factor_vector = strategist.infer_macro_factor_vector(narrative_json)
print(f"\n结果: {factor_vector}")
return wb, factor_vector
def test_sensitivity_calculation(wb: WorldBook, factor_vector: dict):
"""测试敏感度矩阵计算"""
print("\n" + "=" * 60)
print("测试 2: 向量点积计算")
print("=" * 60)
# 创建 PM
pm = PortfolioManager(wb, total_capital=1000000)
# 测试案例 1: 软件ETF
print("\n案例 1: 软件与数字经济 (tech_software)")
print("-" * 60)
macro_score_software = pm.calculate_macro_sensitivity_score("tech_software")
print(f"最终得分: {macro_score_software}")
# 测试案例 2: 银行ETF
print("\n案例 2: 银行/高股息 (finance_bank)")
print("-" * 60)
macro_score_bank = pm.calculate_macro_sensitivity_score("finance_bank")
print(f"最终得分: {macro_score_bank}")
# 测试案例 3: 黄金ETF
print("\n案例 3: 资源与黄金 (resources_gold)")
print("-" * 60)
macro_score_gold = pm.calculate_macro_sensitivity_score("resources_gold")
print(f"最终得分: {macro_score_gold}")
# 对比分析
print("\n" + "=" * 60)
print("对比分析")
print("=" * 60)
print(f"软件ETF得分: {macro_score_software}")
print(f"银行ETF得分: {macro_score_bank}")
print(f"黄金ETF得分: {macro_score_gold}")
print("\n结论:")
if macro_score_software > macro_score_bank:
print("✓ 软件ETF > 银行ETF (符合预期: 降息利好成长股,利空银行息差)")
if macro_score_gold > 0:
print("✓ 黄金ETF得分为正 (符合预期: 地缘紧张利好黄金避险)")
def test_trust_index_calculation(wb: WorldBook):
"""测试完整的 Trust Index 计算"""
print("\n" + "=" * 60)
print("测试 3: Trust Index 计算")
print("=" * 60)
pm = PortfolioManager(wb, total_capital=1000000)
# 模拟叙事评分和资金流评分
test_cases = [
{
"etf_code": "515230",
"asset_id": "tech_software",
"name": "软件ETF",
"narrative_score": 85,
"flow_score": 70
},
{
"etf_code": "512800",
"asset_id": "finance_bank",
"name": "银行ETF",
"narrative_score": 50,
"flow_score": 60
},
{
"etf_code": "518880",
"asset_id": "resources_gold",
"name": "黄金ETF",
"narrative_score": 70,
"flow_score": 55
}
]
print("\n计算各标的 Trust Index:")
results = []
for case in test_cases:
print(f"\n{case['name']} ({case['etf_code']}):")
print(f" 叙事评分: {case['narrative_score']}")
print(f" 资金流评分: {case['flow_score']}")
trust_result = pm.calculate_trust_index(
case['etf_code'],
case['asset_id'],
case['narrative_score'],
case['flow_score']
)
results.append({**case, **trust_result})
print(f" → Trust Index: {trust_result['trust_index']} ({trust_result['verdict']})")
# 排序
results.sort(key=lambda x: x['trust_index'], reverse=True)
print("\n" + "=" * 60)
print("最终排名")
print("=" * 60)
for i, result in enumerate(results, 1):
print(f"{i}. {result['name']} - Trust Index: {result['trust_index']} "
f"(Macro: {result['macro_score']:.2f}, Narrative: {result['narrative_score']}, "
f"Flow: {result['flow_score']}) → {result['verdict']}")
def main():
"""主测试函数"""
print("\n" + "🧪 " * 30)
print("MND-IA 向量点积计算测试")
print("🧪 " * 30)
try:
# 测试 1: 宏观因子向量推导
wb, factor_vector = test_macro_vector_calculation()
# 测试 2: 敏感度矩阵点积计算
test_sensitivity_calculation(wb, factor_vector)
# 测试 3: 完整 Trust Index 计算
test_trust_index_calculation(wb)
print("\n" + "" * 30)
print("所有测试完成!")
print("" * 30)
except Exception as e:
print(f"\n❌ 测试失败: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
main()