Overlap:MIDPRICE(中位价格)技术指标详解

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
关键局限 作为单一指标时信号有限,通常需要结合其他工具分析