基于 Python 的 4S 选股策略叠加估值过滤方案:高估值个股自动剔除
全文去营销化、保持技术中立,适合课程设计、量化策略实验或 GitHub 工程化项目。
4S 选股策略叠加估值过滤与高估值个股剔除方案(Python 实现)
一、实际应用场景描述
在智能证券投资课程与量化选股研究中,一个长期被验证的经验规律是:
好公司 ≠ 好股票,估值决定安全边际。
以 4S 选股模型 为例,其核心因子包括:
- Sales Growth(营收增长)
- ROE(净资产收益率)
- Size(市值)
- Momentum(动量)
在课程实验或原型开发中,常见问题是:
- 选出了基本面优秀的公司
- 但买入时点恰好处于估值泡沫阶段
- 导致策略回撤大、持有体验差
因此,一个工程化程度较高的选股系统,应当在 基本面筛选之后、组合构建之前,引入 估值过滤机制。
二、引入痛点
在传统课程实验或策略开发中,常见痛点包括:
1. 估值因素被忽视只关注成长与盈利,忽略估值约束。
2. 估值阈值主观化“PE 太高就不要”缺乏统一标准。
3. 剔除逻辑混乱哪些估值指标?如何剔除?何时生效?
4. 工程化程度低估值过滤与选股逻辑耦合严重,难以维护。
三、核心逻辑讲解
1️⃣ 估值过滤的基本思想
在 4S 基本面选股基础上,剔除估值过高个股,降低组合泡沫风险。
2️⃣ 常用估值指标(示例)
指标 说明
PE(市盈率) 盈利估值水平
PB(市净率) 资产估值水平
PS(市销率) 营收估值水平
本文以 PE 为主、PB 为辅 作为示例。
3️⃣ 估值剔除规则(示例)
个股被视为 高估值,满足任一条件即剔除:
is_overvalued =
PE > 50
OR PB > 5
4️⃣ 策略执行顺序
原始股票池
↓
4S 基本面打分
↓
估值过滤(剔除高估值)
↓
选取得分最高的股票
四、代码模块化实现(Python)
项目结构
4s_with_valuation_filter/
│
├── data/
│ └── stock_data.csv
│
├── src/
│ ├── data_loader.py
│ ├── factor_builder.py
│ ├── valuation_filter.py
│ └── selector.py
│
├── main.py
├── requirements.txt
└── README.md
1️⃣ 数据加载模块(
"data_loader.py")
import pandas as pd
def load_stock_data(path: str) -> pd.DataFrame:
"""
加载股票行情与基本面数据
"""
df = pd.read_csv(path, parse_dates=["date"])
df = df.sort_values(["date", "code"])
return df
2️⃣ 因子构建模块(
"factor_builder.py")
import pandas as pd
def build_4s_factors(df: pd.DataFrame) -> pd.DataFrame:
"""
构建 4S 因子
"""
df = df.copy()
df["sales_growth"] = df.groupby("code")["revenue"].pct_change(periods=4)
df["roe"] = df["roe"]
df["size"] = df["market_cap"]
df["momentum"] = df.groupby("code")["close"].pct_change(periods=20)
return df
3️⃣ 估值过滤模块(
"valuation_filter.py")
import pandas as pd
def apply_valuation_filter(
df: pd.DataFrame,
max_pe: float = 50,
max_pb: float = 5
) -> pd.DataFrame:
"""
剔除高估值个股
"""
df = df.copy()
df["is_overvalued"] = (
(df["pe"] > max_pe) |
(df["pb"] > max_pb)
)
filtered_df = df[df["is_overvalued"] == False].copy()
return filtered_df
4️⃣ 选股模块(
"selector.py")
import pandas as pd
def select_top_stocks(df: pd.DataFrame, top_n: int = 30) -> pd.DataFrame:
"""
基于 4S 因子选股
"""
# 因子排名
for factor in ["sales_growth", "roe", "size", "momentum"]:
df[f"{factor}_rank"] = df.groupby("date")[factor].rank(pct=True)
df["score"] = (
df["sales_growth_rank"] +
df["roe_rank"] +
df["size_rank"] +
df["momentum_rank"]
) / 4
latest_date = df["date"].max()
latest_df = df[df["date"] == latest_date]
return latest_df.nlargest(top_n, "score")
5️⃣ 主程序(
"main.py")
from src.data_loader import load_stock_data
from src.factor_builder import build_4s_factors
from src.valuation_filter import apply_valuation_filter
from src.selector import select_top_stocks
df = load_stock_data("data/stock_data.csv")
df = build_4s_factors(df)
# 估值过滤
filtered_df = apply_valuation_filter(df, max_pe=50, max_pb=5)
# 选股
top_stocks = select_top_stocks(filtered_df, top_n=30)
print(top_stocks[["code", "sales_growth", "roe", "pe", "pb", "score"]])
五、README 文件与使用说明
README.md
# 4S 选股策略叠加估值过滤工具
## 项目简介
本工具用于:
- 在 4S 基本面选股基础上
- 自动剔除高估值个股
- 输出估值合理的优质股票池
## 使用方法
1. 准备数据(stock_data.csv)
2. 安装依赖:
pip install -r requirements.txt
3. 运行主程序:
python main.py
## 数据字段要求
- date / code / revenue / roe / market_cap / close
- pe / pb
## 输出说明
- 最新一期 4S 综合得分排名前 N 的股票
- 已自动剔除 PE > 50 或 PB > 5 的个股
六、核心知识点卡片
1️⃣ 估值过滤的工程化意义
- 降低组合估值泡沫
- 提高策略安全边际
- 改善最大回撤表现
2️⃣ 估值指标的合理使用
- PE 适用于盈利稳定的公司
- PB 适用于重资产行业
- 单一指标 ≠ 万能标准
3️⃣ 策略执行顺序的重要性
- 先基本面,后估值
- 避免“估值陷阱”
- 保持因子逻辑清晰
七、免责声明与风险提示
免责声明
- 本内容仅供 学术研究与课程实验 使用
- 不构成任何投资建议
- 回测结果不代表未来表现
风险提示
- 估值阈值具有主观性
- 不同行业估值中枢差异巨大
- 过度剔除可能降低策略覆盖率
八、总结
本文介绍了一种 4S 选股策略叠加估值过滤 的 Python 工程化实现方案,具备以下特点:
- ✅ 基本面与估值解耦
- ✅ 剔除规则清晰、可配置
- ✅ 模块化设计,便于扩展
后续可扩展方向包括:
- 行业相对估值过滤
- 动态估值阈值
- 估值因子加权
本文代码仅供学习与技术交流,不构成任何投资建议,股市有风险,入市需谨慎!
利用AI解决实际问题,如果你觉得这个工具好用,欢迎关注长安牧笛!