You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确实现Hindenburg Omen(兴登堡凶兆)技术指标?

兴登堡凶兆(Hindenburg Omen)指标问题解答

理解偏差说明

你当前对该指标的理解和标准定义存在明显出入:
该指标的统计对象是指数的全部成分股,而非指数本身的价格走势:

  • 标准定义要求:当日创52周新高的成分股数量、当日创52周新低的成分股数量,两者占成分股总数量的比例同时超过2.2%的阈值
  • 你现在的逻辑是统计指数自身收盘价在过去252个交易日区间内的新高/新低出现次数的环比变化率,和标准定义完全不匹配。

正确实现方案

标准指标的实现逻辑如下:

  1. 先获取对应指数的全部成分股代码列表
  2. 拉取所有成分股的日线收盘价数据
  3. 对每个个股计算当日收盘价是否创下过去252个交易日的新高/新低
  4. 分别统计当日新高、新低的个股数量,除以成分股总数量得到两个占比
  5. 判断两个占比是否同时超过2.2%阈值

参考代码:

import pandas as pd
import numpy as np
import yfinance as yf

# 1. 获取对应指数的成分股代码列表,示例为标普500
sp500_tickers = [此处替换为实际成分股代码列表]
# 2. 拉取所有成分股的收盘价数据,拉取时间覆盖至少2年以保证滚动窗口计算正常
all_data = yf.download(sp500_tickers, period='3y')['Close']
# 3. 逐股判断是否创252交易日新高/新低
is_new_high = all_data == all_data.rolling(252).max()
is_new_low = all_data == all_data.rolling(252).min()
# 4. 计算每日新高、新低个股占比
daily_high_pct = is_new_high.sum(axis=1) / len(sp500_tickers) * 100
daily_low_pct = is_new_low.sum(axis=1) / len(sp500_tickers) * 100
# 5. 筛选符合兴登堡凶兆触发条件的日期
hindenburg_trigger_dates = (daily_high_pct >= 2.2) & (daily_low_pct >= 2.2)
print("触发兴登堡凶兆的日期列表:")
print(daily_high_pct[hindenburg_trigger_dates].index.tolist())

衍生版本优化

如果你不需要完全匹配标准定义,只是基于指数自身价格做衍生指标计算,你当前的代码可以优化掉多层apply嵌套,大幅提升运行效率:

import pandas as pd
import numpy as np
import yfinance as yf

df = yf.download('^GSPC', period='3y')
# 优化新高次数及变化率计算
df['new_high_flag'] = df['Close'] > df['Close'].shift(1)
df['Highs'] = df['new_high_flag'].rolling(252).sum().pct_change()
# 优化新低次数及变化率计算
df['new_low_flag'] = df['Close'] < df['Close'].shift(1)
df['Lows'] = df['new_low_flag'].rolling(252).sum().pct_change()

内容的提问来源于stack exchange,提问作者SkyWalker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 19:15:03