时间序列数据在现代数据分析中无处不在。从金融市场的股票价格波动到生物医学领域的心电图与脑电图信号,甚至是日常生活中的用水量变化,都可以通过时间序列来表征。深入理解时间序列信号之间的关联性对于提取有意义的数据特征至关重要。本文将重点介绍两种基本但强大的分析工具:互相关和相干性分析。这些方法能够有效地揭示信号之间的内在关系,既可以用于识别前导-滞后关系,也可以用于检测频率域上的共振特性。
互相关分析:时域关系解析互相关是一种用于量化两个时间序列信号之间相似度的数学工具,其计算基于对一个信号施加时间延迟。通过互相关分析,可以确定一个信号是否在时间上"前导"或"滞后"于另一个信号,并量化它们在时间轴上的对齐程度。
从数学角度而言,两个时间序列x(t)与y(t)之间的互相关函数定义如下:
互相关函数的数学表达式
公式分析:
以下我们将通过分析苹果公司(AAPL)与微软公司(MSFT)的股票价格来演示互相关分析的应用。
我们将使用yfinance库获取实际的股票市场数据。分析目标是通过考察不同时间延迟下的互相关性,确定微软(MSFT)股价变动是领先于还是滞后于苹果(AAPL)的股价变动。
import yfinance as yf import matplotlib.pyplot as plt import numpy as np # 从Yahoo Finance获取指定时间段的股票数据 start_date = "2019-01-01" end_date = "2024-01-01" # 提取AAPL和MSFT的收盘价数据 aapl = yf.download("AAPL", start=start_date, end=end_date)['Adj Close'] msft = yf.download("MSFT", start=start_date, end=end_date)['Adj Close'] # 对数据进行标准化处理以便进行比较分析 aapl_norm = (aapl - aapl.mean()) / aapl.std() msft_norm = (msft - msft.mean()) / msft.std() # 设定延迟范围(±30天) lags = np.arange(-30, 31) # 计算互相关系数 cross_corr = [aapl_norm.corr(msft_norm.shift(lag)) for lag in lags] plt.figure(figsize=(10, 6)) plt.plot(lags, cross_corr, marker='o') plt.title('Cross-Correlation between AAPL and MSFT Stock Prices') plt.xlabel('Lag (Days)') plt.ylabel('Correlation') plt.axhline(0, color='black', linestyle='--') plt.grid(ls=':',lw='2') plt.show()
互相关分析结果的解读需要关注以下几个关键点:正延迟区间:当延迟值为正(例如+10天)时,表示MSFT的价格变动领先于AAPL。如果在此区间观察到较高的相关性,即说明MSFT的价格变动可能对AAPL的未来走势具有预示作用。
负延迟区间:当延迟值为负(例如-10天)时,表示AAPL的价格变动领先于MSFT。在此区间的高相关性表明AAPL的价格变化可能预示MSFT的后续走势。
零延迟点:零延迟处的相关系数反映了两支股票的即时关联程度。
举例来说,如果在+5天延迟处观察到显著的正相关性,这表明MSFT的价格变动模式在约5天后往往会在AAPL的价格中得到体现。这种关系可以为量化交易策略的制定提供重要参考。
相干性分析:脑电信号频域关联性研究相干性分析是一种评估两个信号在频率域上相关程度的方法,用于揭示特定频带内的同步活动。这种分析方法在脑电图研究中具有特殊意义,因为不同脑区在执行认知任务时可能表现出频率同步现象。
对于时间序列信号x(t)和y(t),其在频率f处的相干性定义为:
值得注意的是,该公式形式与概率论和统计学中的标准化相关系数有着深刻的数学联系。
下面我们将使用MNE库进行脑电图数据的相干性分析。这个示例将考察两个脑电通道之间的相干性,以识别它们的频率同步特征。
import mne from scipy.signal import coherence import numpy as np import matplotlib.pyplot as plt # 导入MNE示例脑电数据 eeg_data = mne.datasets.sample.data_path() raw = mne.io.read_raw_fif(eeg_data + '/MEG/sample/sample_audvis_raw.fif', preload=True) # 选择脑电通道 raw.pick_types(meg=False, eeg=True) eeg_data = raw.get_data() # 提取待分析的两个通道数据 eeg_channel_1 = eeg_data[0, :] eeg_channel_2 = eeg_data[1, :] # 获取采样频率 fs = int(raw.info['sfreq']) # 计算通道间相干性 f, Cxy = coherence(eeg_channel_1, eeg_channel_2, fs=fs, nperseg=1024) plt.figure(figsize=(20, 11)) plt.semilogy(f, Cxy) plt.title('Coherence between EEG Channel 1 and 2') plt.xlabel('Frequency [Hz]') plt.ylabel('Coherence') plt.grid(lw=2,ls=':') plt.show()
相干性谱图中,横轴表示频率(Hz),纵轴表示相干性系数(取值范围0-1):
高相干性区域:在特定频率点(如10 Hz)出现的高相干性表明两个通道在该频率上存在显著的同步活动,这可能对应于特定认知任务期间的α波同步现象。
低相干性区域:相干性较低的频带表明这些频率上两个通道的活动缺乏显著的同步性。
这种分析方法可以有效地揭示大脑不同区域在视觉处理、听觉任务或静息状态下的功能连接模式。
在临床应用中,α频带(8-12 Hz)的高相干性通常与视觉注意力任务相关。这种相干性特征可以作为特定认知状态的客观指标,还可以用于神经系统疾病的诊断,例如在癫痫患者中常可观察到异常的神经元同步化现象。
总结本文详细介绍了时间序列分析中的两种重要工具:互相关和相干性分析,并阐述了它们在信号关系研究中的应用:
互相关分析能够有效识别时间序列之间的前导-滞后关系,这在金融市场分析中具有重要应用价值。
相干性分析则专注于揭示信号的频率域特征,在神经科学研究中发挥着关键作用。
通过实际数据分析和Python实现示例,读者可以将这些方法应用于自己的研究领域,从时间序列数据中挖掘有价值的信息。
https://avoid.overfit.cn/post/3800d6eb1c884ea6a22de4a31c68cf85
作者:Thomas Konstantinovsky