增加选股策略
This commit is contained in:
@@ -0,0 +1,130 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
净利增长选股模块
|
||||
使用pywencai进行股票筛选
|
||||
"""
|
||||
|
||||
import logging
|
||||
from typing import Tuple, Optional
|
||||
import pandas as pd
|
||||
|
||||
|
||||
class ProfitGrowthSelector:
|
||||
"""净利增长选股器"""
|
||||
|
||||
def __init__(self):
|
||||
self.logger = logging.getLogger(__name__)
|
||||
|
||||
def get_profit_growth_stocks(self, top_n: int = 5) -> Tuple[bool, Optional[pd.DataFrame], str]:
|
||||
"""
|
||||
获取符合净利增长策略的股票
|
||||
|
||||
筛选条件:
|
||||
- 净利润增长率 ≥ 10%(净利润同比增长率)
|
||||
- 深圳A股
|
||||
- 非科创板
|
||||
- 非创业板
|
||||
- 非ST
|
||||
- 按成交额由小到大排名
|
||||
|
||||
Args:
|
||||
top_n: 返回前N只股票
|
||||
|
||||
Returns:
|
||||
(是否成功, 数据DataFrame, 消息)
|
||||
"""
|
||||
try:
|
||||
import pywencai
|
||||
|
||||
# 构建查询语句(按成交额由小至大排名)
|
||||
query = (
|
||||
"净利润增长率(净利润同比增长率)≥10%,"
|
||||
"非科创板,"
|
||||
"非创业板,"
|
||||
"非ST,"
|
||||
"深圳A股,"
|
||||
"成交额由小至大排名"
|
||||
)
|
||||
|
||||
self.logger.info(f"开始执行净利增长选股,查询条件: {query}")
|
||||
|
||||
# 调用pywencai
|
||||
result = pywencai.get(query=query, loop=True)
|
||||
|
||||
if result is None or result.empty:
|
||||
self.logger.warning("未获取到符合条件的股票")
|
||||
return False, None, "未找到符合条件的股票"
|
||||
|
||||
self.logger.info(f"获取到 {len(result)} 只股票")
|
||||
|
||||
# 取前N只
|
||||
if len(result) > top_n:
|
||||
result = result.head(top_n)
|
||||
self.logger.info(f"筛选前 {top_n} 只股票")
|
||||
|
||||
return True, result, f"成功获取 {len(result)} 只股票"
|
||||
|
||||
except ImportError:
|
||||
error_msg = "pywencai模块未安装,请执行: pip install pywencai"
|
||||
self.logger.error(error_msg)
|
||||
return False, None, error_msg
|
||||
|
||||
except Exception as e:
|
||||
error_msg = f"选股失败: {str(e)}"
|
||||
self.logger.error(error_msg)
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return False, None, error_msg
|
||||
|
||||
def format_stock_info(self, df: pd.DataFrame) -> str:
|
||||
"""
|
||||
格式化股票信息为文本
|
||||
|
||||
Args:
|
||||
df: 股票数据DataFrame
|
||||
|
||||
Returns:
|
||||
格式化后的文本
|
||||
"""
|
||||
if df is None or df.empty:
|
||||
return "无数据"
|
||||
|
||||
lines = []
|
||||
for idx, row in df.iterrows():
|
||||
stock_code = row.get('股票代码', 'N/A')
|
||||
stock_name = row.get('股票简称', 'N/A')
|
||||
profit_growth = row.get('净利润增长率', row.get('净利润同比增长率', 'N/A'))
|
||||
turnover = row.get('成交额', row.get('成交额[20241213]', 'N/A'))
|
||||
|
||||
line = f"{idx+1}. {stock_code} {stock_name}"
|
||||
|
||||
# 添加详细信息
|
||||
details = []
|
||||
|
||||
if profit_growth != 'N/A':
|
||||
try:
|
||||
details.append(f"净利增长:{float(profit_growth):.2f}%")
|
||||
except:
|
||||
pass
|
||||
|
||||
if turnover != 'N/A':
|
||||
try:
|
||||
turnover_val = float(turnover)
|
||||
if turnover_val >= 100000000:
|
||||
details.append(f"成交额:{turnover_val/100000000:.2f}亿")
|
||||
else:
|
||||
details.append(f"成交额:{turnover_val/10000:.2f}万")
|
||||
except:
|
||||
pass
|
||||
|
||||
if details:
|
||||
line += f" - {', '.join(details)}"
|
||||
|
||||
lines.append(line)
|
||||
|
||||
return '\n'.join(lines)
|
||||
|
||||
|
||||
# 全局实例
|
||||
profit_growth_selector = ProfitGrowthSelector()
|
||||
Reference in New Issue
Block a user