新闻详情

新闻详情

首页 / 资讯中心 / 详情

RSI指标在风险控制中的实际应用

发布时间:2026/9/29 20:09:36来源:尧图网络
RSI指标在风险控制中的实际应用
RSI指标在风险控制中的实际应用RSIRelative Strength Index是最常用的动量指标之一。大多数人用它判断超买超卖但真正有价值的地方在于把RSI嵌入风控逻辑而不是当作入场信号。这篇文章讲清楚三件事RSI的计算原理、如何用它过滤开仓、如何用它做动态止损并给出可直接运行的Python代码。RSI的计算原理RSI由Wilder在1978年提出核心是衡量一段时间内上涨幅度与下跌幅度的相对强度。计算步骤计算每根K线的涨跌幅delta close.diff()分离上涨和下跌gain delta.clip(lower0)loss -delta.clip(upper0)用Wilder平滑类似EMA但平滑系数为1/n计算平均涨跌幅RS avg_gain / avg_lossRSI 100 - 100 / (1 RS)关键点在于平滑方式。很多人用简单移动平均SMA算RSI结果和主流行情软件对不上。Wilder用的是递归平滑第一值用SMA初始化之后递推。import pandas as pd import numpy as np def rsi_wilder(close: pd.Series, period: int 14) - pd.Series: 使用Wilder平滑计算RSI与TradingView/主流行情软件一致 delta close.diff() gain delta.clip(lower0) loss -delta.clip(upper0) # Wilder平滑alpha 1 / period avg_gain gain.ewm(alpha1/period, adjustFalse, min_periodsperiod).mean() avg_loss loss.ewm(alpha1/period, adjustFalse, min_periodsperiod).mean() rs avg_gain / avg_loss.replace(0, np.nan) rsi 100 - 100 / (1 rs) return rsi验证一下avg_loss为0时RSI应为100avg_gain为0时RSI应为0。上面用replace(0, np.nan)会让这两种情况变NaN需要补一下def rsi_wilder(close: pd.Series, period: int 14) - pd.Series: delta close.diff() gain delta.clip(lower0) loss -delta.clip(upper0) avg_gain gain.ewm(alpha1/period, adjustFalse, min_periodsperiod).mean() avg_loss loss.ewm(alpha1/period, adjustFalse, min_periodsperiod).mean() rs avg_gain / avg_loss rsi 100 - 100 / (1 rs) # 处理边界avg_loss0 - RSI100avg_gain0 - RSI0 rsi rsi.where(avg_loss ! 0, 100) rsi rsi.where(avg_gain ! 0, 0) return rsi超买超卖区域的判定陷阱教科书说RSI70超买30超卖。但在趋势行情里强趋势品种的RSI可以长期停留在70以上或30以下。把70/30当反转信号是新手亏钱最快的方式之一。更实用的做法是分层区间含义风控动作RSI 80极端超买禁止新开多考虑减仓70 RSI ≤ 80超买新开多需额外确认30 ≤ RSI 50中性偏弱正常20 ≤ RSI 30超卖新开空需额外确认RSI 20极端超卖禁止新开空考虑减仓注意这里的逻辑RSI不是用来预测反转的而是用来约束仓位方向的。当RSI进入极端区域说明当前方向的动能已经透支继续加仓的风险收益比很差。RSI作为开仓过滤条件假设你有一个趋势跟踪策略比如双均线在信号触发时用RSI做二次过滤做多信号要求RSI不在极端超买区RSI 80做空信号要求RSI不在极端超卖区RSI 20这样做的效果是避免在动能末端追单牺牲一部分趋势初期的利润换取更小的回撤。def generate_signals(df: pd.DataFrame, fast: int 10, slow: int 30, rsi_period: int 14, rsi_upper: float 80, rsi_lower: float 20) - pd.DataFrame: 双均线 RSI过滤的开仓信号 df 需要包含 close 列 df df.copy() df[ma_fast] df[close].rolling(fast).mean() df[ma_slow] df[close].rolling(slow).mean() df[rsi] rsi_wilder(df[close], rsi_period) # 基础趋势信号 long_signal (df[ma_fast] df[ma_slow]) (df[ma_fast].shift(1) df[ma_slow].shift(1)) short_signal (df[ma_fast] df[ma_slow]) (df[ma_fast].shift(1) df[ma_slow].shift(1)) # RSI过滤极端区域不开新仓 long_signal df[rsi] rsi_upper short_signal df[rsi] rsi_lower df[long_entry] long_signal df[short_entry] short_signal return df这里的关键不是RSI本身给出了信号而是它否决了一部分信号。在回测中被否决的信号往往是那些追高杀跌的坏交易。RSI作为动态止损参考固定百分比止损的问题在于它不考虑市场状态。同样是-3%在低波动时是趋势反转在高波动时只是噪音。RSI可以提供一个状态感知的止损触发条件当持仓方向与RSI极端值背离时提前离场。具体逻辑持有多头若RSI从超买区70快速跌破50视为动能衰竭减仓或平仓持有空头若RSI从超卖区30快速升破50视为空头动能衰竭减仓或平仓这里的快速可以用N根K线内的变化幅度定义def rsi_exit_signal(df: pd.DataFrame, rsi_col: str rsi, lookback: int 3, mid: float 50, extreme_high: float 70, extreme_low: float 30) - pd.DataFrame: 基于RSI的动能衰竭离场信号 - 多头离场过去lookback根内RSI曾extreme_high且当前跌破mid - 空头离场过去lookback根内RSI曾extreme_low且当前升破mid df df.copy() rsi df[rsi_col] recent_high rsi.rolling(lookback).max() recent_low rsi.rolling(lookback).min() df[exit_long] (recent_high extreme_high) (rsi mid) df[exit_short] (recent_low extreme_low) (rsi mid) return df把这个信号和固定止损结合取两者中先触发的那个。RSI负责捕捉动能反转固定止损负责兜底跳空/极端行情。完整回测框架下面是一个最小可用的回测把RSI过滤和RSI离场都串起来def backtest(df: pd.DataFrame, fast: int 10, slow: int 30, rsi_period: int 14, stop_loss_pct: float 0.03) - pd.DataFrame: df generate_signals(df, fast, slow, rsi_period) df rsi_exit_signal(df) position 0 # 1 多, -1 空, 0 空仓 entry_price 0.0 equity [1.0] trades [] for i in range(1, len(df)): row df.iloc[i] price row[close] ret 0.0 if position ! 0: ret position * (price / df.iloc[i-1][close] - 1) # 止损检查 if position 1 and price entry_price * (1 - stop_loss_pct): trades.append((stop_long, df.index[i], price)) position, entry_price 0, 0.0 elif position -1 and price entry_price * (1 stop_loss_pct): trades.append((stop_short, df.index[i], price)) position, entry_price 0, 0.0 # RSI离场 if position 1 and row[exit_long]: trades.append((rsi_exit_long, df.index[i], price)) position, entry_price 0, 0.0 elif position -1 and row[exit_short]: trades.append((rsi_exit_short, df.index[i], price)) position, entry_price 0, 0.0 # 开仓空仓时 if position 0: if row[long_entry]: position, entry_price 1, price trades.append((long, df.index[i], price)) elif row[short_entry]: position, entry_price -1, price trades.append((short, df.index[i], price)) equity.append(equity[-1] * (1 ret)) df[equity] equity[1:] return df, pd.DataFrame(trades, columns[action, time, price])跑完之后重点看三个指标最大回撤RSI过滤是否降低了回撤交易次数过滤掉多少笔信号是否牺牲了过多机会盈亏比RSI离场是否改善了平均盈亏比如果RSI过滤后交易次数减少超过50%但回撤只降低10%那这个过滤不值得。参数要按这个标准调。几个实践中的坑坑1把RSI当独立信号。RSI单独用胜率接近随机它的价值在于和其他逻辑组合。坑2参数过拟合。14是默认值但不同品种、不同周期的最优参数不同。不要为了回测好看去调RSI周期容易过拟合。坑3忽略背离。RSI背离价格新高但RSI不新高是有效的预警但背离的量化定义很主观容易过度拟合。建议只作为减仓参考不作为开仓依据。坑4周期选择。日线RSI适合中长线风控小时线适合日内。周期越短RSI噪音越大过滤效果越差。小结RSI在风控中的正确姿势是做减法用极端区域否决追单信号用动能衰竭提前离场和固定止损组合使用各管一段代码里的三个函数可以直接拿去改rsi_wilder、generate_signals、rsi_exit_signal。把数据换成你自己的先跑通再调参数。更多Python量化与自动化实战内容请关注本站。⭐ 今日观察列表以下标的来自多周期趋势扫描系统Gate.io合约仅供技术分析学习参考不构成任何投资建议。读者请自行判断。数据更新时间2026-09-28 09:01:28标的方向信号类型现价参考止盈参考止损盈亏比NOM 做空短平快做空$0.0023$0.0022$0.00231:1.2共 1 个标的。扫描频率每15分钟更新。以上数据由量化扫描系统自动生成如有兴趣了解更多技术细节请关注本站后续文章。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Claude Science 深度技术解析:AI科研工作台如何用协调代理与审核代理搭建全栈科研操作系统 2026/9/29 20:53:24

