Python股票量化教程:手把手实现WR威廉指标

📅 2026/7/17 18:39:23
Python股票量化教程:手把手实现WR威廉指标
前言WRWilliams %R威廉指标是短线交易常用的超买超卖指标擅长捕捉股价短期高低拐点。WR和RSI原理相近但WR灵敏度更高经常提前发出反转信号适合震荡行情抄底、逃顶。很多同学自己写WR时容易踩坑分子分母写反、忘记乘以负号最终计算结果和通达信、东方财富不一致。本文严格遵循通达信原版公式使用Pandas原生实现不依赖TA-Lib附带绘图展示、自动交易信号识别全部代码可直接复制运行能够接入量化回测系统。⚠️ 重要声明本文仅作为Python量化编程学习不构成任何投资建议。一、WR指标原理与通达信计算公式指标简介WR威廉指标利用一段时间内最高价、最低价与当前收盘价的相对位置判断股价是否处于短期极端高位/低位。A股软件默认双周期参数WR110WR220通达信原版公式HH:HHV(HIGH,N); LL:LLV(LOW,N); WR:(HH-CLOSE)/(HH-LL)*100; WR指标 -WR数学公式W R − H H N − C l o s e H H N − L L N × 100 WR -\frac{HH_N - Close}{HH_N - LL_N} \times 100WR−HHN​−LLN​HHN​−Close​×100H H N HH_NHHN​N周期内最高价L L N LL_NLLN​N周期内最低价C l o s e CloseClose当日收盘价重点提醒最终结果需要取负数区间范围[-100, 0]WR指标基础交易规则超买区0 ~ -20股价短期上涨过多多头动能衰竭有回调风险止盈、减仓信号。超卖区-80 ~ -100短期持续下跌空头释放充分反弹概率加大关注低吸机会。中性区间-20 ~ -80多空相对均衡没有明确超买超卖信号观望为主。双周期共振WR1、WR2同时进入超卖区底部信号可靠性更高同时进入超买区回落风险加大。二、环境依赖pipinstallpandas numpy matplotlib三、Python实现WR指标计算3.1 封装通用WR计算函数importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltdefcalc_wr(df,high_colhigh,low_collow,close_colclose,n110,n220): 复刻通达信 WR威廉指标 :param df: K线DataFrame必须包含 high low close :param high_col: 最高价列名 :param low_col: 最低价列名 :param close_col: 收盘价列名 :param n1: WR1短期周期 默认10 :param n2: WR2长期周期 默认20 :return: 添加 WR1 WR2 后的DataFrame datadf.copy()# N周期最高价、最低价hh_n1data[high_col].rolling(windown1).max()ll_n1data[low_col].rolling(windown1).min()hh_n2data[high_col].rolling(windown2).max()ll_n2data[low_col].rolling(windown2).min()# 防止除零横盘最高价最低价# WR1denom1hh_n1-ll_n1 wr1_rawnp.where(denom10,0,(hh_n1-data[close_col])/denom1*100)data[WR1]-wr1_raw# WR2denom2hh_n2-ll_n2 wr2_rawnp.where(denom20,0,(hh_n2-data[close_col])/denom2*100)data[WR2]-wr2_rawreturndata3.2 模拟行情数据测试if__name____main__:np.random.seed(666)base_price12data_list[]foriinrange(180):changenp.random.normal(0,0.22)closeround(base_pricechange,2)highround(closeabs(np.random.normal(0,0.1)),2)lowround(close-abs(np.random.normal(0,0.1)),2)data_list.append({high:high,low:low,close:close})base_priceclose dfpd.DataFrame(data_list)df[date]pd.date_range(start2026-01-01,periods180,freqD)# 计算WRdfcalc_wr(df)print(df[[date,close,WR1,WR2]].tail(15))前N-1行数据会是NaN属于正常现象滚动窗口需要足够K线数量。四、WR指标可视化绘图上下双图上图股价下图WR曲线同时画出-20、-80两条分界线贴近行情软件样式defplot_wr_chart(df):plt.rcParams[font.sans-serif][SimHei]plt.rcParams[axes.unicode_minus]Falsefig,(ax1,ax2)plt.subplots(2,1,figsize(14,8),sharexTrue,gridspec_kw{height_ratios:[2,1]})# 上图收盘价走势ax1.plot(df[date],df[close],c#f5222d,linewidth1.6,label收盘价)ax1.set_title(股价走势 WR威廉指标,fontsize14)ax1.set_ylabel(价格)ax1.legend()ax1.grid(alpha0.3)# 下图 WR曲线ax2.plot(df[date],df[WR1],c#1890ff,linewidth1.3,labelWR1(10))ax2.plot(df[date],df[WR2],c#fa8c16,linewidth1.3,labelWR2(20))# 超买超卖分界线ax2.axhline(y-20,cred,linestyle--,alpha0.6)ax2.axhline(y-80,cgreen,linestyle--,alpha0.6)ax2.set_ylabel(WR)ax2.legend()ax2.grid(alpha0.3)plt.tight_layout()plt.show()plot_wr_chart(df)五、自动识别WR交易信号根据超买超卖区间生成信号方便策略回测defgenerate_wr_signal(df):datadf.copy()signal_list[]for_,rowindata.iterrows():wr1row[WR1]wr2row[WR2]ifpd.isna(wr1)orpd.isna(wr2):signal_list.append(None)continue# 双周期同时进入超卖区低吸信号ifwr1-80andwr2-80:signal_list.append(buy)# 双周期同时进入超买区卖出信号elifwr1-20andwr2-20:signal_list.append(sell)else:signal_list.append(None)data[wr_signal]signal_listreturndata dfgenerate_wr_signal(df)buy_signaldf[df[wr_signal]buy]sell_signaldf[df[wr_signal]sell]print(WR超卖低吸信号)print(buy_signal[[date,close,WR1,WR2]])print(\nWR超买卖出信号)print(sell_signal[[date,close,WR1,WR2]])六、开发高频踩坑总结1. 分子分母写反最常见错误错误写法(Close - LL)/(HH-LL)正确写法(HH - Close)/(HH-LL)顺序颠倒会直接导致指标走势完全反向。2. 忘记乘以负号部分国外资料WR范围是0~100而国内通达信统一[-100,0]计算完成后必须取负否则区间和信号全部相反。3. 缺少除零保护长期横盘个股周期内最高价等于最低价HH-LL0直接除法会触发inf无穷值代码中需要增加判断规避。4. WR不适合单边大趋势持续牛市WR会长时间处于超买区间持续熊市长期处于超卖区间。单纯依靠WR极易出现持续假信号建议搭配趋势指标MACD、均线组合使用。5. 忽略周期参数短线交易用10周期中长线可调整20、30周期参数越大指标越平滑、灵敏度越低。七、拓展方向接入Akshare / Tushare获取A股真实日线、分钟K数据增加WR背离检测顶背离、底背离WRMACD共振策略开发与历史回测封装为API接口供前端量化页面实时计算指标结合仓位管理规则构建完整交易策略。八、总结WR威廉指标核心是利用周期高低点相对位置判断超买超卖复刻通达信重点注意分子顺序 末尾取负数默认双周期WR1(10)、WR2(20)共振使用信号稳定性高于单周期WR优势是反应灵敏、提前捕捉拐点短板是单边行情容易持续失真量化开发优先手写指标摆脱第三方库黑盒便于自定义修改、问题排查与策略调试。