Pharos
TAVolatility

TA.NATR() - 标准化平均真实波幅

标准化平均真实波幅 (Normalized Average True Range)

将 ATR 标准化为百分比形式,便于不同价格水平的资产比较。

返回波动率指标目录


语法

python
TA.NATR(high, low, close, timeperiod=14)

参数

参数名类型必选默认值说明
highany-最高价数组
lowany-最低价数组
closeany-收盘价数组
timeperiodany-时间周期,默认 14

返回值

返回 NATR 百分比值数组(0-100),表示 ATR 占价格的百分比。

计算方法

plaintext
ATR = Average True Range(high, low, close, timeperiod)
NATR = (ATR / Close) × 100

NATR 将 ATR 转换为占当前价格的百分比,消除价格水平的影响。

信号解读

波动性分类

  • NATR < 1%:极低波动,市场非常平静
  • 1% < NATR < 2%:低波动,相对稳定
  • 2% < NATR < 4%:正常波动
  • 4% < NATR < 6%:高波动,市场活跃
  • NATR > 6%:极高波动,风险很大

应用场景

  1. 跨资产比较:比较不同价格资产的波动性
  2. 资产筛选:根据波动性选择交易标的
  3. 风险评估:量化市场风险水平
  4. 策略适配:根据波动性选择交易策略

基础示例

波动性判断

python
def main():
    while True:
        records = exchange.GetRecords()
        if len(records) < 30:
            Sleep(1000)
            continue
        
        highs = [r['High'] for r in records]
        lows = [r['Low'] for r in records]
        closes = [r['Close'] for r in records]
        
        natr = TA.NATR(highs, lows, closes, 14)
        current_natr = natr[-1]
        
        Log("标准化 ATR:", current_natr, "%")
        
        # 波动性分类
        if current_natr < 1:
            Log("💤 极低波动性资产,可能缺乏交易机会")
        elif current_natr < 2:
            Log("📉 低波动性资产,适合稳健交易")
        elif current_natr < 4:
            Log("📊 正常波动性资产")
        elif current_natr < 6:
            Log("📈 高波动性资产,适合短线交易")
        else:
            Log("⚠️ 极高波动性资产,风险很大")
        
        Sleep(60000)

高级应用

跨资产波动性比较

python
def compare_volatility():
    """比较多个交易对的波动性"""
    symbols = ["BTC_USDT", "ETH_USDT", "LTC_USDT"]
    volatilities = {}
    
    for symbol in symbols:
        # 切换交易对
        # exchange.SetSymbol(symbol)
        records = exchange.GetRecords()
        
        if len(records) < 30:
            continue
        
        highs = [r['High'] for r in records]
        lows = [r['Low'] for r in records]
        closes = [r['Close'] for r in records]
        
        natr = TA.NATR(highs, lows, closes, 14)
        volatilities[symbol] = natr[-1]
    
    # 排序显示
    sorted_vol = sorted(volatilities.items(), key=lambda x: x[1], reverse=True)
    
    Log("=== 波动性排名 ===")
    for symbol, vol in sorted_vol:
        Log(f"{symbol}: {vol:.2f}%")
    
    # 选择合适的交易标的
    high_vol = [s for s, v in sorted_vol if v > 4]
    low_vol = [s for s, v in sorted_vol if v < 2]
    
    Log("高波动品种(适合短线):", high_vol)
    Log("低波动品种(适合稳健):", low_vol)

NATR 动态策略选择

python
def main():
    while True:
        records = exchange.GetRecords()
        if len(records) < 50:
            Sleep(1000)
            continue
        
        highs = [r['High'] for r in records]
        lows = [r['Low'] for r in records]
        closes = [r['Close'] for r in records]
        
        natr = TA.NATR(highs, lows, closes, 14)
        current_natr = natr[-1]
        
        # 根据 NATR 选择策略
        if current_natr < 2:
            # 低波动:趋势跟踪策略
            Log("低波动环境,使用趋势跟踪策略")
            strategy = "trend_following"
            stop_multiplier = 3  # 较大止损
            
        elif current_natr < 4:
            # 正常波动:平衡策略
            Log("正常波动环境,使用平衡策略")
            strategy = "balanced"
            stop_multiplier = 2
            
        else:
            # 高波动:均值回归策略
            Log("高波动环境,使用均值回归策略")
            strategy = "mean_reversion"
            stop_multiplier = 1.5  # 较小止损
        
        Log(f"当前策略: {strategy}, 止损倍数: {stop_multiplier}")
        
        Sleep(60000)

