
下面是一篇偏技术博客 项目说明风格的内容围绕「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.md1️⃣ 市场状态划分market_state.pyimport pandas as pddef label_market_state(index_df: pd.DataFrame, ma_window: int 200) - pd.DataFrame:根据指数均线判断牛熊市df index_df.copy()df[ma200] df[close].rolling(windowma_window).mean()df[market_state] beardf.loc[df[close] df[ma200], market_state] bullreturn df[[date, market_state]]2️⃣ 策略模块strategy.pyimport pandas as pddef rank_4s_strategy(df: pd.DataFrame) - pd.DataFrame:基于 4S 因子打分选股简化版df df.copy()# 因子排名df[rank_sales] df.groupby(date)[sales_growth].rank(pctTrue)df[rank_roe] df.groupby(date)[roe].rank(pctTrue)df[rank_size] df.groupby(date)[size].rank(pctTrue)df[rank_momentum] df.groupby(date)[momentum].rank(pctTrue)# 综合得分df[score] (df[rank_sales] df[rank_roe] df[rank_size] df[rank_momentum]) / 4return df3️⃣ 回测模块backtest.pyimport pandas as pdimport numpy as npdef backtest_by_state(strategy_df: pd.DataFrame, state_df: pd.DataFrame) - dict:按牛熊市状态分别回测df strategy_df.merge(state_df, ondate, howleft)results {}for state, group in df.groupby(market_state):daily_return group.groupby(date)[return].mean()cumulative (1 daily_return).cumprod().iloc[-1] - 1sharpe 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 results4️⃣ 指标输出模块metrics.pyimport pandas as pddef format_results(results: dict) - pd.DataFrame:格式化输出牛熊市对比结果return pd.DataFrame(results).T5️⃣ 主程序main.pyfrom src.market_state import label_market_statefrom src.strategy import rank_4s_strategyfrom src.backtest import backtest_by_statefrom src.metrics import format_resultsimport 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.csv2. 安装依赖pip install -r requirements.txt3. 运行主程序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解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