news 2026/6/21 19:28:10

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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解决实际问题,如果你觉得这个工具好用,欢迎关注长安牧笛!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/21 19:26:09

DDrawCompat完整指南:让Windows经典游戏在现代系统完美运行

DDrawCompat完整指南:让Windows经典游戏在现代系统完美运行 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirrors/dd/D…

作者头像 李华
网站建设 2026/6/21 19:23:23

AI赋能心理健康同伴支持:情感劳动分配与系统设计实践

1. 项目概述:当AI成为你的“树洞”伙伴最近几年,AI大模型的能力边界不断被拓宽,从写代码、画图,到处理复杂的客服对话,大家似乎都在寻找AI能替代人类工作的下一个场景。但“心理健康同伴支持”这个领域,听起…

作者头像 李华
网站建设 2026/6/21 19:09:01

Windows热键侦探:揭秘快捷键冲突的终极解决方案

Windows热键侦探:揭秘快捷键冲突的终极解决方案 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你是否曾为精心…

作者头像 李华
网站建设 2026/6/21 19:06:17

用Gradient+GitHub搭建AI文章审阅系统

1. 项目概述:用 Gradient 平台 GitHub 搭建一个真正能干活的 AI 文章审阅系统你有没有遇到过这样的场景:团队每周要读 20 篇技术论文,但没人愿意逐字精读;实习生交来的初稿逻辑混乱、术语滥用,可你又没时间一句句改&a…

作者头像 李华
网站建设 2026/6/21 19:04:59

MIGC:文生图多实例精准控制技术解析

1. 这不是“多开软件”,而是文本生成图像里的“交响乐指挥家”你有没有试过让AI画一幅“三只穿着西装的猫在会议室里开会,其中一只在白板前讲解PPT,窗外是黄昏的城市天际线”?输入一发,模型大概率给你三只猫挤成一团、…

作者头像 李华
网站建设 2026/6/21 18:54:24

UVa 555 Bridge Hands

题目描述 题目要求模拟发牌过程&#xff0c;并对每个玩家的手牌进行排序&#xff0c;按花色&#xff08;梅花 ♣\clubsuit♣、方块 ♢\diamondsuit♢、黑桃 ♠\spadesuit♠、红桃 ♡\heartsuit♡&#xff09;和点数&#xff08;2<3<⋯<T<J<Q<K<A2 < 3 …

作者头像 李华