test_strategy.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
测试策略实现类 - 用于开发和测试的简单策略
"""
import logging
import pandas as pd
from typing import Dict, Any
from src.strategies.base_strategy import BaseStrategy
# 配置日志
logger = logging.getLogger(__name__)
class TestStrategy(BaseStrategy):
"""测试策略实现 - 简单的均线交叉策略"""
def _get_description(self) -> str:
"""获取策略描述"""
return "测试策略:简单的均线交叉策略,用于开发和测试"
def _get_default_params(self) -> Dict[str, Any]:
"""获取策略默认参数"""
return {
"short_ma_period": 5,
"long_ma_period": 20,
"min_price": 10,
"max_price": 100,
"min_volume": 1000000,
"min_turnover": 10000000
}
def check_stock(self, ts_code: str, df_stock: pd.DataFrame) -> bool:
"""
检查单只股票是否符合测试策略条件
参数:
ts_code: 股票代码
df_stock: 股票历史数据
返回:
bool: 是否符合条件
"""
try:
# 检查数据长度
if len(df_stock) < max(self.params['short_ma_period'], self.params['long_ma_period']):
return False
# 检查价格范围
latest_close = df_stock['close'].iloc[-1]
if latest_close < self.params['min_price'] or latest_close > self.params['max_price']:
return False
# 检查成交量
latest_volume = df_stock['vol'].iloc[-1]
if latest_volume < self.params['min_volume']:
return False
# 检查成交额
latest_turnover = df_stock['amount'].iloc[-1]
if latest_turnover < self.params['min_turnover']:
return False
# 计算均线
short_ma = df_stock['close'].rolling(window=self.params['short_ma_period']).mean()
long_ma = df_stock['close'].rolling(window=self.params['long_ma_period']).mean()
# 检查均线交叉
# 短期均线上穿长期均线
if short_ma.iloc[-1] > long_ma.iloc[-1] and short_ma.iloc[-2] <= long_ma.iloc[-2]:
logger.debug(f"股票 {ts_code} 符合测试策略条件(均线交叉)")
return True
logger.debug(f"股票 {ts_code} 不符合测试策略条件")
return False
except Exception as e:
logger.error(f"检查股票 {ts_code} 时出错: {e}")
return False