当前位置: 首页 > news >正文

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

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

http://www.jsqmd.com/news/1056785/

相关文章:

  • Weighted NetKAT:基于半环的定量网络验证语言设计与实践
  • 2026年旋转小火锅设备深度测评:如何为你的门店匹配最佳方案? - 速递信息
  • PN533双卡模式实战:兼容ISO/IEC 18092与14443-4A协议详解
  • 装了几年微信第一次知道,原来还有个这么干净的版本
  • 2026年6月吸塑公司推荐,电子吸塑包装/玩具吸塑盒/化妆品吸塑包装/吸塑/吸塑托盘/食品吸塑盒,吸塑定制厂家口碑推荐 - 品牌推荐师
  • 本地服务业GEO获客完整指南:从AI搜索到到店转化 - 新闻快传
  • 001、Python 能做什么:从自动化脚本到 AI 应用的完整生态地图
  • MPC107嵌入式系统设计:内存控制器、PCI总线与PowerPC接口实战
  • GEO源头厂家主体爱搜索GEO:解密AI搜索优化,助力企业获取高价值流量 - 品牌报告
  • 2026南宁装修公司推荐:本地业主(客观真实) 体验与靠谱选择 - 新闻快传
  • 盱眙东湖东路五墩片区吃小龙虾哪家强?专业烧龙虾店实测 - 速递信息
  • Ubuntu LEMP部署实战:Nginx+PHP+MySQL全链路配置与排错
  • OmenSuperHub终极指南:完全掌控惠普游戏本性能的免费神器
  • 2026咸宁本地正规瓷砖空鼓维修服务商盘点|无损免拆砖修复,全域上门售后有保障 - 宅安选房屋修缮
  • 2026年6月实木套系家具厂家推荐,品质生活从这里开始,全屋定制家具/实木套系家具,实木套系家具实力工厂找哪家 - 品牌推荐师
  • 2026年合肥市初三中考达不到普高线还可以就读高中吗?——推荐合肥理工学校寿春实验班! - 教育为先
  • 2026年合肥市初三往届生可以报考哪所中专学校?——最新发布一览 - 教育为先
  • 写论文如何又快又好?导师力荐这几个AI写作辅助软件
  • 2026娄底本地正规瓷砖空鼓维修服务商盘点|无损免拆砖修复,全域上门售后有保障 - 宅安选房屋修缮
  • FitGirl游戏启动器:3分钟搞定压缩版游戏的高效管理方案
  • 终极Windows风扇控制指南:如何用FanControl实现静音与散热的完美平衡
  • 苏州靠谱猫舍推荐 想买猫狗闭眼去不踩坑 - 园友3800037
  • 2026汉中本地正规瓷砖空鼓维修服务商盘点|无损免拆砖修复,全域上门售后有保障 - 宅安选房屋修缮
  • 022、Slash Command 完全指南:model、clear、compact 等内置命令详解
  • 淮南师范学院是公办还是民办?属于本科几批招生? - 寻茫精选
  • 中国产业政策如何运行?LLM 解码 300 万份政府文件的发现
  • 2026用过的都推荐的适合头油头痒的洗发水,真的有效去屑洗发水 - 新闻快传
  • 最新2026金华知名财税代账公司排名:避开低价代账5个坑 - 新闻快传
  • 2026南宁装修公司实测:本土头部品牌的全流程体验复盘 - 新闻快传
  • Real-ESRGAN-GUI:免费AI图像增强工具,3分钟拯救模糊照片的完整指南