(1-2)金融时间序列分析:移动平均法

1.2  常用的时间序列分析方法

常用的时间序列分析方法包括移动平均法、自回归模型、自回归移动平均模型等。其中,移动平均法通过计算一定时间窗口内数据的平均值来平滑序列,识别趋势;自回归模型(AR)基于序列自身的历史值进行预测;自回归移动平均模型(ARMA)结合了 AR 和移动平均模型(MA)的特点,能更好地捕捉序列中的复杂模式;季节性自回归集成移动平均模型(SARIMA)则是在 ARMA 的基础上,增加了对季节性因素的处理;ARCH 和 GARCH 模型主要用于分析时间序列的异方差性,即波动的聚集性;向量自回归模型(VAR)适用于多个相关时间序列的联合分析;协整合分析用于检验多个非平稳时间序列之间是否存在长期稳定的关系;机器学习方法如神经网络、决策树等,也被广泛应用于时间序列分析,能够捕捉到更复杂的非线性关系和模式。

1.2.1  移动平均法

移动平均法(Moving Averages)是时间序列分析中一种简单且常用的平滑技术,其核心思想是通过计算数据序列中连续固定长度窗口内数据的平均值,来消除短期波动、突出长期趋势,从而更清晰地观察数据的变化规律。

1. 核心原理

设定一个固定的“窗口大小”(如3天、5个月等),以时间顺序滑动该窗口,每次计算窗口内所有数据的平均值,作为该窗口对应时间点的平滑值。例如,对于月度销售数据,若窗口大小为3,则1月、2月、3月的平均值作为2月的平滑值2月、3月、4月的平均值作为3月的平滑值,以此类推。

2. 主要类型

  1. 简单移动平均(SMA):直接计算窗口内数据的算术平均值,对窗口内所有数据赋予相同权重。
  2. 加权移动平均(WMA):对窗口内不同时间的数据赋予不同权重(通常近期数据权重更高),更贴合实际变化趋势。
  3. 指数移动平均(EMA):通过指数衰减的方式对历史数据加权,既保留了移动平均的平滑效果,又对近期数据赋予更高灵敏度,适用于快速响应趋势变化的场景(如股票价格分析)。

3. 应用场景

  1. 趋势识别:平滑短期随机波动,凸显数据的长期上升、下降或平稳趋势(如分析产品销量的季度趋势)。
  2. 短期预测:基于历史平滑值对未来短期内的数据进行简单预测(如用近 7 天的平均气温预测明天的气温)。
  3. 异常值检测:当原始数据与移动平均值偏离过大时,可能提示存在异常(如某一天的网站访问量远高于近期平均值)。

4. 优缺点

  1. 优点:计算简单、直观易懂,适用于处理平稳或弱趋势的时间序列数据。
  2. 缺点:对窗口大小敏感(需手动调整),无法处理强季节性或非线性趋势数据,预测能力有限(尤其长期预测)。

总之,移动平均法常作为时间序列分析的基础工具,也可与其他方法(如ARIMA)结合使用,提升分析效果。

请看下面的实例,

实例1-1:使用移动平均法分析贵州茅台股票数据(源码路径:codes\1\Maotai.py和Shijian.py

(1)实例文件Maotai.py的功能是使用Tushare获取贵州茅台的历史交易数据(2020年1月1日到2023年9月1日)具体实现代码如下所示。

import tushare as ts

# 设置Tushare的API令牌(请使用您自己的令牌)
ts.set_token('')

# 初始化Tushare的pro接口
pro = ts.pro_api()

# 获取贵州茅台的历史日线数据
df = pro.daily(ts_code='600519.SH', start_date='20200101', end_date='20230901')

# 保存数据到本地CSV文件
df.to_csv('maotai_stock_data.csv', index=False)

执行上述代码后,将贵州茅台的历史交易数据(2020年1月1日到2023年9月1日)保存到本地文件maotai_stock_data.csv中。

(2)实例文件Shijian.py的功能是读取贵州茅台股票的CSV数据文件maotai_stock_data.csv,计算其收盘价的5日、20日、60日移动平均值并通过可视化图表展示股价与各周期移动平均线的趋势对比,同时解读移动平均线在金融分析中的应用要点。具体实现代码如下所示。

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib.ticker import FuncFormatter

# 设置中文显示
plt.rcParams['font.family'] = 'Microsoft YaHei'# 或其他支持特殊字符的字体
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

# 1. 读取本地CSV文件数据
try:
    # 读取茅台股票数据文件
    df = pd.read_csv('maotai_stock_data.csv')

    # 数据预处理
    # 转换日期格式(字符串→datetime)
    df['Date'] = pd.to_datetime(df['Date'], format='%Y%m%d')
    # 按日期升序排序(确保时间序列顺序正确)
    df = df.sort_values(by='Date').reset_index(drop=True)

    # 检查关键列是否存在
    required_columns = ['close', 'Date']
    if not all(col in df.columns for col in required_columns):
        raise ValueError("数据文件缺少必要的列('close'或'Date')")

    print(
        f"数据加载成功:共 {len(df)} 条记录,时间范围从 {df['Date'].min().strftime('%Y-%m-%d')} 到 {df['Date'].max().strftime('%Y-%m-%d')}")
except FileNotFoundError:
    print("错误:未找到文件 'maotai_stock_data.csv',请确认文件路径是否正确")
    exit()
except Exception as e:
    print(f"数据处理出错:{str(e)}")
    exit()

# 2. 计算移动平均值(以收盘价为分析对象)
# 常用窗口设置:5日(短期)、20日(中期)、60日(长期)
df['SMA5'] = df['close'].rolling(window=5, min_periods=1).mean()  # 5日移动平均
df['SMA20'] = df['close'].rolling(window=20, min_periods=1).mean()  # 20日移动平均
df['SMA60'] = df['close'].rolling(window=60, min_periods=1).mean()  # 60日移动平均

# 3. 可视化:收盘价与多条移动平均线对比
plt.figure(figsize=(14, 7))

# 绘制原始收盘价
plt.plot(df['Date'], df['close'], label='每日收盘价', color='#1f77b4', linewidth=2, alpha=0.6)

# 绘制移动平均线
plt.plot(df['Date'], df['SMA5'], label='5日移动平均线', color='#ff7f0e', linestyle='-', linewidth=1.5)
plt.plot(df['Date'], df['SMA20'], label='20日移动平均线', color='#2ca02c', linestyle='--', linewidth=1.5)
plt.plot(df['Date'], df['SMA60'], label='60日移动平均线', color='#d62728', linestyle='-.', linewidth=1.5)

# 图表美化
plt.title('贵州茅台股价与移动平均线趋势分析', fontsize=16, pad=20)
plt.xlabel('日期', fontsize=12, labelpad=10)
plt.ylabel('股价(元)', fontsize=12, labelpad=10)

# 日期刻度格式化
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))  # 按月显示
plt.gca().xaxis.set_major_locator(mdates.MonthLocator(interval=2))  # 每2个月显示一个刻度
plt.xticks(rotation=45, ha='right')  # 日期旋转45度,右对齐

