0. 本栏目因子汇总表
1. 因子简述
中点价格(Midpoint Price over period, MIDPRICE)是一种基于最高价和最低价的技术指标。它通过计算指定周期内最高价和最低价的中间值来反映价格的中枢水平。与MIDPOINT相比,MIDPRICE考虑了价格的极值,能更好地反映价格的波动范围和潜在的支撑阻力位。
2. 因子计算逻辑
MIDPRICE的计算公式如下:
M I D P R I C E t = m a x ( H i g h t − n + 1 : t ) + m i n ( L o w t − n + 1 : t ) 2 M I D P R I C E f a c t o r = C l o s e − M I D P R I C E σ n ( C l o s e ) \begin{align*} MIDPRICE_t &= \frac{max(High_{t-n+1:t}) + min(Low_{t-n+1:t})}{2} \\ MIDPRICE_{factor} &= \frac{Close - MIDPRICE}{\sigma_n(Close)} \end{align*} MIDPRICEtMIDPRICEfactor=2max(Hight−n+1:t)+min(Lowt−n+1:t)=σn(Close)Close−MIDPRICE
其中:
- n为计算周期
- High_{t-n+1:t}表示从t-n+1到t时刻的最高价序列
- Low_{t-n+1:t}表示从t-n+1到t时刻的最低价序列
- σ_n(Close)为n周期收盘价的滚动标准差
3. 因子应用场景
-
价格区间分析:
- 识别价格波动的实际范围
- 判断价格的相对位置
-
支撑阻力判断:
- MIDPRICE作为重要的参考价位
- 用于设置止损止盈位置
-
趋势强度评估:
- 价格与MIDPRICE的偏离程度反映趋势强度
- 用于判断趋势的持续性
-
市场情绪分析:
- 价格在MIDPRICE上下的分布反映市场情绪
- 帮助判断市场的波动特征
4. 因子优缺点
优点:
- 全面性强:同时考虑最高价和最低价
- 参考性好:提供重要的价格中枢水平
- 稳定可靠:不易受单一价格极值影响
- 实用性高:可直接用于交易决策
缺点:
- 滞后特性:作为回溯性指标存在延迟
- 范围局限:仅反映价格的极值区间
- 参数敏感:周期选择影响指标效果
- 信号模糊:在震荡市场可能产生混淆
5. 因子代码实现
def MIDPRICE_factor(df, n=14):
"""
计算中点价格(MIDPRICE)因子
参数:
df (DataFrame): 输入数据
- code: 证券代码,如'600036.SH'
- date: 日期,格式为'YYYY-MM-DD'
- close: 收盘价
- high: 最高价
- low: 最低价
n (int): 计算周期,默认14
返回:
DataFrame: 包含原有列和MIDPRICE因子值,理论取值范围(-∞,+∞),实际大多在[-3,3]之间
注意:
1. 返回数据包含所有输入列
2. 新增MIDPRICE列为因子值
3. date列保持原有字符串格式'YYYY-MM-DD'
4. 数据将按code分组、date倒序排列
"""
import numpy as np
import pandas as pd
# 创建副本避免修改原始数据
df_copy = df.copy()
# 检查code格式
valid_codes = df_copy['code'].str.match(r'^(?:\d{6}\.(SH|SZ)|[A-Z]+/[A-Z]+|\w+\.(IB|CFE|US))$')
if not valid_codes.all():
raise ValueError("Invalid code format found")
# 检查date格式
valid_dates = df_copy['date'].str.match(r'^\d{4}-\d{2}-\d{2}$')
if not valid_dates.all():
raise ValueError("Invalid date format found, expected 'YYYY-MM-DD'")
# 排序(使用字符串比较)
df_copy = df_copy.sort_values(['code', 'date'], ascending=[True, False])
# 按code分组计算
def calculate_midprice(group):
# 计算n周期内的最高价和最低价的中点
high = group['high'].values
low = group['low'].values
midprice = np.zeros_like(high)
for i in range(len(high)):
if i < n:
high_window = high[:i+1]
low_window = low[:i+1]
else:
high_window = high[i-n+1:i+1]
low_window = low[i-n+1:i+1]
midprice[i] = (np.max(high_window) + np.min(low_window)) / 2
# 计算n周期滚动标准差
rolling_std = group['close'].rolling(window=n).std()
# 计算因子值:使用滚动标准差标准化的价格偏离度
# 处理标准差为0的情况
group['MIDPRICE'] = np.where(
rolling_std != 0,
(group['close'] - midprice) / rolling_std,
0
)
return group
df_copy = df_copy.groupby('code', group_keys=False).apply(calculate_midprice)
# 按照最终要求重新排序并重置索引
df_copy = df_copy.sort_values(['code', 'date'], ascending=[True, False]).reset_index(drop=True)
return df_copy
测试数据:
6. 因子取值范围及其含义
MIDPRICE因子的取值范围理论上是(-∞,+∞),但实际上大多数值会落在[-3,3]区间内:
- 取值 > 2:表示收盘价显著高于中点价格(超过2个标准差),强烈超买信号
- 取值在(1,2]之间:表示收盘价高于中点价格一个标准差以上,偏多信号
- 取值在[-1,1]之间:表示收盘价在中点价格一个标准差范围内波动,震荡区间
- 取值在[-2,-1)之间:表示收盘价低于中点价格一个标准差以上,偏空信号
- 取值 < -2:表示收盘价显著低于中点价格(超过2个标准差),强烈超卖信号
7. 因子函数参数建议
- n (计算周期):
- 默认值:14
- 建议范围:[5, 30]
- 参数说明:决定中点价格的计算范围和平滑程度
- 选择建议:
- 日线数据建议使用:
- 短期:5-10天
- 中期:10-20天
- 长期:20-30天
- 小时线数据建议使用8-16
- 分钟线数据建议使用5-10
- 高波动市场使用较短周期
- 低波动市场使用较长周期
- 日线数据建议使用: