TAVolatility
TA.NATR() - 标准化平均真实波幅
标准化平均真实波幅 (Normalized Average True Range)
将 ATR 标准化为百分比形式,便于不同价格水平的资产比较。
语法
python
TA.NATR(high, low, close, timeperiod=14)参数
| 参数名 | 类型 | 必选 | 默认值 | 说明 |
|---|---|---|---|---|
| high | any | 否 | - | 最高价数组 |
| low | any | 否 | - | 最低价数组 |
| close | any | 否 | - | 收盘价数组 |
| timeperiod | any | 否 | - | 时间周期,默认 14 |
返回值
返回 NATR 百分比值数组(0-100),表示 ATR 占价格的百分比。
计算方法
plaintext
ATR = Average True Range(high, low, close, timeperiod)
NATR = (ATR / Close) × 100NATR 将 ATR 转换为占当前价格的百分比,消除价格水平的影响。
信号解读
波动性分类
- NATR < 1%:极低波动,市场非常平静
- 1% < NATR < 2%:低波动,相对稳定
- 2% < NATR < 4%:正常波动
- 4% < NATR < 6%:高波动,市场活跃
- NATR > 6%:极高波动,风险很大
应用场景
- 跨资产比较:比较不同价格资产的波动性
- 资产筛选:根据波动性选择交易标的
- 风险评估:量化市场风险水平
- 策略适配:根据波动性选择交易策略
基础示例
波动性判断
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("波动性和成交量双低,市场极度平静")注意事项
- 百分比形式:NATR 是百分比,可跨资产比较
- 价格无关:消除价格水平影响,更客观
- 市场环境:不同市场(股票、期货、加密货币)NATR 范围不同
- 极端值:暴涨暴跌会导致 NATR 极端值
- 策略匹配:根据 NATR 选择合适的交易策略
- 风险管理:高 NATR 时应降低杠杆和仓位
- 时间周期:不同时间周期 NATR 差异很大
NATR vs ATR 对比
| 特性 | NATR | ATR |
|---|---|---|
| 单位 | 百分比 (%) | 价格单位 |
| 跨资产比较 | ✅ 可以 | ❌ 不可以 |
| 绝对值意义 | ✅ 有 | ❌ 无 |
| 适用场景 | 资产筛选、风险评估 | 止损设置、仓位管理 |
| 计算复杂度 | 稍高 | 较低 |
实战要点
NATR 应用场景
✅ 资产筛选:选择合适波动性的交易品种 ✅ 风险评估:量化市场风险水平 ✅ 策略选择:根据波动性匹配策略 ✅ 跨市场比较:比较不同市场的活跃度
波动性分级策略
- NATR < 1%:避免交易,等待机会
- 1-2%:适合长线持仓、网格策略
- 2-4%:适合波段交易、趋势跟踪
- 4-6%:适合短线交易、高频策略
- > 6%:降低仓位,谨慎交易
风险控制
- 高 NATR (>5%) 时减小仓位 50%
- 极低 NATR (<1%) 时避免交易
- NATR 突然暴涨时止盈离场
- 根据 NATR 调整杠杆倍数
相关指标
- ATR - 平均真实波幅 - NATR 的原始形式
- TRANGE - 真实波幅 - 单周期波动
- BBANDS - 布林带 - 另一种波动性指标