# 股价刻度格式化(显示整数)
plt.gca().yaxis.set_major_formatter(FuncFormatter(lambda x, pos: f'{int(x)}'))

# 添加网格和图例
plt.grid(alpha=0.3, linestyle=':')
plt.legend(loc='upper left', fontsize=10)

# 调整布局
plt.tight_layout()

# 显示图表
plt.show()

# 4. 移动平均线在金融分析中的应用解读
print("\n===== 移动平均线分析要点 =====")
print("1. 短期均线(5日)反应近期趋势,对价格变化更敏感;长期均线(60日)平滑效果更强,反映中长期趋势。")
print("2. 交叉信号:")
print("   - 短期均线上穿长期均线(金叉):可能提示趋势转强,视为潜在买入信号")
print("   - 短期均线下穿长期均线(死叉):可能提示趋势转弱,视为潜在卖出信号")
print("3. 趋势判断:")
print("   - 多条均线向上发散:表明整体处于上升趋势")
print("   - 多条均线向下发散:表明整体处于下降趋势")
print("   - 均线缠绕横盘:表明价格处于整理阶段,趋势不明确")
print("4. 注意事项:移动平均线属于滞后指标,需结合成交量、MACD等其他指标综合判断")

上述代码的实现流程如下所示。

  1. 环境配置与初始化:设置中文显示参数(解决图表中文字体和负号显示问题),确保可视化结果符合中文阅读习惯。
  2. 数据读取与预处理:尝试读取本地maotai_stock_data.csv文件,若文件不存在或格式错误则抛出对应提示;读取成功后将日期列转换为datetime格式,按日期升序排序,同时校验数据中是否包含“收盘价”和“日期”等必要字段,确保后续分析有可靠的数据基础。
  3. 移动平均值计算:以股票收盘价为分析对象,通过rolling函数分别计算5日(短期)、20日(中期)、60日(长期)移动平均值,其中min_periods=1确保数据量不足窗口大小时仍能计算部分结果。
  4. 可视化展示:绘制收盘价曲线与三条移动平均线,如图1-1所示。通过不同颜色和线型区分,并且优化了图表格式(如按月显示日期、调整刻度标签、添加网格和图例),清晰展示了股价与各周期均线的趋势关系。
  5. 分析结果:打印输出如下所示的分析结果,总结移动平均线的核心应用逻辑,包括短期与长期均线的特点、交叉信号(金叉/死叉)的意义、趋势判断方法及使用注意事项,帮助理解图表背后的金融分析价值。
数据加载成功:共 891 条记录,时间范围从 2020-01-02 到 2023-09-01

===== 移动平均线分析要点 =====
1. 短期均线(5日)反应近期趋势,对价格变化更敏感;长期均线(60日)平滑效果更强,反映中长期趋势。
2. 交叉信号:
   - 短期均线上穿长期均线(金叉):可能提示趋势转强,视为潜在买入信号
   - 短期均线下穿长期均线(死叉):可能提示趋势转弱,视为潜在卖出信号
3. 趋势判断:
   - 多条均线向上发散:表明整体处于上升趋势
   - 多条均线向下发散:表明整体处于下降趋势
   - 均线缠绕横盘:表明价格处于整理阶段,趋势不明确
4. 注意事项:移动平均线属于滞后指标,需结合成交量、MACD等其他指标综合判断

图1-1  收盘价曲线与三条移动平均线可视化图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农三叔

感谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值