中国优秀网站建设官网淘宝如何提升关键词排名
目录
- 0. 本栏目因子汇总表
- 1. 因子简述
- 2. 因子计算逻辑
- 3. 因子应用场景
- 4. 因子优缺点
- 5. 因子代码实现
- 6. 因子取值范围及其含义
- 7. 因子函数参数建议
0. 本栏目因子汇总表
【量海航行】
1. 因子简述
三角移动平均线(Triangular Moving Average, TRIMA)是一种特殊的加权移动平均线。它通过对价格数据进行两次简单移动平均计算,自然形成三角形权重分布,使得中间数据的权重最大,两端数据的权重逐渐减小。这种权重分布使TRIMA具有更好的平滑效果,同时保持对中期趋势的敏感性。
2. 因子计算逻辑
TRIMA的计算公式如下:
N 1 = ⌊ ( n + 1 ) / 2 ⌋ S M A 1 = 1 N 1 ∑ i = 0 N 1 − 1 C l o s e t − i T R I M A = 1 N 1 ∑ i = 0 N 1 − 1 S M A 1 , t − i T R I M A f a c t o r = C l o s e − T R I M A σ n ( C l o s e ) \begin{align*} N_1 &= \lfloor (n + 1) / 2 \rfloor \\ SMA_1 &= \frac{1}{N_1} \sum_{i=0}^{N_1-1} Close_{t-i} \\ TRIMA &= \frac{1}{N_1} \sum_{i=0}^{N_1-1} SMA_{1,t-i} \\ TRIMA_{factor} &= \frac{Close - TRIMA}{\sigma_n(Close)} \end{align*} N1SMA1TRIMATRIMAfactor=⌊(n+1)/2⌋=N11i=0∑N1−1Closet−i=N11i=0∑N1−1SMA1,t−i=σn(Close)Close−TRIMA
其中:
- n为移动平均周期
- N_1为第一次SMA的周期
- SMA为简单移动平均
- σ_n(Close)为n周期收盘价的滚动标准差
- ⌊x⌋表示向下取整
3. 因子应用场景
-
趋势识别:
- 价格上穿TRIMA,上升趋势确立
- 价格下穿TRIMA,下降趋势确立
-
中期趋势:
- TRIMA走向反映中期趋势
- 用于中期趋势交易
-
支撑阻力:
- TRIMA作为动态支撑位
- TRIMA作为动态阻力位
-
市场周期:
- 判断市场所处周期
- 识别趋势转折点
4. 因子优缺点
优点:
- 平滑性强:三角形权重分布降低噪音
- 稳定可靠:不易受极端值影响
- 中庸特性:平衡了滞后性和敏感度
- 易于理解:计算逻辑直观简单
缺点:
- 滞后性大:双重平均增加了滞后
- 灵敏度低:对短期波动反应迟钝
- 信号延迟:趋势转折信号较晚
- 震荡不适:横盘市场效果欠佳
5. 因子代码实现
def TRIMA_factor(df, n=20):"""计算三角移动平均线(TRIMA)因子参数:df (DataFrame): 输入数据- code: 证券代码,如'600036.SH'- date: 日期,格式为'YYYY-MM-DD'- close: 收盘价n (int): 移动平均周期,默认20返回:DataFrame: 包含原有列和TRIMA因子值,理论取值范围(-∞,+∞),实际大多在[-3,3]之间注意:1. 返回数据包含所有输入列2. 新增TRIMA列为因子值3. date列保持原有字符串格式'YYYY-MM-DD'4. 数据将按code分组、date倒序排列"""import numpy as npimport 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_trima(group):close = group['close'].values# 计算三角权重n1 = (n + 1) // 2weights = np.array([min(i + 1, n - i) for i in range(n)])weights = weights / weights.sum()# 计算TRIMAtrima = np.zeros_like(close)for i in range(len(close)):if i < n:window = close[:i+1]w = weights[-(i+1):]w = w / w.sum()trima[i] = np.sum(window * w)else:trima[i] = np.sum(close[i-n+1:i+1] * weights)# 计算n周期滚动标准差rolling_std = group['close'].rolling(window=n).std()# 计算因子值:使用滚动标准差标准化的价格偏离度# 处理标准差为0的情况group['TRIMA'] = np.where(rolling_std != 0,(group['close'] - trima) / rolling_std,0)return groupdf_copy = df_copy.groupby('code', group_keys=False).apply(calculate_trima)# 按照最终要求重新排序并重置索引df_copy = df_copy.sort_values(['code', 'date'], ascending=[True, False]).reset_index(drop=True)return df_copy
测试数据:
6. 因子取值范围及其含义
TRIMA因子的取值范围理论上是(-∞,+∞),但实际上大多数值会落在[-3,3]区间内:
- 取值 > 2:表示价格显著高于TRIMA(超过2个标准差),强烈超买信号
- 取值在(1,2]之间:表示价格高于TRIMA一个标准差以上,偏多信号
- 取值在[-1,1]之间:表示价格在TRIMA一个标准差范围内波动,震荡区间
- 取值在[-2,-1)之间:表示价格低于TRIMA一个标准差以上,偏空信号
- 取值 < -2:表示价格显著低于TRIMA(超过2个标准差),强烈超卖信号
7. 因子函数参数建议
- n (移动平均周期):
- 默认值:20
- 建议范围:[15, 50]
- 参数说明:决定移动平均的平滑程度
- 选择建议:
- 日线数据建议使用:
- 中期:20-30天
- 长期:40-50天
- 小时线数据建议使用15-25
- 分钟线数据建议使用10-20
- 高波动市场使用较长周期
- 低波动市场可用较短周期
- 日线数据建议使用: