forked from kyksj-1/StrategyRealizationHelp
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsimple_test.py
More file actions
188 lines (151 loc) · 6.49 KB
/
simple_test.py
File metadata and controls
188 lines (151 loc) · 6.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
"""
MA20趋势跟踪策略 - 简单功能测试
验证核心模块的基本功能
"""
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
def test_basic_functionality():
"""测试基本功能"""
print("开始MA20趋势跟踪策略基本功能测试...")
# 1. 测试数据处理器
print("\n1. 测试数据处理器...")
from data_processor import DataProcessor
# 创建测试数据
dates = pd.date_range('2023-01-01', periods=20, freq='D')
test_data = pd.DataFrame({
'date': dates,
'open': [100 + i*2 for i in range(20)],
'high': [102 + i*2 for i in range(20)],
'low': [98 + i*2 for i in range(20)],
'close': [101 + i*2 for i in range(20)],
'volume': [1000 + i*100 for i in range(20)]
})
processor = DataProcessor()
# 测试2日K线合成
data_2day = processor.create_2day_kline(test_data)
print(f"✓ 2日K线合成: {len(test_data)} -> {len(data_2day)} 条记录")
# 测试MA计算
data_with_ma = processor.calculate_ma(data_2day, period=5)
print(f"✓ MA5计算完成,数据列: {list(data_with_ma.columns)}")
# 2. 测试信号生成器
print("\n2. 测试信号生成器...")
from signal_generator import SignalGenerator
generator = SignalGenerator(ma_period=5)
signals_data = generator.generate_signals(data_with_ma)
buy_signals = (signals_data['signal'] == 1).sum()
sell_signals = (signals_data['signal'] == -1).sum()
print(f"✓ 信号生成: 做多{buy_signals}个, 做空{sell_signals}个")
# 3. 测试风险管理器
print("\n3. 测试风险管理器...")
from risk_manager import RiskManager, PositionSide
risk_manager = RiskManager()
# 测试做多止损
stop_result = risk_manager.calculate_stop_loss(
entry_price=4000.0,
prev_extreme=3800.0,
direction=PositionSide.LONG
)
print(f"✓ 做多止损: 进场价4000.0, 止损价{stop_result.stop_price:.2f}")
# 测试做空止损
stop_result = risk_manager.calculate_stop_loss(
entry_price=4000.0,
prev_extreme=4200.0,
direction=PositionSide.SHORT
)
print(f"✓ 做空止损: 进场价4000.0, 止损价{stop_result.stop_price:.2f}")
# 测试仓位计算
position_result = risk_manager.calculate_position_size(
capital=100000.0,
entry_price=4000.0,
stop_price=3800.0,
margin_rate=0.10,
contract_multiplier=10.0
)
print(f"✓ 仓位计算: 建议{position_result.position_size}手, 风险{position_result.risk_pct_of_capital:.2%}")
# 4. 测试配置
print("\n4. 测试配置...")
from config import get_config, validate_config
config = get_config()
print(f"✓ 配置加载: MA周期={config['ma_period']}, 止损容忍度={config['max_loss_pct']}")
is_valid = validate_config()
print(f"✓ 配置验证: {'通过' if is_valid else '失败'}")
print("\n✅ 基本功能测试完成!")
return True
def test_data_validation():
"""测试数据验证逻辑"""
print("\n测试数据验证逻辑...")
# 创建有问题的数据
test_data = pd.DataFrame({
'date': pd.date_range('2023-01-01', periods=5),
'open': [100, 102, 101, 103, 104],
'high': [99, 104, 103, 105, 106], # 第一行high < open
'low': [101, 101, 100, 102, 103], # 第一行low > open
'close': [101, 103, 102, 104, 105],
'volume': [1000] * 5
})
print("原始数据:")
print(test_data)
# 修复价格逻辑
for i in range(len(test_data)):
row = test_data.iloc[i]
test_data.loc[i, 'high'] = max(row['high'], row['open'], row['close'])
test_data.loc[i, 'low'] = min(row['low'], row['open'], row['close'])
print("\n修复后的数据:")
print(test_data)
# 验证价格逻辑
for i in range(len(test_data)):
row = test_data.iloc[i]
assert row['low'] <= row['open'], f"第{i}行: low <= open"
assert row['low'] <= row['close'], f"第{i}行: low <= close"
assert row['high'] >= row['open'], f"第{i}行: high >= open"
assert row['high'] >= row['close'], f"第{i}行: high >= close"
print("✓ 数据验证逻辑测试通过")
return True
def test_signal_logic():
"""测试信号生成逻辑"""
print("\n测试信号生成逻辑...")
# 创建测试数据
dates = pd.date_range('2023-01-01', periods=10, freq='2D')
test_data = pd.DataFrame({
'date': dates,
'open': [100, 102, 101, 103, 104, 105, 106, 107, 108, 109],
'high': [102, 104, 103, 105, 106, 107, 108, 109, 110, 111],
'low': [98, 101, 100, 102, 103, 104, 105, 106, 107, 108],
'close': [101, 103, 102, 104, 105, 106, 107, 108, 109, 110],
'volume': [1000] * 10
})
# 添加MA5
test_data['ma5'] = test_data['close'].rolling(window=5).mean()
# 测试信号生成
from signal_generator import SignalGenerator
generator = SignalGenerator(ma_period=5)
signals_data = generator.generate_signals(test_data)
# 验证信号逻辑
for i in range(len(signals_data)):
signal = signals_data.iloc[i]['signal']
if pd.notna(signal):
row = signals_data.iloc[i]
if signal == 1: # 做多信号
assert row['close'] > row['ma5'], f"做多信号时收盘价应高于MA5"
assert row['close'] > row['open'], f"做多信号时应收阳线"
print(f"✓ 做多信号验证: 日期{row['date']}, 收盘价{row['close']:.1f} > MA5{row['ma5']:.1f}")
elif signal == -1: # 做空信号
assert row['close'] < row['ma5'], f"做空信号时收盘价应低于MA5"
assert row['close'] < row['open'], f"做空信号时应收阴线"
print(f"✓ 做空信号验证: 日期{row['date']}, 收盘价{row['close']:.1f} < MA5{row['ma5']:.1f}")
print("✓ 信号生成逻辑测试通过")
return True
if __name__ == "__main__":
try:
# 运行基本功能测试
test_basic_functionality()
# 运行数据验证测试
test_data_validation()
# 运行信号逻辑测试
test_signal_logic()
print("\n🎉 所有测试通过! MA20趋势跟踪策略基本功能正常!")
except Exception as e:
print(f"\n❌ 测试失败: {e}")
import traceback
traceback.print_exc()