尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

4S策略牛熊市拆分回测,分别统计不同行情下策略盈利能力。

4S策略牛熊市拆分回测,分别统计不同行情下策略盈利能力。
📅 发布时间:2026/6/21 19:47:42

下面是一篇偏技术博客 + 项目说明风格的内容,围绕「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解决实际问题,如果你觉得这个工具好用,欢迎关注长安牧笛!

相关新闻

  • Weighted NetKAT:基于半环的定量网络验证语言设计与实践
  • 写论文如何又快又好?导师力荐这几个AI写作辅助软件
  • 2026南宁装修公司推荐:本地业主(客观真实) 体验与靠谱选择 - 新闻快传

最新新闻

  • 频域融合:RGB与事件相机协同的目标跟踪新框架
  • ZeroClaw:Windows本地AI指令网关实战指南
  • 3个技巧让WE Learn网课学习效率提升300%:开源助手的智能解法
  • 炉石传说脚本终极指南:5分钟快速上手的智能自动化对战工具
  • 武汉科谷技工学校2026年招生简章-城市轨道交通运输与管理专业怎么样?就业率/免学费/升学通道全解析 - 武汉中职最新信息发布
  • 钢结构稳定性分析的三种方法简介及区分

日新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号