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

1.13 重叠因子:简单移动平均线(Simple Moving Average, SMA)概念与Python实战

目录

      • 0. 本栏目因子汇总表
      • 1. 因子简述
      • 2. 因子计算逻辑
      • 3. 因子应用场景
      • 4. 因子优缺点
      • 5. 因子代码实现
      • 6. 因子取值范围及其含义
      • 7. 因子函数参数建议

0. 本栏目因子汇总表

【量海航行】

1. 因子简述

简单移动平均线(Simple Moving Average, SMA)是最基础且应用最广泛的技术指标之一。它通过计算一定周期内价格的算术平均值来平滑价格波动,帮助识别价格趋势。SMA的简单性和直观性使其成为技术分析中不可或缺的工具。

2. 因子计算逻辑

SMA的计算公式如下:

S M A t = 1 n ∑ i = 0 n − 1 C l o s e t − i S M A f a c t o r = C l o s e − S M A σ n ( C l o s e ) \begin{align*} SMA_t &= \frac{1}{n} \sum_{i=0}^{n-1} Close_{t-i} \\ SMA_{factor} &= \frac{Close - SMA}{\sigma_n(Close)} \end{align*} SMAtSMAfactor=n1i=0n1Closeti=σn(Close)CloseSMA

其中:

  • n为移动平均的周期
  • Close_{t-i}为t-i时刻的收盘价
  • σ_n(Close)为n周期收盘价的滚动标准差

3. 因子应用场景

  1. 趋势判断:

    • 价格上穿SMA,上升趋势确立
    • 价格下穿SMA,下降趋势确立
  2. 支撑阻力:

    • SMA作为动态支撑位
    • SMA作为动态阻力位
  3. 均线系统:

    • 与其他周期SMA组合
    • 构建多重均线系统
  4. 市场状态:

    • 价格与SMA的关系反映市场状态
    • 用于判断趋势强度

4. 因子优缺点

优点:

  1. 简单直观:计算方法易于理解
  2. 应用广泛:适用于各类市场
  3. 稳定可靠:不易受异常值影响
  4. 参考价值:提供重要的技术参考位

缺点:

  1. 滞后性强:对价格变化反应较慢
  2. 权重均等:忽视了时间权重
  3. 单一维度:仅考虑收盘价
  4. 虚假信号:震荡市场易生成假信号

5. 因子代码实现

def SMA_factor(df, n=20):
    """
    计算简单移动平均线(SMA)因子
    
    参数:
    df (DataFrame): 输入数据
        - code: 证券代码,如'600036.SH'
        - date: 日期,格式为'YYYY-MM-DD'
        - close: 收盘价
    n (int): 移动平均周期,默认20
    
    返回:
    DataFrame: 包含原有列和SMA因子值,理论取值范围(-∞,+∞),实际大多在[-3,3]之间
    注意:
        1. 返回数据包含所有输入列
        2. 新增SMA列为因子值
        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_sma(group):
        # 计算简单移动平均
        close = group['close'].values
        sma = np.zeros_like(close)
        for i in range(len(close)):
            if i < n:
                sma[i] = np.mean(close[:i+1])
            else:
                sma[i] = np.mean(close[i-n+1:i+1])
        
        # 计算n周期滚动标准差
        rolling_std = group['close'].rolling(window=n).std()
        
        # 计算因子值:使用滚动标准差标准化的价格偏离度
        # 处理标准差为0的情况
        group['SMA'] = np.where(
            rolling_std != 0,
            (group['close'] - sma) / rolling_std,
            0
        )
        return group
    
    df_copy = df_copy.groupby('code', group_keys=False).apply(calculate_sma)
    
    # 按照最终要求重新排序并重置索引
    df_copy = df_copy.sort_values(['code', 'date'], ascending=[True, False]).reset_index(drop=True)
    
    return df_copy

测试数据:
在这里插入图片描述

6. 因子取值范围及其含义

SMA因子的取值范围理论上是(-∞,+∞),但实际上大多数值会落在[-3,3]区间内:

  • 取值 > 2:表示价格显著高于均线(超过2个标准差),强烈超买信号
  • 取值在(1,2]之间:表示价格高于均线一个标准差以上,偏多信号
  • 取值在[-1,1]之间:表示价格在均线一个标准差范围内波动,震荡区间
  • 取值在[-2,-1)之间:表示价格低于均线一个标准差以上,偏空信号
  • 取值 < -2:表示价格显著低于均线(超过2个标准差),强烈超卖信号

7. 因子函数参数建议

  1. n (移动平均周期):
    • 默认值:20
    • 建议范围:[5, 120]
    • 参数说明:决定移动平均的平滑程度
    • 选择建议:
      • 短期:5-10天,用于日内交易
      • 中期:20-60天,用于中期趋势
      • 长期:120天以上,用于长期趋势
      • 常用周期:
        • 5日(一周)
        • 20日(一月)
        • 60日(一季)
        • 120日(半年)
        • 250日(一年)

选择建议:

  1. 不同市场特点:

    • 股票:20日、60日最常用
    • 期货:5日、10日更敏感
    • 外汇:10日、20日较合适
  2. 不同交易周期:

    • 日线:参考上述周期
    • 小时线:使用较小周期(5-20)
    • 分钟线:使用更小周期(3-10)
  3. 不同交易风格:

    • 短线:偏好短周期
    • 波段:使用中周期
    • 长线:采用长周期

相关文章:

  • 数据结构与算法-图论-最短路-单源最短路的建图方式
  • 网络应用层之HTTP
  • Lm studio本地部署DeepSeek
  • 【无标题】PHP-get_definde_vars
  • 【Python LeetCode 专题】动态规划
  • 本地部署DeepSeek-R1(Ollama+Docker+OpenWebUI知识库)
  • 项目一 - 任务3:搭建Java集成开发环境IntelliJ IDEA
  • anaconda不显示jupyter了?
  • 将DeepSeek接入vscode的N种方法
  • java23种设计模式-建造者模式
  • 基于keepalived实现haproxy高可用站点
  • Ansible剧本-playbook
  • 在 JavaScript 中如何定义一个对象
  • 论文笔记:Scaling Sentence Embeddings with Large Language Models
  • 如何在 Vue 项目中为 `el-pagination` 设置中文
  • Sky Hackathon 清水湾的水 AI美食助手
  • 一键快速打包提交发布命令行工具
  • 【报错解决】vue打开界面报错Uncaught SecurityError: Failed to construct ‘WebSocket‘
  • zabbix排障-zabbix监控的主机出现可用性灰色或者红色问题
  • 欢乐力扣:快乐数
  • 网站有域名没备案/互联网广告是做什么的
  • java web是做网站的吗/域名买卖交易平台
  • 做网站映射tcp/长治网站seo
  • 海拉尔做网站多少钱/免费个人网站制作
  • 网站建设流程图visio/百度认证官网
  • 专业奶茶网站建设/外链收录网站