""" 框架核心测试 验证框架整体功能 """ import pandas as pd import numpy as np import pytest from framework.factors import FactorBase, FactorRegistry, FactorCombiner from framework.factors.momentum import MomentumFactor, TrendFactor, ReversalFactor, VolatilityFactor from framework.signals import TopNSelector, TrendFollower, ReversalTrader from framework.risk import StopLossControl, CallbackHook, Position, premium_filter_callback class TestFrameworkIntegration: """测试框架集成""" def test_rotation_strategy_workflow(self): """测试轮动策略完整流程""" # 清空注册表 FactorRegistry.clear() # 1. 注册因子 FactorRegistry.register(MomentumFactor) FactorRegistry.register(VolatilityFactor) # 2. 创建因子组合 factors = FactorCombiner([ FactorRegistry.get('momentum', n_days=25, crash_filter=True), ], weights=[1.0]) # 3. 生成测试数据(需要'close'列) dates = pd.date_range('2020-01-01', periods=100) data = pd.DataFrame({ 'close': np.random.randn(100).cumsum() + 100, 'code1': np.random.randn(100).cumsum() + 100, 'code2': np.random.randn(100).cumsum() + 100, 'code3': np.random.randn(100).cumsum() + 100, }, index=dates) # 4. 计算因子 factor_result = factors.compute(data) # 5. 生成信号 selector = TopNSelector(select_num=2) signals = selector.generate(factor_result) # 6. 验证结果 assert 'signal' in signals.columns assert len(signals) == len(data) def test_trend_strategy_workflow(self): """测试趋势策略完整流程""" FactorRegistry.clear() FactorRegistry.register(TrendFactor) factors = FactorCombiner([ FactorRegistry.get('trend', method='ma_cross', fast=5, slow=20), ]) dates = pd.date_range('2020-01-01', periods=100) data = pd.DataFrame({ 'close': np.random.randn(100).cumsum() + 100, }, index=dates) factor_result = factors.compute(data) follower = TrendFollower(entry_threshold=0.02) signals = follower.generate(factor_result) assert 'signal' in signals.columns def test_callbacks_workflow(self): """测试回调钩子完整流程""" hook = CallbackHook() # 注册回调 hook.register('before_entry', premium_filter_callback(0.10)) hook.register('dynamic_stoploss', lambda pos: -0.05) # 测试入场前回调 result = hook.trigger('before_entry', 'code1', 100.0, premium=0.05) assert result == True # 测试动态止损 position = Position( code='code1', entry_price=100.0, entry_date=pd.Timestamp('2020-01-01'), current_price=95.0, current_date=pd.Timestamp('2020-01-10'), quantity=100, weight=0.33 ) stoploss = hook.trigger('dynamic_stoploss', position) assert stoploss == -0.05 if __name__ == '__main__': pytest.main([__file__, '-v'])