如何正确实现Hindenburg Omen(兴登堡凶兆)技术指标?
兴登堡凶兆(Hindenburg Omen)指标问题解答
理解偏差说明
你当前对该指标的理解和标准定义存在明显出入:
该指标的统计对象是指数的全部成分股,而非指数本身的价格走势:
- 标准定义要求:当日创52周新高的成分股数量、当日创52周新低的成分股数量,两者占成分股总数量的比例同时超过2.2%的阈值
- 你现在的逻辑是统计指数自身收盘价在过去252个交易日区间内的新高/新低出现次数的环比变化率,和标准定义完全不匹配。
正确实现方案
标准指标的实现逻辑如下:
- 先获取对应指数的全部成分股代码列表
- 拉取所有成分股的日线收盘价数据
- 对每个个股计算当日收盘价是否创下过去252个交易日的新高/新低
- 分别统计当日新高、新低的个股数量,除以成分股总数量得到两个占比
- 判断两个占比是否同时超过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
相关产品推荐
相关产品推荐

