下面是一篇偏技术博客 + 项目说明风格的内容,围绕「4S 选股策略在牛熊市环境下的拆分回测」。
全文去营销化、保持中立,适合作为课程作业、技术博客或 GitHub 项目说明直接使用。
4S 选股策略牛熊市拆分回测与盈利能力分析(Python 实现)
一、实际应用场景描述
在智能证券投资课程与量化策略研究中,一个非常现实的问题是:
同一套选股策略,在牛市和熊市中的表现是否一致?
以经典的 4S 选股模型 为例,其核心因子通常包括:
- Sales Growth(营收增长)
- ROE(净资产收益率)
- Size(市值)
- Momentum(动量)
在实战中,这些因子在 不同市场环境下 的表现往往存在显著差异。例如:
- 牛市中动量因子可能贡献更大
- 熊市中盈利能力和低估值因子可能更稳健
因此,一个完整、严谨的策略评估流程,应该包括:
✅ 对历史行情进行 牛熊市划分
✅ 在不同行情中 分别回测同一策略
✅ 统计并对比 收益、风险、稳定性指标
二、引入痛点
在课程实验或策略研究过程中,常见的痛点包括:
1. 只做一次全样本回测
- 掩盖了策略在不同市场阶段的不稳定性。
2. 缺乏行情上下文
- 不知道策略是在“顺势”还是“逆势”中盈利。
3. 牛熊划分标准不统一
- 不同研究之间结果不可比。
4. 代码复用性差
- 行情划分、回测、统计逻辑耦合严重,难以扩展。
三、核心逻辑讲解
1️⃣ 牛熊市划分方法(基于宽基指数)
常见做法包括:
- 均线法(如 200 日均线)
- 高点回撤法(如最大回撤 > 20%)
- 趋势阶段标注法(本文采用)
本文采用 基于沪深 300 或中证 500 的趋势状态标注:
牛市:指数在 200 日均线之上
熊市:指数在 200 日均线之下
2️⃣ 回测流程设计
整体流程如下:
原始行情数据
↓
计算市场状态(牛 / 熊)
↓
按市场状态拆分样本
↓
分别执行 4S 策略回测
↓
统计收益、风险指标
↓
对比分析
3️⃣ 策略盈利能力对比维度
指标 说明
累计收益率 策略在牛 / 熊市中的绝对盈利能力
年化收益率 消除时间长度差异
夏普比率 风险调整后收益
最大回撤 极端风险暴露
胜率 单日正收益概率
四、代码模块化实现(Python)
项目结构
bull_bear_4s_backtest/
│
├── data/
│ ├── index_price.csv
│ └── stock_data.csv
│
├── src/
│ ├── market_state.py
│ ├── strategy.py
│ ├── backtest.py
│ └── metrics.py
│
├── main.py
├── requirements.txt
└── README.md
1️⃣ 市场状态划分(
"market_state.py")
import pandas as pd
def label_market_state(index_df: pd.DataFrame, ma_window: int = 200) -> pd.DataFrame:
"""
根据指数均线判断牛熊市
"""
df = index_df.copy()
df["ma200"] = df["close"].rolling(window=ma_window).mean()
df["market_state"] = "bear"
df.loc[df["close"] > df["ma200"], "market_state"] = "bull"
return df[["date", "market_state"]]
2️⃣ 策略模块(
"strategy.py")
import pandas as pd
def rank_4s_strategy(df: pd.DataFrame) -> pd.DataFrame:
"""
基于 4S 因子打分选股(简化版)
"""
df = df.copy()
# 因子排名
df["rank_sales"] = df.groupby("date")["sales_growth"].rank(pct=True)
df["rank_roe"] = df.groupby("date")["roe"].rank(pct=True)
df["rank_size"] = df.groupby("date")["size"].rank(pct=True)
df["rank_momentum"] = df.groupby("date")["momentum"].rank(pct=True)
# 综合得分
df["score"] = (
df["rank_sales"] +
df["rank_roe"] +
df["rank_size"] +
df["rank_momentum"]
) / 4
return df
3️⃣ 回测模块(
"backtest.py")
import pandas as pd
import numpy as np
def backtest_by_state(strategy_df: pd.DataFrame, state_df: pd.DataFrame) -> dict:
"""
按牛熊市状态分别回测
"""
df = strategy_df.merge(state_df, on="date", how="left")
results = {}
for state, group in df.groupby("market_state"):
daily_return = group.groupby("date")["return"].mean()
cumulative = (1 + daily_return).cumprod().iloc[-1] - 1
sharpe = daily_return.mean() / daily_return.std() * np.sqrt(252)
max_dd = (1 + daily_return).cummax().div(1 + daily_return).min()
win_rate = (daily_return > 0).mean()
results[state] = {
"cumulative_return": round(cumulative * 100, 2),
"annual_return": round(cumulative / (len(daily_return) / 252) * 100, 2),
"sharpe_ratio": round(sharpe, 2),
"max_drawdown": round(max_dd * 100, 2),
"win_rate": round(win_rate * 100, 2)
}
return results
4️⃣ 指标输出模块(
"metrics.py")
import pandas as pd
def format_results(results: dict) -> pd.DataFrame:
"""
格式化输出牛熊市对比结果
"""
return pd.DataFrame(results).T
5️⃣ 主程序(
"main.py")
from src.market_state import label_market_state
from src.strategy import rank_4s_strategy
from src.backtest import backtest_by_state
from src.metrics import format_results
import pandas as pd
# 加载数据
index_df = pd.read_csv("data/index_price.csv")
stock_df = pd.read_csv("data/stock_data.csv")
# 市场状态
state_df = label_market_state(index_df)
# 策略构建
strategy_df = rank_4s_strategy(stock_df)
# 回测
results = backtest_by_state(strategy_df, state_df)
# 输出
result_table = format_results(results)
print(result_table)
五、README 文件与使用说明
README.md
# 4S 选股策略牛熊市拆分回测工具
## 项目简介
本工具用于:
- 基于宽基指数划分牛熊市
- 在不同市场环境下分别回测 4S 选股策略
- 统计盈利能力与风险指标
## 使用方法
1. 准备数据(index_price.csv / stock_data.csv)
2. 安装依赖:
pip install -r requirements.txt
3. 运行主程序:
python main.py
## 数据字段要求
### index_price.csv
- date:日期
- close:指数收盘价
### stock_data.csv
- date / code / return
- sales_growth / roe / size / momentum
## 输出说明
- 牛市 / 熊市策略表现对比表
六、核心知识点卡片
1️⃣ 市场状态建模
- 均线法
- 回撤法
- 状态机思想
2️⃣ 策略稳健性评估
- 全样本回测 ≠ 策略可靠
- 分环境测试是基本要求
3️⃣ 风险调整后收益指标
- 夏普比率
- 最大回撤
- 胜率与盈亏比
七、免责声明与风险提示
免责声明
- 本内容仅供 学术研究与课程实验 使用
- 不构成任何投资建议
- 回测结果不代表未来表现
风险提示
- 历史行情划分存在主观性
- 简化回测忽略交易成本与滑点
- 因子定义在熊市中可能失效
八、总结
本文介绍了一种 将 4S 选股策略按牛熊市拆分回测 的 Python 实现方案,具备以下特点:
- ✅ 明确区分市场环境
- ✅ 同一策略、不同行情下的横向对比
- ✅ 模块化设计,便于扩展与复用
后续可扩展方向包括:
- 多参数敏感性分析
- 引入行业维度交叉分析
- 基于 Markov 状态切换的建模。
本文代码仅供学习与技术交流,不构成任何投资建议,股市有风险,入市需谨慎!
利用AI解决实际问题,如果你觉得这个工具好用,欢迎关注长安牧笛!