当前位置: 首页 > news >正文

1.14 重叠因子:TRIMA三角移动平均线(Triangular Moving Average, TRIMA)概念与Python实战

目录

      • 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=0N11Closeti=N11i=0N11SMA1,ti=σn(Close)CloseTRIMA

其中:

  • n为移动平均周期
  • N_1为第一次SMA的周期
  • SMA为简单移动平均
  • σ_n(Close)为n周期收盘价的滚动标准差
  • ⌊x⌋表示向下取整

3. 因子应用场景

  1. 趋势识别:

    • 价格上穿TRIMA,上升趋势确立
    • 价格下穿TRIMA,下降趋势确立
  2. 中期趋势:

    • TRIMA走向反映中期趋势
    • 用于中期趋势交易
  3. 支撑阻力:

    • TRIMA作为动态支撑位
    • TRIMA作为动态阻力位
  4. 市场周期:

    • 判断市场所处周期
    • 识别趋势转折点

4. 因子优缺点

优点:

  1. 平滑性强:三角形权重分布降低噪音
  2. 稳定可靠:不易受极端值影响
  3. 中庸特性:平衡了滞后性和敏感度
  4. 易于理解:计算逻辑直观简单

缺点:

  1. 滞后性大:双重平均增加了滞后
  2. 灵敏度低:对短期波动反应迟钝
  3. 信号延迟:趋势转折信号较晚
  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 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_trima(group):
        close = group['close'].values
        # 计算三角权重
        n1 = (n + 1) // 2
        weights = np.array([min(i + 1, n - i) for i in range(n)])
        weights = weights / weights.sum()
        
        # 计算TRIMA
        trima = 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 group
    
    df_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. 因子函数参数建议

  1. n (移动平均周期):
    • 默认值:20
    • 建议范围:[15, 50]
    • 参数说明:决定移动平均的平滑程度
    • 选择建议:
      • 日线数据建议使用:
        • 中期:20-30天
        • 长期:40-50天
      • 小时线数据建议使用15-25
      • 分钟线数据建议使用10-20
      • 高波动市场使用较长周期
      • 低波动市场可用较短周期

相关文章:

  • react 路由跳转的几种方式
  • 超市里的货物价调整
  • AWS成本优化完整方案:从基础配置到高阶策略
  • vue中带$的是什么
  • 2025年如何实现安卓、iOS、鸿蒙跨平台开发
  • Pytorch为什么 nn.CrossEntropyLoss = LogSoftmax + nn.NLLLoss?
  • unity pico开发 一:环境准备
  • Vue.js计算属性
  • 如何获取mac os 安装盘
  • 软件开发成本核算解析:数据存储和操作哪些费用该打包?哪些必须单算?
  • CentOS 7.6上安装Docker(1)
  • MS SQL Server partition by 函数实战二 编排考场人员
  • v-model=‘xxx‘和v-model:visible=‘xxx‘有什么区别
  • 【Go语言快速上手】第一部分:函数与错误处理
  • Vue 3指令全解析:内置指令与自定义指令实战指南
  • Android15 Camera HAL Android.bp中引用Android.mk编译的libB.so
  • 递归遍历目录 和 普通文件的复制 [Java EE]
  • 【Azure 架构师学习笔记】- Azure Databricks (13) -- 搭建Medallion Architecture part 1
  • FastExcel vs EasyExcel vs Apache POI:三者的全面对比分析
  • Apache Spark中的依赖关系与任务调度机制解析
  • b2b2c平台网站建设/站长资源平台
  • 旅游网站设计的目的/智能营销系统
  • 做网站的有哪些学校/友情链接交易购买
  • 家政服务公司网站源码/博客是哪个软件
  • 做网站一般什么问题/北京公司排名seo
  • 高中信息技术网站设计规划/快速网站推广优化