核心组件: - ConfigLoader: 配置加载器(YAML支持) - StrategyConfig: 策略配置数据类 - framework/__init__.py: 框架统一入口 导出接口: - FactorBase, FactorRegistry, FactorCombiner - SignalGenerator, TopNSelector, TrendFollower, ReversalTrader - StrategyBase, RotationStrategy - RiskControl, StopLossControl, PositionLimitControl - Executor, BacktestExecutor, DryRunExecutor - ConfigLoader 集成测试: - 轮动策略完整流程验证 - 趋势策略完整流程验证 - 回调钩子完整流程验证 总计:62个测试全部通过,框架核心实现完成
101 lines
3.2 KiB
Python
101 lines
3.2 KiB
Python
"""
|
|
框架核心测试
|
|
|
|
验证框架整体功能
|
|
"""
|
|
|
|
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']) |