Files
etf/strategies/screener/base.py
aszerW 988c2335fb chore(config): 添加环境变量示例及.gitignore更新
- 新增 .env.example,包含 Tushare API、钉钉机器人和PostgreSQL数据库配置模板
- 更新.gitignore,忽略本地配置文件如 .env.local 和 config_local.py
- 添加对报表文件命名规则的支持,保留示例文件不忽略
- 删除废弃的 chart.py 及相关图表模块代码
- 新增 config/settings.py,实现从环境变量读取配置的统一接口
- 设置数据目录及缓存目录,确保目录存在,提高配置管理规范性
2026-03-18 23:33:40 +08:00

69 lines
1.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
标的筛选器基类
用于基于技术指标筛选符合条件的标的
"""
from abc import ABC, abstractmethod
from typing import Any
import pandas as pd
class Screener(ABC):
"""筛选器抽象基类"""
def __init__(self, name: str, config: dict = None):
self.name = name
self.config = config or {}
@abstractmethod
def screen(self, data: Any) -> dict:
"""
执行筛选
Args:
data: 输入数据DataFrame或其他格式
Returns:
dict: 筛选结果,必须包含 'triggered' 键表示是否触发
"""
pass
@abstractmethod
def screen_batch(self, data_dict: dict) -> list:
"""
批量筛选多个标的
Args:
data_dict: {code: data} 格式的字典
Returns:
list: 符合条件的标的列表
"""
pass
class DataFrameScreener(Screener):
"""基于DataFrame的筛选器基类"""
def __init__(self, name: str, config: dict = None):
super().__init__(name, config)
def validate_data(self, df: pd.DataFrame) -> bool:
"""验证数据格式"""
required_cols = ["open", "high", "low", "close", "volume"]
return all(col in df.columns for col in required_cols)
def screen_batch(self, data_dict: dict) -> list:
"""批量筛选"""
results = []
for code, data in data_dict.items():
if isinstance(data, pd.DataFrame) and self.validate_data(data):
result = self.screen(data)
if result.get("triggered", False):
results.append({
"code": code,
**result
})
return results