NATR 波动性突破预警

python
def main():
    while True:
        records = exchange.GetRecords()
        if len(records) < 100:
            Sleep(1000)
            continue
        
        highs = [r['High'] for r in records]
        lows = [r['Low'] for r in records]
        closes = [r['Close'] for r in records]
        
        natr = TA.NATR(highs, lows, closes, 14)
        current_natr = natr[-1]
        
        # 计算 NATR 的统计特征
        natr_20 = natr[-20:]
        natr_avg = sum(natr_20) / len(natr_20)
        natr_std = (sum([(x - natr_avg)**2 for x in natr_20]) / len(natr_20)) ** 0.5
        
        # 检测波动性异常
        z_score = (current_natr - natr_avg) / natr_std if natr_std != 0 else 0
        
        if z_score > 2:
            Log("⚠️ 波动性异常增加,NATR Z-score:", z_score)
            Log("可能有重要事件发生")
        elif z_score < -2:
            Log("💤 波动性异常降低,NATR Z-score:", z_score)
            Log("市场可能进入整理期")
        
        # 波动性扩张
        if current_natr > natr_avg * 1.5:
            Log("📈 波动性快速扩张,注意风险")
        elif current_natr < natr_avg * 0.6:
            Log("📉 波动性快速收缩,可能酝酿突破")
        
        Sleep(60000)

参数优化建议

周期推荐值适用场景
短期7-10日内交易、快速反应
中期14标准设置、波段交易
长期20-30长线投资、资产配置

与其他指标配合

NATR + 趋势指标

python
natr = TA.NATR(highs, lows, closes, 14)
sma20 = TA.SMA(closes, 20)
sma50 = TA.SMA(closes, 50)

# 低波动 + 趋势明确
if natr[-1] < 2 and sma20[-1] > sma50[-1]:
    Log("低波动上升趋势,稳健做多机会")

NATR + 动量指标

python
natr = TA.NATR(highs, lows, closes, 14)
rsi = TA.RSI(closes, 14)

# 高波动 + 超卖
if natr[-1] > 5 and rsi[-1] < 30:
    Log("高波动超卖,可能剧烈反弹")

NATR + 成交量

python
natr = TA.NATR(highs, lows, closes, 14)
volumes = [r['Volume'] for r in records]
vol_avg = sum(volumes[-20:]) / 20

# 低波动 + 成交量萎缩
if natr[-1] < 1.5 and volumes[-1] < vol_avg * 0.5:
    Log("波动性和成交量双低,市场极度平静")

注意事项

  1. 百分比形式:NATR 是百分比,可跨资产比较
  2. 价格无关:消除价格水平影响,更客观
  3. 市场环境:不同市场(股票、期货、加密货币)NATR 范围不同
  4. 极端值:暴涨暴跌会导致 NATR 极端值
  5. 策略匹配:根据 NATR 选择合适的交易策略
  6. 风险管理:高 NATR 时应降低杠杆和仓位
  7. 时间周期:不同时间周期 NATR 差异很大

NATR vs ATR 对比

特性NATRATR
单位百分比 (%)价格单位
跨资产比较✅ 可以❌ 不可以
绝对值意义✅ 有❌ 无
适用场景资产筛选、风险评估止损设置、仓位管理
计算复杂度稍高较低

实战要点

NATR 应用场景

资产筛选:选择合适波动性的交易品种 ✅ 风险评估:量化市场风险水平 ✅ 策略选择:根据波动性匹配策略 ✅ 跨市场比较:比较不同市场的活跃度

波动性分级策略

  • NATR < 1%:避免交易,等待机会
  • 1-2%:适合长线持仓、网格策略
  • 2-4%:适合波段交易、趋势跟踪
  • 4-6%:适合短线交易、高频策略
  • > 6%:降低仓位,谨慎交易

风险控制

  • 高 NATR (>5%) 时减小仓位 50%
  • 极低 NATR (<1%) 时避免交易
  • NATR 突然暴涨时止盈离场
  • 根据 NATR 调整杠杆倍数

相关指标


返回波动率指标目录 | 返回 TA 指标总目录