#!/usr/bin/env python3 import sys import os sys.path.append(os.path.dirname(os.path.abspath(__file__))) import pandas as pd import numpy as np from datetime import datetime, timedelta # 测试策略函数 def test_triple_ma_strategy(data: pd.DataFrame, ma5=5, ma10=10, ma20=20, volume_threshold=1.2, **kwargs): """三均线策略测试""" print(f"测试参数: ma5={ma5}, ma10={ma10}, ma20={ma20}") print(f"数据形状: {data.shape}") print(f"数据列: {data.columns.tolist()}") signals = pd.DataFrame(index=data.index, columns=['signal', 'signal_strength']) signals['signal'] = 0 signals['signal_strength'] = 0.0 # 确保参数是整数 ma5, ma10, ma20 = int(ma5), int(ma10), int(ma20) print(f"转换后参数: ma5={ma5}, ma10={ma10}, ma20={ma20}") # 计算均线 ma_5 = data['close'].rolling(window=ma5).mean() ma_10 = data['close'].rolling(window=ma10).mean() ma_20 = data['close'].rolling(window=ma20).mean() print(f"MA5计算完成,长度: {len(ma_5)}") print(f"MA10计算完成,长度: {len(ma_10)}") print(f"MA20计算完成,长度: {len(ma_20)}") # 成交量均线 vol_ma = data['volume'].rolling(window=20).mean() signal_count = 0 for i in range(max(ma5, ma10, ma20), len(data)): # 多头排列且放量 if (ma_5.iloc[i] > ma_10.iloc[i] > ma_20.iloc[i] and data['volume'].iloc[i] > vol_ma.iloc[i] * volume_threshold): signals.iloc[i, signals.columns.get_loc('signal')] = 1 signals.iloc[i, signals.columns.get_loc('signal_strength')] = 0.8 signal_count += 1 # 空头排列 elif ma_5.iloc[i] < ma_10.iloc[i] < ma_20.iloc[i]: signals.iloc[i, signals.columns.get_loc('signal')] = -1 signals.iloc[i, signals.columns.get_loc('signal_strength')] = 0.8 signal_count += 1 print(f"生成信号数量: {signal_count}") print(f"信号统计:") print(signals['signal'].value_counts()) return signals if __name__ == "__main__": # 创建模拟数据 dates = pd.date_range(start='2024-01-01', end='2024-12-31', freq='D') np.random.seed(42) # 生成模拟股价数据 n_days = len(dates) base_price = 10.0 returns = np.random.normal(0.001, 0.02, n_days) # 0.1%日均收益,2%波动率 prices = [base_price] for ret in returns[1:]: prices.append(prices[-1] * (1 + ret)) data = pd.DataFrame({ 'date': dates, 'open': prices, 'high': [p * (1 + abs(np.random.normal(0, 0.01))) for p in prices], 'low': [p * (1 - abs(np.random.normal(0, 0.01))) for p in prices], 'close': prices, 'volume': np.random.uniform(1000000, 5000000, n_days), 'pct_chg': [0] + [((prices[i] - prices[i-1]) / prices[i-1] * 100) for i in range(1, len(prices))] }) data.set_index('date', inplace=True) print("开始测试策略函数...") print("=" * 50) # 测试策略 result = test_triple_ma_strategy(data, ma5=5, ma10=10, ma20=20, volume_threshold=1.2) print("=" * 50) print("测试完成")