Overlap:MIDPRICE(中位价格)技术指标详解
一、MIDPRICE的定义
MIDPRICE(Midpoint Price,中位价格指标) 是一种基础的趋势跟踪指标,其核心逻辑是追踪指定周期内的"价格中心"。它通过计算过去N个周期内最高价的最高值与最低价的最低值的平均值来获得。
MIDPRICE被广泛应用于一些更复杂的指标中,例如构成一目均衡表(Ichimoku Cloud) 的转换线(Tenkan-sen)和基准线(Kijun-sen)等核心组件。
MIDPRICE与MIDPOINT的区别
| 特性 | MIDPRICE(中位价格) | MIDPOINT(中值通道线) |
|---|---|---|
| 输入数据 | 最高价(High)和最低价(Low) | 收盘价(Close) |
| 核心公式 | (滚动窗口内最高价的最大值 + 滚动窗口内最低价的最小值) / 2 | (滚动窗口内收盘价最大值 + 收盘价最小值) / 2 |
| 价格维度 | 同时考虑日内高低点,反映价格区间中心 | 仅基于收盘价 |
二、MIDPRICE的计算方法
1. 核心计算公式
对于长度为 nnn 的滚动窗口,MIDPRICE 的计算公式为:
MIDPRICE=Highest High+Lowest Low2 \mathrm{MIDPRICE} = \frac{\text{Highest High} + \text{Lowest Low}}{2} MIDPRICE=2Highest High+Lowest Low
其中:
- Highest High :过去 nnn 个周期内的最高价的最大值
- Lowest Low :过去 nnn 个周期内的最低价的最小值
2. 详细计算步骤
第一步:确定滚动窗口 。设定计算周期 nnn(如 n=14n=14n=14),对每个时间点,取过去 nnn 个周期的价格数据。
第二步:查找区间极值。在当前窗口中查找:
- KaTeX parse error: Got function '\max' with no arguments as subscript at position 3: H_\̲m̲a̲x̲ ̲= \max(\mathrm...
- KaTeX parse error: Got function '\min' with no arguments as subscript at position 3: L_\̲m̲i̲n̲ ̲= \min(\mathrm...
第三步:计算中位价格 :
KaTeX parse error: Got function '\max' with no arguments as subscript at position 32: ...E}t = \frac{H\̲m̲a̲x̲ ̲+ L_\min}{2}
3. 参数说明
| 参数 | 默认值 | 说明 |
|---|---|---|
length |
10或14 | 计算窗口周期,决定灵敏度 |
offset |
0 | 结果偏移周期数 |
三、MIDPRICE的使用方法
1. 趋势方向判断
MIDPRICE的斜率可辅助判断趋势方向:
| MIDPRICE状态 | 趋势含义 |
|---|---|
| 持续上升 | 价格区间中心上移,上升趋势 |
| 持续下降 | 价格区间中心下移,下降趋势 |
| 走平 | 区间震荡 |
2. 支撑与阻力参考
MIDPRICE本身可作为一个动态的中枢参考线。结合滚动窗口内的最高价最大值和最低价最小值,可形成动态价格通道,用于识别潜在的支撑和阻力区域。
3. 应用于Ichomoku(一目均衡表)
MIDPRICE是一目均衡表指标的核心计算组件:
- 转换线(Tenkan-sen) = MIDPRICE(9)
- 基准线(Kijun-sen) = MIDPRICE(26)
- 先行带B(Senkou Span B) = MIDPRICE(52)(并向前平移)
四、使用pandas_ta计算MIDPRICE
1. 函数参数
python
pandas_ta.overlap.midprice(high, low, length=None, talib=None, offset=None, **kwargs)
high:最高价序列。low:最低价序列。length:计算周期,默认值为2
2. 示例代码
python
import pandas as pd
import pandas_ta as ta
import numpy as np
import matplotlib.pyplot as plt
# ========== 第一步:准备数据 ==========
np.random.seed(42)
dates = pd.date_range(start='2023-01-01', end='2024-12-31', freq='D')
n = len(dates)
# 生成带趋势和周期波动的价格序列
trend = np.linspace(0, 45, n)
cycle = np.sin(np.linspace(0, 6 * np.pi, n)) * 15
noise = np.random.randn(n) * 3
price_series = 100 + trend + cycle + noise
df = pd.DataFrame(index=dates[:n])
df['close'] = price_series[:n]
df['high'] = df['close'] + np.abs(np.random.randn(n)) * 2 + 1
df['low'] = df['close'] - np.abs(np.random.randn(n)) * 2 - 1
df['volume'] = np.random.randint(1000000, 25000000, n)
print("=" * 60)
print("数据预览:")
print(df.head())
print("\n" + "=" * 60 + "\n")
# ========== 第二步:计算MIDPRICE ==========
# 使用默认参数 length=14
df['MIDPRICE'] = ta.midprice(df['high'], df['low'], length=14)
print("MIDPRICE计算结果(最近10行):")
print(df[['close', 'high', 'low', 'MIDPRICE']].tail(10))
print("\n" + "=" * 60 + "\n")
# ========== 第三步:手动验证MIDPRICE计算 ==========
# 手动验证:滚动窗口内最高价最大值和最低价最小值的均值
df['HIGHEST'] = df['high'].rolling(14).max()
df['LOWEST'] = df['low'].rolling(14).min()
df['MID_manual'] = (df['HIGHEST'] + df['LOWEST']) / 2
print("手动验证(最近5行):")
print(df[['high', 'low', 'HIGHEST', 'LOWEST', 'MIDPRICE', 'MID_manual']].tail())
print("\n" + "=" * 60 + "\n")
# ========== 第四步:不同周期的MIDPRICE对比 ==========
df['MID_10'] = ta.midprice(df['high'], df['low'], length=10)
df['MID_14'] = ta.midprice(df['high'], df['low'], length=14)
df['MID_20'] = ta.midprice(df['high'], df['low'], length=20)
print("不同周期MIDPRICE对比(最近5行):")
print(df[['close', 'MID_10', 'MID_14', 'MID_20']].tail())
print("\n" + "=" * 60 + "\n")
# ========== 第五步:策略回测 ==========
# 策略:收盘价 > MIDPRICE 时持仓多头
df['position'] = (df['close'] > df['MIDPRICE']).astype(int)
df['returns'] = df['close'].pct_change()
df['strategy_returns'] = df['position'].shift(1) * df['returns']
total_return_buyhold = (1 + df['returns']).prod() - 1
total_return_strategy = (1 + df['strategy_returns']).prod() - 1
print("=" * 60)
print("策略绩效统计(MIDPRICE穿越策略回测):")
print(f"买入持有策略总收益率:{total_return_buyhold:.2%}")
print(f"MIDPRICE穿越策略总收益率:{total_return_strategy:.2%}")
print("\n注意:此为简化回测,仅供参考")
print("=" * 60 + "\n")
# ========== 第六步:可视化 ==========
plt.figure(figsize=(14, 10))
plt.subplot(2, 1, 1)
plt.plot(df.index[-200:], df['close'][-200:], label='Close Price',
linewidth=1.5, color='black')
plt.plot(df.index[-200:], df['HIGHEST'][-200:], label='Highest High (14)',
linewidth=1, color='green', alpha=0.6)
plt.plot(df.index[-200:], df['LOWEST'][-200:], label='Lowest Low (14)',
linewidth=1, color='red', alpha=0.6)
plt.plot(df.index[-200:], df['MIDPRICE'][-200:], label='MIDPRICE (14)',
linewidth=1.5, color='blue')
plt.title('MIDPRICE(中位价格)- 价格区间中心参考线', fontsize=14)
plt.ylabel('Price')
plt.legend()
plt.grid(True, alpha=0.3)
plt.subplot(2, 1, 2)
plt.plot(df.index[-200:], df['close'][-200:], label='Close Price',
linewidth=1, alpha=0.5, color='black')
plt.plot(df.index[-200:], df['MID_10'][-200:], label='MIDPRICE (10) - 短线',
linewidth=1, alpha=0.7)
plt.plot(df.index[-200:], df['MID_14'][-200:], label='MIDPRICE (14) - 标准',
linewidth=1.5, color='blue')
plt.plot(df.index[-200:], df['MID_20'][-200:], label='MIDPRICE (20) - 长线',
linewidth=1.5, color='green')
plt.title('MIDPRICE:不同周期对比', fontsize=14)
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend(loc='upper left')
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
五、总结
| 维度 | 说明 |
|---|---|
| 核心公式 | (Highest High + Lowest Low) / 2 |
| 主要用途 | 作为构建复杂指标的基础组件,辅助判断趋势和支撑/阻力 |
| 典型参数 | length=14(常见),pandas_ta默认length=2 |
| 关键局限 | 作为单一指标时信号有限,通常需要结合其他工具分析 |