4.7.5-时间序列数据分析.md

4.7.5 时间序列数据分析

时间序列数据分析是对按时间顺序排列的数据进行研究和处理的过程,旨在发现时间上的趋势、季节性变化、周期性波动等规律。它在金融、经济、气象、制造业等领域应用广泛,如股票价格波动预测、市场需求分析、气候变化趋势等。本章学习目标把时间序列数据分析列为 Pandas 处理时间序列的优势之一。本节以股票 KDJ 指标为实例,把时间索引、滚动窗口和数据框运算用于一条完整的分析链路。

KDJ 指标是股票技术分析中常用的动量指标,用于判断市场的超买或超卖状态。它综合价格的波动趋势和相对位置,生成 K 值、D 值和 J 值三条曲线:K、D 反映股价趋势的中短期波动,J 用于放大市场信号,更能敏感地捕捉转折点。指标处于极端区域时,往往意味着趋势可能反转,可辅助判断买入或卖出时机。

计算顺序是先 RSV,再 K、D,最后 J。当日 RSV=(Cn-Ln)÷(Hn-Ln)×100,其中 Cn 为第 n 日收盘价,Ln 为 n 日内最低价,Hn 为 n 日内最高价。当日 K 值=2/3×前一日 K 值+1/3×当日 RSV;当日 D 值=2/3×前一日 D 值+1/3×当日 K 值;若无前一日 K、D,分别用 50 代替。当日 J 值=3×当日 K 值-2×当日 D 值。课程用文件 601398.xlsx 保存幸福银行 2024 年 1 月 2 日至 8 月 30 日的收盘、最高和最低价,先 pd.read_excel('601398.xlsx', index_col=0) 读入数据框,再调用 kdj(stockData, n=9, m1=3, m2=3):

def kdj(stockData, n=9, m1=3, m2=3):
    low_n = stockData['最低'].rolling(window=n, min_periods=1).min()
    high_n = stockData['最高'].rolling(window=n, min_periods=1).max()
    rsv = (stockData['收盘'] - low_n) / (high_n - low_n) * 100
    stockData['K'] = np.nan
    stockData['D'] = np.nan
    K_last, D_last = 50, 50
    for i in range(len(stockData)):
        K_last = (2/3) * K_last + (1/3) * rsv.iloc[i]
        D_last = (2/3) * D_last + (1/3) * K_last
        stockData.at[stockData.index[i], 'K'] = K_last
        stockData.at[stockData.index[i], 'D'] = D_last
    stockData['J'] = 3 * stockData['K'] - 2 * stockData['D']

rolling 的 window 指定窗口大小,min_periods 指定最少观测数。K、D 用循环按公式递推,并以快速访问器 at[] 按行标签写入;J 由序列运算一次算出。函数就地改写传入的数据框,调用后打印 stockData[['K','D','J']]。

易错点:RSV 的高低价是 n 日窗口最值,不能只用当日最高、最低;无前值时 K、D 初值是 50 不是 0;J 是 3*K-2*D,不要写成 3*D-2*K;min_periods=1 使前几天仍能计算,省略则默认需满窗口,前 n-1 日 RSV 为 NaN,K、D、J 会连锁为空;列名必须是「收盘」「最高」「最低」;不要把本节的指标分析与 4.7.3 的 resample()、4.7.4 的滚动统计混为一谈——后两者是工具,本节是用滚动窗口做规律分析。

关键要点

下载此文件