当前位置:首页>python>我用Python写了个选股器,3分钟筛出优质股(附代码)

我用Python写了个选股器,3分钟筛出优质股(附代码)

  • 2026-10-11 08:15:10
我用Python写了个选股器,3分钟筛出优质股(附代码)

我用Python写了个选股器,3分钟筛出优质股(附代码)

析言工作室 | 量化投资实践分享

一、散户选股的三大痛点

你是不是也有这样的经历:

📱 信息过载:每天刷到几十只"牛股"推荐,不知道该信谁

😰 情绪化交易:涨了不敢追,跌了不敢买,最后高位接盘

🎲 缺乏系统:选股全靠感觉,今天看K线,明天听消息

问题的本质:没有一套可执行、可验证、可持续的选股标准。

今天,我把自己打磨了数月的量化选股策略分享出来,希望能给你一些启发。

二、策略核心:三层评分体系

我们的选股器V1.0采用三层评分架构:

最终得分 = 新因子(60%) + 传统因子(25%) + 基本面(15%) × 风险加成系数

为什么是这套权重?

新因子(60%):经过IC/IR验证,短期预测能力更强

传统因子(25%):经典指标,稳定性好

基本面(15%):过滤"雷区",确保安全边际

三、五大核心因子详解

1️⃣ 趋势一致性因子 (Trend_Consistency)

原理:股价与成交量的趋势是否同向

通俗理解:好股票上涨时是"量价齐升",而不是"缩量上涨"(可能是诱多)

评分逻辑:

价格趋势与成交量趋势同向 → 高分

价格涨但成交量萎缩 → 扣分

2️⃣ RSI极端值因子 (RSI_Extreme)

原理:捕捉超卖反弹机会

通俗理解:就像弹簧,压得太狠总会反弹

评分逻辑:

RSI在30-45区间 → 最佳买入窗口

RSI < 20(极度超卖)→ 可能有基本面问题,反而扣分

3️⃣ 布林带下轨因子 (BB_Lower)

原理:股价触及布林带下轨时的反弹概率

通俗理解:股价跌到"安全线"附近,反弹概率增大

评分逻辑:

股价接近下轨但未破 → 高分

已经跌破下轨 → 可能有下跌惯性,扣分

4️⃣ 下跌抵抗因子 (Down_Resistance)

原理:下跌过程中是否出现抵抗信号

通俗理解:跌的时候有没有"人"在护盘

评分逻辑:

下跌但成交量萎缩 + 出现长下影线 → 有抵抗,加分

放量下跌 → 无抵抗,扣分

5️⃣ 波动率收缩因子 (Volatility_Contraction)

原理:波动率收缩往往预示着变盘

通俗理解:暴风雨前的宁静

评分逻辑:

近期波动率明显低于历史平均 → 加分

波动率异常放大 → 扣分

四、风险控制:软惩罚 vs 硬过滤

很多量化策略采用硬过滤:

市盈率太高?直接剔除

是ST股?直接剔除

近期有解禁?直接剔除

问题:容易误杀!有些高PE股票(如成长股)其实很有潜力。

我们的方案是软惩罚机制:

# 不是直接剔除,而是扣分
风险得分 = 基础分 - Σ(各项风险扣分)

# 例如:
- 高PE(>100):扣5分
- 近期有大额解禁:扣8分
- 高质押比例:扣6分
- 是ST股:扣20分(但不剔除)

好处:

✅ 不会错过"好但看起来有风险"的股票

✅ 综合评分后,风险高的自然排在后面

✅ 更加灵活,适应不同市场环境

五、基本面三层过滤

尽管有软惩罚,我们还是在入口加了硬性基本面过滤,排除明显的问题股:

指标
过滤条件
目的
市盈率(PE)
> 0 且 ≤ 200
排除亏损股和极度高估股
市净率(PB)
> 0.5
排除资产质量极差的公司
市值
≥ 20亿
排除流动性差的微盘股

实战效果:

在最近的选股中,这套过滤帮我们排除了三阳马这样的亏损股(PE为负),避免了踩雷。

六、今日选股实战

以下是今日选股器的TOP5结果(2026-05-07):

排名
股票名称
综合评分
推荐理由
🥇
雅戈尔
88.5
趋势一致性好,基本面稳健
🥈
星锐科技
85.2
RSI处于最佳区间,波动率收缩
🥉
大豪科技
82.1
布林带下轨反弹信号
4
恒银科技
79.8
下跌抵抗明显
5
国芳集团
77.3
量价配合良好

⚠️ 注意:以上仅为策略示例,不构成投资建议。股市有风险,入市需谨慎。

七、核心代码分享

以下是选股器的核心评分逻辑(Python):

def calculate_stock_score(df):
    """
    综合评分函数
    """
    # 新因子评分(60%权重)
    new_factor_score = (
        df['Trend_Consistency'] * 0.20 +
        df['RSI_Extreme'] * 0.15 +
        df['BB_Lower'] * 0.15 +
        df['Down_Resistance'] * 0.10
    ) * 0.60

    # 传统因子评分(25%权重)
    traditional_score = (
        df['RSI_Normalized'] * 0.10 +
        df['MACD_Signal'] * 0.10 +
        df['Volume_MA'] * 0.05
    ) * 0.25

    # 基本面评分(15%权重)
    fundamental_score = (
        df['PE_Score'] * 0.05 +
        df['PB_Score'] * 0.05 +
        df['MarketCap_Score'] * 0.05
    ) * 0.15

    # 风险惩罚
    risk_penalty = df['Risk_Penalty']
    risk_multiplier = max(0.5, 1 - risk_penalty / 100)

    # 最终得分
    final_score = (new_factor_score + traditional_score + fundamental_score) * risk_multiplier

    return final_score