Claude Science 深度技术解析:AI科研工作台如何用协调代理与审核代理搭建全栈科研操作系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
[linux] .git/objects/pack 清理大文件:TaoToken 统一 Key 接入 AI 工具排查仓库膨胀 2026/9/29 20:53:23

[linux] .git/objects/pack 清理大文件:TaoToken 统一 Key 接入 AI 工具排查仓库膨胀

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
开启AI编程之门:用TaoToken统一Key接入VSCode与OpenCode 2026/9/29 20:53:17

开启AI编程之门:用TaoToken统一Key接入VSCode与OpenCode

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
AI日报内容策划与写作实战:从信息筛选到知识库沉淀 2026/9/29 20:53:10

AI日报内容策划与写作实战:从信息筛选到知识库沉淀

1. 当"日报"变成一种产品:AI日报的定位与内容框架"AI 日报"这四个字看起来简单,但真正做过内容运营的人都知道,日报类产品是最考验选题判断力和信息密度的。它不像深度长文可以慢慢铺陈,也不像快讯可以只给一…

阅读更多 →
嵌入式驱动开发:从“能跑”到“稳跑”的工程化实战指南 2026/9/29 20:53:10

嵌入式驱动开发:从“能跑”到“稳跑”的工程化实战指南

1. 开篇:为什么你写的驱动“能跑”,却“会崩”先聊一个很多嵌入式工程师不愿承认的事实:你的驱动代码,可能只是“看起来在工作”。中断能触发,寄存器能读写,Makefile能编译出内核模块,insmod不报…

阅读更多 →
CrewAI实战:从单Agent到多智能体自动化任务编排 2026/9/29 20:53:10

CrewAI实战:从单Agent到多智能体自动化任务编排

1. 理解CrewAI的设计哲学:从"单打独斗"到"团队协作" 先说个我的亲身体会。早期做自动化脚本,不管是用Requests还是Playwright,核心思路都是"一个程序干完所有事"——写一个Python脚本,按顺序调接口…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