完整代码获取方式:关注公众号「析言工作室」,回复关键词 "选股器",即可获取:

✅ stock_picker_v1.0.py - 选股器主程序

✅ _fetch_fundamental_v3.py - 基本面数据更新工具

✅ requirements.txt - 依赖配置文件

✅ README_使用说明.md - 详细使用文档

👇 详细使用教程见本文第八部分

八、下载与使用指南

📦 下载方式

关注公众号「析言工作室」回复关键词 "选股器",即可获取完整代码包

🚀 快速开始(3步上手)

第1步:安装Python环境

确保你的电脑已安装 Python 3.8 或更高版本。

检查方法:打开命令行,输入:

python --version

如果显示版本号(如 Python 3.9.7),说明已安装。如果未安装,请访问 python.org 下载安装。

第2步:安装依赖库

打开命令行(Windows按 Win+R,输入 cmd),进入下载包所在文件夹,运行:

pip install pandas numpy requests akshare

💡 提示:如果安装较慢,可以添加国内镜像源:
pip install pandas numpy requests akshare -i https://pypi.tuna.tsinghua.edu.cn/simple

第3步:运行选股器

在命令行中输入:

python stock_picker_v1.0.py

等待约1-3分钟,程序会自动:

1. 获取最新股票数据

2. 计算各项因子得分

3. 输出TOP20推荐股票列表

输出示例:

========================================
析言工作室 - 选股器 V1.0
========================================

📊 选股参数:
   价格范围: 2-100元
   持股周期: 1-15天
   风控模式: 软惩罚

📈 TOP 20 推荐标的:

排名  股票代码   股票名称    综合得分   推荐理由
----  --------  --------   --------  --------
 1    SH600177  雅戈尔      88.5     趋势一致性好,基本面稳健
 2    SZ002123  星锐科技    85.2     RSI处于最佳区间
 3    SZ002456  大豪科技    82.1     布林带下轨反弹信号
 ...

========================================

⚙️ 自定义配置

你可以根据自己的需求调整选股参数,编辑 stock_picker_v1.0.py 文件:

1. 调整价格范围

找到以下代码(约在第120行附近):

PRICE_MIN = 2      # 最低股价(元)
PRICE_MAX = 100    # 最高股价(元)

修改数字即可,例如只选10-50元的股票:

PRICE_MIN = 10
PRICE_MAX = 50

2. 调整持股周期

HOLDING_MIN = 1    # 最短持股天数
HOLDING_MAX = 15   # 最长持股天数

3. 调整因子权重

找到 calculate_score() 函数(约在第300行附近),修改权重:

# 新因子评分(60%权重)
new_factor_score = (
    df['Trend_Consistency'] * 0.20 +    # 趋势一致性
    df['RSI_Extreme'] * 0.15 +          # RSI极端值
    df['BB_Lower'] * 0.15 +             # 布林带
    df['Down_Resistance'] * 0.10        # 下跌抵抗
) * 0.60

⚠️ 注意:所有权重之和应等于1.0

4. 调整基本面过滤条件

# 基本面过滤
PE_MIN = 0          # 最小市盈率(排除亏损股)
PE_MAX = 200        # 最大市盈率(排除极度高估)
PB_MIN = 0.5        # 最小市净率
MARKET_CAP_MIN = 20 # 最小流通市值(亿元)

📊 更新基本面数据

选股器需要基本面数据(PE、PB、市值等)进行过滤。

首次使用或每周更新时,运行:

python _fetch_fundamental_v3.py

这个程序会:

1. 从腾讯财经API获取所有股票的估值数据

2. 保存到本地数据库 _xiyan_data.db

3. 供选股器调用

💡 建议:每周运行一次,保持数据新鲜度。

❓ 常见问题

Q1: 运行时报错 "No module named 'pandas'"

解决:依赖库未安装,运行:

pip install pandas numpy requests akshare

Q2: 选股结果为空

可能原因:

1. 基本面数据未更新 → 运行 _fetch_fundamental_v3.py

2. 过滤条件太严格 → 放宽 PE_MAX 或 MARKET_CAP_MIN

3. 数据库文件缺失 → 检查 _xiyan_data.db 是否存在

Q3: 如何保存选股结果

程序会自动保存为CSV文件,文件名格式:

选股结果_YYYYMMDD_HHMMSS.csv

Q4: 可以用于实盘交易吗

免责声明:本选股器仅供学习研究使用,不构成投资建议。股市有风险,投资需谨慎。

建议:

先用模拟盘测试策略有效性

结合自身判断,不要盲目跟单

设置止损线,控制单笔亏损

九、重要风险提示

1. 量化≠稳赚:任何策略都有失效的时候,过去的表现不代表未来

2. 定期回测:建议每月回顾策略有效性,及时调整参数

3. 分散投资:不要把所有资金押在一只或几只股票上

4. 止损纪律:设定好止损线,严格执行

十、写在最后

这套选股器是我从0到1摸索出来的,中间踩过很多坑:

一开始只有技术指标,选到了亏损股

后来加了硬过滤,又误杀了不少好股票

最终才确定这套"软惩罚+基本面过滤"的方案

投资是一场修行,量化只是工具,不是圣杯。

希望这套策略能给你一些启发。如果你也有好的想法,欢迎在评论区交流!

如果觉得有用,欢迎:👍 点赞支持  |  💬 留言交流  |  📤 转发分享  |  ⭐ 关注「析言工作室」

本文仅供学习交流,不构成投资建议。股市有风险,投资需谨慎。

析言工作室专注量化投资研究与实践,用数据和代码探索市场的规律

最新文章

随机文章