2金融数据

2.1 数据导入

代码段解释:import pandas as pd:这行代码导入了pandas库,并将其简称为pd。pandas是Python中用于数据分析和操作的一个非常流行的库,提供了高性能、易用的数据结构和数据分析工具。

import numpy as np:这行代码导入了numpy库,并将其简称为np。numpy是Python中用于科学计算的一个基础库,提供了大量的数学函数操作,特别是对于数组和矩阵的操作。

import matplotlib.pyplot as plt:这行代码导入了matplotlib.pyplot模块,并将其简称为plt。matplotlib是Python中一个用于绘制图表和进行数据可视化的库,pyplot是其绘图框架。

file_path = “data/data86164/tr_eikon_eod_data_rounded.csv”:这行代码定义了一个字符串变量file_path,它存储了CSV文件的路径。这个文件包含了要分析的数据。

data = pd.read_csv(file_path, index_col=0, parse_dates=True):这行代码使用pandas库中的read_csv函数读取file_path指定的CSV文件。index_col=0参数指定了CSV文件的第一列应该被用作行索引。parse_dates=True参数告诉pandas尝试将数据中的日期字符串解析为日期类型,这样日期就可以作为时间序列数据的索引。

代码段目的: 这段代码的主要目的是准备数据分析的环境,包括导入必要的库和读取数据。通过导入pandas、numpy和matplotlib.pyplot,代码为数据操作、数学计算和数据可视化提供了必要的工具。通过读取CSV文件,代码获取了用于后续分析的时间序列数据。

2.2 汇总统计

代码段解释: data.describe().round(2) 这段代码首先使用 describe() 函数对数据集 data 进行描述性统计,然后通过 round(2) 函数将统计结果四舍五入到小数点后两位。

含义:describe() 函数:这个函数用于生成描述性统计摘要,包括数据的计数(非空值的数量)、平均值、标准差、最小值、四分位数(25%、50%、75%)和最大值。这些统计量可以帮助我们快速了解数据的基本特征和分布情况。

round(2) 函数:这个函数的作用是对 describe() 函数生成的统计值进行四舍五入,保留到小数点后两位。这样做可以使统计结果更加清晰和易于阅读。

目的:提供数据集 data 的快速统计概览,帮助分析师或数据科学家快速了解数据的基本特征和分布情况。通过四舍五入到小数点后两位,使统计结果更加精确且易于理解,便于后续的数据分析和报告撰写。

含义: data.mean()是一个在pandas库中用于计算数据集中每一列的平均值的函数。当你对数据集 data 调用这个函数时,它会分别对DataFrame中的每一列计算算术平均值,然后返回一个包含各列平均值的Series对象。

目的:数据分析:通过计算每列的平均值,你可以快速地了解数据的基本统计特征。比如,在金融时间序列分析中,计算股票价格的平均值有助于分析股票价格的总体走势。

数据预处理:在一些机器学习算法中,数据的归一化处理是一个重要步骤。计算平均值可以作为归一化的一个环节,比如通过减去平均值来将数据中心化,从而改善算法的性能。

数据可视化:平均值还可以用于生成数据分布的初步理解。在绘制柱状图或折线图时,你可以将平均值作为参考线来比较数据的波动情况,从而更直观地理解数据的分布特征。

代码段解释: 这段代码是对名为 data 的DataFrame对象进行聚合操作。通过agg函数,它计算了一系列统计量,包括最小值(min)、最大值(‘max’)、标准差(‘std’)、均值(np.mean)、中位数(np.median)。最后,通过.round(2)将结果保留两位小数。

各个统计量的含义:最小值(min):数据集中的最小值,反映了数据的最小水平。最大值(‘max’):数据集中的最大值,反映了数据的最大水平。标准差(‘std’):衡量数据离散程度的统计量,标准差越大,说明数据的离散程度越高。均值(np.mean):数据集中所有数值的平均值,反映了数据的中心趋势。中位数(np.median):将数据按大小顺序排列后位于中间的数,当数据量较大且分布不均时,中位数能更好地反映数据的中心位置。

目的: 聚合操作的目的是从多个角度(最小值、最大值、标准差、均值、中位数)全面描述data中每个数值列的特征。通过计算这些统计量,我们可以快速了解数据的分布情况、离散程度以及中心趋势等关键信息。这对于数据分析和预处理阶段非常有用,能够帮助我们更好地理解和处理数据。

2.3 随时间推移的变化

含义:data.diff():这是pandas库中DataFrame对象的一个方法,它用于计算数据集中每一列的一阶差分,即相邻两个数据点的差值。这个操作对于时间序列数据非常有用,因为它可以帮助我们了解数据随时间的变化趋势。

.head():这是pandas库中另一个常用的方法,它用于获取DataFrame或Series对象的前n行数据,默认情况下n=5。在这里,.head()被用来查看data.diff()结果的前几行,以便我们快速了解差分后的数据情况。

目的:观察变化:通过计算差分,我们可以直观地看到数据在不同时间点上的变化量。这对于分析时间序列数据的趋势和波动非常有帮助,比如分析股票价格的变化情况。

数据预处理:在进行一些时间序列分析之前,差分是常用的数据预处理步骤之一。它可以帮助我们稳定数据的方差,使得后续的数据分析或机器学习模型更容易学习和预测。

快速检查:使用.head()方法可以让我们快速检查差分后的数据是否符合预期。如果发现数据异常或不符合预期,我们可以及时调整参数或方法,从而确保后续分析的准确性。

含义:data.pct_change():这个方法用于计算DataFrame中每一列数据的百分比变化,也就是变化率。这个操作对于金融时间序列数据特别有用,因为它能够显示资产价格或价值的相对变动情况。

.round(3):这个操作将计算出的百分比变化值四舍五入到小数点后三位,这样做可以让结果更加简洁明了,便于我们阅读和理解。

.head():这个方法用于返回修改后的DataFrame的前几行数据,默认情况下是前5行。这样我们可以快速查看计算结果,对数据集的特征和趋势有一个初步的了解。

目的:观察数据变动:通过计算百分比变化,我们能够更容易地观察到数据在不同时间点之间的相对变动情况。这对于金融数据分析来说尤为重要,因为它可以帮助我们识别价格趋势、波动性等关键信息。

提高可读性:将计算结果四舍五入到小数点后三位,可以使得输出结果更加清晰易懂,便于我们在分析和讨论中引用。

快速预览:使用.head()方法可以快速预览计算结果的前几行,这对于我们初步了解数据集的特征和趋势非常有帮助。

代码段解释:data.pct_change():这部分代码计算了DataFrame data中每个元素与其前一个元素之间的百分比变化,也就是变化率。这个操作通常用于金融时间序列数据,以分析随时间推移的回报率或变动率。.mean():接着,对上一步计算出的变化率求平均值,这样我们就得到了每个时间序列(比如股票、汇率等)的平均变化率。.plot(kind=‘bar’, figsize=(10, 6)):最后,使用条形图将平均变化率可视化。figsize=(10, 6)指定了图形的尺寸,宽度为10英寸,高度为6英寸。

目的:可视化分析:通过条形图,我们可以直观地展示和比较不同时间序列的平均变化率。这有助于我们快速识别哪些序列具有较高的波动性或回报率。

辅助决策:在金融分析中,了解不同资产(如股票、债券、汇率等)的平均回报率对于投资决策至关重要。这段代码提供了一种快速计算并可视化这些信息的方法,从而帮助我们做出更明智的投资决策。

含义: 这段代码是一个简单的数学运算,它直接计算了两个数(110和90)相除的结果。这个运算本身并没有特别的含义或上下文,可能仅仅是为了示例或展示除法运算。

目的: 在你提供的文档中,这段代码可能出现在“8.1.3 随时间推移的变化”这一部分。虽然它并没有直接与金融时间序列分析相关联,但可能是为了示例如何对金融时间序列数据进行数学运算。由于之前介绍了百分比变化(变化率)和对数回报率的计算,这里的除法运算可能是作为额外的数学操作示例来呈现的。

此外,这个代码段也可能是为了强调在数据分析过程中,我们可以进行各种数学运算,而不仅仅局限于文档中特别提到的那些。

总的来说,“110 / 90”这个代码段在文档中主要是作为一个简单的数学运算示例,来展示如何在数据分析的上下文中进行数学运算。

代码段解释:import numpy as np:这行代码是导入Python的NumPy库,并将其简写为np。这样,在后续代码中就可以更方便地引用NumPy库中的函数和属性了。

np.log([0.9, 1.22]):这行代码是使用NumPy库中的log函数计算列表[0.9, 1.22]中每个元素的自然对数。np.log函数默认计算的是自然对数(即以e为底的对数)。

代码段目的:这段代码的目的是计算给定数值(0.9和1.22)的自然对数。在金融时间序列分析中,对数回报率是一种常用的计算回报率的方法。对数回报率具有一些优势,比如在某些情况下比简单回报率更容易处理。

这里的代码可能是为了演示如何计算对数回报率的一个简单例子。在金融分析中,通常会用资产在两个连续时间点上的价格比值(即后一个价格除以前一个价格)来计算回报率。而对数回报率则是这个比值的自然对数。注意,这里的0.9和1.22可能代表某个资产在两个连续时间点上的价格比值减1之前的值(因为对数回报率=log(比值),而比值=当前价格/前一价格,所以这里的0.9和1.22实际上是比值-1的结果。要得到原始比值,应分别为1.9和2.22)。

代码段解释:rets = np.log(data / data.shift(1)):这行代码首先使用data.shift(1)将数据集中的每个值向下移动一个时间单位(即获取前一个时间点的值),然后计算当前值与前一个值的比率(data / data.shift(1)),最后通过np.log计算这些比率的自然对数,得到对数回报率,并将结果存储在变量rets中。

rets.head().round(3):这是一行被注释掉的代码。如果取消注释,它将显示rets的前几行数据,并将数据四舍五入到小数点后三位。这通常用于快速查看数据的初始值。

rets.cumsum().apply(np.exp).plot(figsize=(10, 6)):这行代码首先对rets中的对数回报率进行累积求和(cumsum),然后将累积和的结果通过np.exp(自然指数函数)转换回原始的比例尺度。因为对数函数和指数函数是互逆的,所以这一步是为了将累积的对数回报率转换回资产价格变动的累积效应。最后,使用plot方法将转换后的数据绘制成图表,其中figsize=(10, 6)设置了图表的大小。

目的:计算对数回报率:对数回报率在金融分析中是一个重要的概念,它提供了资产价格变动的一种衡量方式。与简单的百分比变化相比,对数回报率具有一些数学上的优势,如时间加性和对称性。

累积回报的可视化:通过计算对数回报率的累积和并将其转换回原始比例尺度,可以很容易地可视化资产价格随时间变化的累积效应。这有助于投资者理解资产性能,并做出更明智的投资决策。

便于进一步分析:计算得到的对数回报率可以用于进一步的分析,如相关性分析、回归分析等,以探索不同资产之间的关系和趋势。

2.4 重新采样

代码段解释:data:这是一个pandas的DataFrame对象,通常包含了时间序列数据。

.resample(‘1W’, label=‘right’):这个方法用于对data进行重采样。'1W’表示将数据重新采样为每周的频率,而label='right’则指定将标签设置为每个时间段的右边界,即每周的最后一天。

.last():在每个重采样后的时间段内,这个方法会选择最后一个数据点。这意味着在每个星期内,它只保留该星期的最后一天的数据。

.head():这个方法用于选择前面几行数据,默认情况下是前5行。这通常用于快速查看数据的前几行,以便进行初步检查或分析。

目的:将高频数据(如每日数据)转换为低频数据(如每周数据)。这有助于进行长期趋势分析,或者当数据量非常大时,减少数据量以便于处理。

通过在每个时间段内选择最后一个数据点,可以保留每个时间段内的最新信息,这对于捕捉每个时间段的最新动态非常有用。使用.head()方法可以快速查看转换后的数据的前几行,这对于初步检查数据的正确性和完整性非常有帮助。

代码段含义:rets.cumsum():计算对数回报率的累积和。这意味着将每个时间点的对数回报率相加,得到从时间序列开始到当前时间点的总对数回报率。

.apply(np.exp):对累积对数回报率应用指数函数(np.exp),将其转换回累积的百分比回报率或价格水平。因为对数回报率是对百分比回报率取自然对数得到的结果,所以通过取指数可以还原回原始的比例尺度。

.resample(‘1m’, label=‘right’):将数据重新采样为每月一次。'1m’表示一个月的时间间隔,而label='right’表示标签位于时间段的右边界,即月末。

.last():在每个重新采样的时间段内,选择最后一个(实际上是唯一的)值。这确保了每个月只有一个数据点。

.plot(figsize=(10, 6)):将处理后的数据绘制成图表,图表的大小设置为10x6英寸。

代码段目的:可视化月度累积回报率:此代码段的目的是为了可视化金融时间序列数据(如股票价格或汇率)在每个月末的累积回报率。通过查看累积回报率的变化,投资者可以更好地了解资产在较长时间段内的增值情况。

分析长期趋势:重新采样为每月数据有助于投资者或分析师识别资产价格或回报率的长期趋势,这对于制定投资策略和风险管理至关重要。

比较不同时间段的表现:通过将数据按月重新采样并绘制成图表,投资者可以比较资产在不同月份或季度的表现,从而发现季节性模式或趋势变化。

辅助决策制定:该图表提供的信息可用于支持投资决策,如确定买入或卖出资产的时机、调整投资组合的资产配置等。

3 滚动统计

代码段解释:sym = ‘AAPL.O’:这行代码定义了一个变量sym,并将其赋值为字符串’AAPL.O’。这通常表示一个特定的股票代码或标识符,在这里’AAPL.O’很可能代表苹果公司的股票。

data = pd.DataFrame(data[sym]).dropna():这行代码首先从之前加载的data DataFrame中选取sym指定的列(即苹果公司的股票数据),然后将其转换为一个新的DataFrame。接着,使用dropna()函数删除这个新DataFrame中包含缺失值的任何行,以确保后续分析的数据完整性。

data.tail():这行代码调用tail()函数,用于显示处理后的DataFrame的最后几行(默认显示最后5行)。这通常用于快速检查数据的末尾部分,以确保数据加载和处理步骤按预期进行。

代码段目的:该代码段的目的是从整个金融时间序列数据集中提取特定股票(苹果公司)的数据,并清理数据以移除任何缺失值。通过查看数据的末尾部分,可以检查数据处理的结果是否符合预期。这是金融数据分析和时间序列分析中常见的预处理步骤,有助于确保后续分析的准确性和有效性。

3.1 概述

代码段解释:window = 20:这行代码定义了一个变量window,并将其值设置为20。这个变量代表了滚动窗口的大小,即在进行计算时,会考虑当前数据点之前的20个数据点(包括当前数据点)。

设置窗口大小为20是为了在计算滚动统计量时,能够考虑到一个相对较长的时间段内的数据,从而得到更平滑的统计结果。

滚动统计量计算:data[‘min’] = data[sym].rolling(window=window).min():计算滚动窗口内的最小值,并将结果存储在data[‘min’]中。这有助于了解数据在一段时间内的最低水平。

data[‘mean’] = data[sym].rolling(window=window).mean():计算滚动窗口内的平均值,并将结果存储在data[‘mean’]中。这有助于了解数据在一段时间内的平均水平。

data[‘std’] = data[sym].rolling(window=window).std():计算滚动窗口内的标准差,并将结果存储在data[‘std’]中。这有助于了解数据在一段时间内的波动程度。

data[‘median’] = data[sym].rolling(window=window).median():计算滚动窗口内的中位数,并将结果存储在data[‘median’]中。这有助于了解数据在一段时间内的中心水平,特别是在数据分布不对称时。

data[‘max’] = data[sym].rolling(window=window).max():计算滚动窗口内的最大值,并将结果存储在data[‘max’]中。这有助于了解数据在一段时间内的最高水平。

指数加权移动平均值(EWMA)计算:

data[‘ewma’] = data[sym].ewm(halflife=0.5, min_periods=window).mean():计算指数加权移动平均值,并将结果存储在data[‘ewma’]中。halflife=0.5表示半衰期为0.5,即权重衰减到一半所需的时间;min_periods=window表示在计算之前至少需要有window个非空值。

EWMA能够更平滑地反映数据的趋势变化,特别是在数据存在波动时,EWMA能够更快速地适应数据的变化趋势。

代码段目的:通过对金融时间序列数据进行滚动窗口计算,得到一系列统计指标(最小值、平均值、标准差、中位数、最大值和指数加权移动平均值),从而帮助我们分析数据的趋势和波动情况。

这些统计指标有助于识别数据的异常值、判断数据的整体趋势、评估数据的稳定性和风险水平,以及更平滑地反映数据的趋势变化。

代码段含义:data.dropna():这部分代码对data这个DataFrame执行dropna()函数,目的是去除所有包含缺失值(NaN)的行。这样做可以确保数据的完整性,避免因缺失值导致的计算错误或分析偏差。

head():这部分代码是对去除缺失值后的DataFrame执行head()函数,目的是返回前五行数据。这通常用于快速查看数据的前几行,以便对数据有一个初步的了解和检查。

代码段目的:通过去除数据中的缺失值,确保数据清洗后的完整性,为后续的数据分析或建模提供可靠的数据基础。

通过head()函数快速查看去除缺失值后的数据前几行,便于对数据的质量和分布有一个初步的认识和评估。

代码段功能:这段代码用于绘制在窗口大小为20时(虽然代码中没有直接体现窗口大小为20的设置,但根据注释和上下文,我们可以理解为这是之前计算滚动统计量时所使用的窗口大小),股价的上下限(最小值与最大值)以及平均值的变化趋势,并同时绘制出股价的真实值。

代码段详细解释:ax = data[[‘min’, ‘mean’, ‘max’]].iloc[-200:].plot(figsize=(10, 6), style=[‘g–’, ‘r–’, ‘g–’], lw=0.8):

从data DataFrame中选取min(最小值)、mean(平均值)、max(最大值)这三列。

使用.iloc[-200:]选取最后200行数据,以便在图表中展示最近的数据趋势。

使用.plot()函数绘制图表,设置图表大小为10x6英寸,线条样式分别为绿色虚线、红色虚线、绿色虚线(这里最小值和最大值的线条样式都为绿色虚线可能会让人有些困惑,通常为了区分,可能会选择不同的颜色或线条样式),线条宽度为0.8。

data[sym].iloc[-200:].plot(ax=ax, lw=2.0):

从data DataFrame中选取名为sym的列,即特定股票的股价数据。

使用.iloc[-200:]同样选取最后200行数据。

使用.plot()函数在同一图表(ax)上绘制股价的真实值,设置线条宽度为2.0,以便更清晰地展示股价的真实波动。

代码段目的:通过绘制股价的上下限和平均值,可以直观地了解股价在一段时间内的波动范围和平均水平,这对于分析股价的趋势和稳定性非常有帮助。

同时绘制股价的真实值,可以对比实际股价与平均值、上下限之间的关系,从而进行更深入的分析和判断,例如判断股价是否偏离了正常范围,或者是否存在异常波动等情况。

3.2技术分析示例

代码段含义:# 计算短期SMA 值:这行注释说明接下来的代码用于计算短期简单移动平均值(SMA)。data[‘short SMA’] = data[sym].rolling(window=42).mean() 这行代码计算data[sym](即某个股票的价格序列)在过去42个时间单位(如交易日)内的平均值,并将这个平均值序列赋值给data数据框中的新列’short SMA’。

# 计算长期SMA 值:这行注释说明接下来的代码用于计算长期简单移动平均值(SMA)。data[‘long SMA’] = data[sym].rolling(window=252).mean() 这行代码计算data[sym]在过去252个时间单位(如交易日)内的平均值,并将这个平均值序列赋值给data数据框中的新列’long SMA’。

data[[sym, ‘short SMA’, ‘long SMA’]].tail():这行代码用于显示data数据框中指定股票的价格序列、短期SMA和长期SMA的最近几个(默认是最后5个)数据点。

代码段目的:技术分析工具:SMA(简单移动平均)是技术分析中常用的工具之一,它可以帮助交易者识别股票价格的趋势和可能的逆转点。

短期与长期趋势比较:通过计算短期(42个时间单位)和长期(252个时间单位)SMA,交易者可以比较股票价格的短期波动和长期趋势。当短期SMA高于长期SMA时,可能意味着股票处于上涨趋势;相反,当短期SMA低于长期SMA时,可能意味着股票处于下跌趋势。

交易决策支持:基于SMA的比较结果,交易者可以制定交易策略。例如,当短期SMA上穿长期SMA时,可能是一个买入信号;当短期SMA下穿长期SMA时,可能是一个卖出信号。这样的策略旨在捕捉股票价格趋势的变化并从中获利。

可视化分析:通过data[[sym, ‘short SMA’, ‘long SMA’]].tail()的输出结果,交易者可以直观地看到最近一段时间内的股票价格及其短期和长期趋势的对比情况,这有助于他们做出更明智的交易决策。

代码段含义:# 计算短期SMA 值:这行注释说明接下来的代码用于计算短期简单移动平均值(SMA)。data[‘short SMA’] = data[sym].rolling(window=42).mean() 这行代码计算data[sym](即某个股票的价格序列)在过去42个时间单位(如交易日)内的平均值,并将这个平均值序列赋值给data数据框中的新列’short SMA’。

# 计算长期SMA 值:这行注释说明接下来的代码用于计算长期简单移动平均值(SMA)。data[‘long SMA’] = data[sym].rolling(window=252).mean() 这行代码计算data[sym]在过去252个时间单位(如交易日)内的平均值,并将这个平均值序列赋值给data数据框中的新列’long SMA’。

data[[sym, ‘short SMA’, ‘long SMA’]].tail():这行代码用于显示data数据框中指定股票的价格序列、短期SMA和长期SMA的最近几个(默认是最后5个)数据点。

代码段目的:技术分析工具:SMA(简单移动平均)是技术分析中常用的工具之一,它可以帮助交易者识别股票价格的趋势和可能的逆转点。

短期与长期趋势比较:通过计算短期(42个时间单位)和长期(252个时间单位)SMA,交易者可以比较股票价格的短期波动和长期趋势。当短期SMA高于长期SMA时,可能意味着股票处于上涨趋势;相反,当短期SMA低于长期SMA时,可能意味着股票处于下跌趋势。

交易决策支持:基于SMA的比较结果,交易者可以制定交易策略。例如,当短期SMA上穿长期SMA时,可能是一个买入信号;当短期SMA下穿长期SMA时,可能是一个卖出信号。这样的策略旨在捕捉股票价格趋势的变化并从中获利。

可视化分析:通过data[[sym, ‘short SMA’, ‘long SMA’]].tail()的输出结果,交易者可以直观地看到最近一段时间内的股票价格及其短期和长期趋势的对比情况,这有助于他们做出更明智的交易决策。

代码段含义:# 计算短期SMA 值:这行注释说明接下来的代码用于计算短期简单移动平均值(SMA)。data[‘short SMA’] = data[sym].rolling(window=42).mean() 这行代码计算data[sym](即某个股票的价格序列)在过去42个时间单位(如交易日)内的平均值,并将这个平均值序列赋值给data数据框中的新列’short SMA’。

# 计算长期SMA 值:这行注释说明接下来的代码用于计算长期简单移动平均值(SMA)。data[‘long SMA’] = data[sym].rolling(window=252).mean() 这行代码计算data[sym]在过去252个时间单位(如交易日)内的平均值,并将这个平均值序列赋值给data数据框中的新列’long SMA’。

data[[sym, ‘short SMA’, ‘long SMA’]].tail():这行代码用于显示data数据框中指定股票的价格序列、短期SMA和长期SMA的最近几个(默认是最后5个)数据点。

代码段目的:技术分析工具:SMA(简单移动平均)是技术分析中常用的工具之一,它可以帮助交易者识别股票价格的趋势和可能的逆转点。

短期与长期趋势比较:通过计算短期(42个时间单位)和长期(252个时间单位)SMA,交易者可以比较股票价格的短期波动和长期趋势。当短期SMA高于长期SMA时,可能意味着股票处于上涨趋势;相反,当短期SMA低于长期SMA时,可能意味着股票处于下跌趋势。

交易决策支持:基于SMA的比较结果,交易者可以制定交易策略。例如,当短期SMA上穿长期SMA时,可能是一个买入信号;当短期SMA下穿长期SMA时,可能是一个卖出信号。这样的策略旨在捕捉股票价格趋势的变化并从中获利。

可视化分析:通过data[[sym, ‘short SMA’, ‘long SMA’]].tail()的输出结果,交易者可以直观地看到最近一段时间内的股票价格及其短期和长期趋势的对比情况,这有助于他们做出更明智的交易决策。

4相关分析

设置文件路径:file_path = “data/data86164/tr_eikon_eod_data.csv”

这行代码指定了CSV文件的路径,该文件包含了你想要处理的金融时间序列数据。路径是相对于当前工作目录的。

读取CSV文件:raw = pd.read_csv(file_path, index_col=0, parse_dates=True)

这行代码使用pandas库的read_csv函数读取指定路径的CSV文件。其中,index_col=0参数表示将文件的第一列作为DataFrame的索引列,parse_dates=True参数表示将索引列解析为日期时间格式,这样方便进行后续的时间序列分析。

选择特定列并去除缺失值:data = raw[[‘.SPX’, ‘.VIX’]].dropna()

这行代码从读取的DataFrame中选择.SPX(标普500股票指数)和.VIX(VIX波动率指数)这两列数据。然后,使用dropna()函数去除包含空值的行,确保数据的完整性。

查看数据尾部:data.tail()

这行代码用于查看处理后的DataFrame的尾部几行数据(默认为最后5行)。这有助于快速检查数据是否正确加载和处理,以及确认是否包含预期的列和行。

目的:这段代码的主要目的是加载CSV文件中的金融时间序列数据,选择特定的列(.SPX和.VIX),并去除包含空值的行,以便进行后续的分析和建模。

通过查看处理后的数据的尾部,可以确保数据加载和预处理步骤的正确性,以及数据的完整性。

这些步骤是金融时间序列分析中的常见做法,有助于为后续的分析和建模提供高质量的数据基础。

代码段:data.plot(subplots=True, figsize=(10, 6))

含义:这行代码使用pandas库中的plot函数对DataFrame对象data进行绘图。参数subplots=True表示将DataFrame中的每一列数据都绘制在一个单独的子图上,而figsize=(10, 6)则指定了图形的尺寸,其中宽度为10英寸,高度为6英寸。

目的:通过分别绘制DataFrame中每一列数据的子图,可以更清晰地展示每一列数据的趋势和变化。这种绘图方式有助于比较和分析不同列之间的差异,从而更深入地理解数据。

代码段:data.loc[:‘2012-12-31’].plot(secondary_y=‘.VIX’, figsize=(10, 6));

含义:data.loc[:‘2012-12-31’]:这部分代码表示从DataFrame data 中选择索引从起始日期到 ‘2012-12-31’ 的所有行。这通常意味着你正在选取一个时间范围内的数据。

.plot(secondary_y=‘.VIX’, figsize=(10, 6)):这部分代码用于绘制图表。secondary_y=‘.VIX’ 参数表示将 ‘.VIX’ 列的数据绘制在次要y轴上,这样可以将它与其他列(默认绘制在主y轴上)进行比较。figsize=(10, 6) 参数设置了图表的尺寸,宽度为10英寸,高度为6英寸。

目的:这段代码的主要目的是可视化展示在指定日期范围(到2012年12月31日)内,DataFrame中某个主要指标(如标普500指数,虽然代码中没有明确指出,但通常是这样的金融指标)与另一个次要指标(如波动率指数 ‘.VIX’)的对比趋势。

通过将 ‘.VIX’ 绘制在次要y轴上,可以清晰地观察到两个指标在同一时间范围内的变化情况,并比较它们的相对大小和趋势。这对于金融分析师来说是非常有用的,因为它可以帮助他们理解市场波动和投资者情绪的变化。

4.1对数回报率

代码段:rets = np.log(data / data.shift(1)) rets.head()

rets = np.log(data / data.shift(1)):

含义:这行代码计算了金融时间序列数据data的对数回报率。data / data.shift(1)计算了当前行与前一行的比值,即价格的变化率。然后,通过对这个比值取自然对数,我们得到了对数回报率。

目的:对数回报率在金融分析中非常有用,因为它具有一些良好的数学性质,比如时间可加性。此外,对数回报率在处理价格数据时更加稳定,有助于减少极端价格变动对分析结果的影响。

rets.head():含义:这行代码调用了pandas库中DataFrame或Series对象的head()方法,该方法默认返回对象的前5行数据。

目的:通过查看计算得到的对数回报率数据集rets的前几行(默认是前5行),我们可以快速检查数据是否正确计算,并初步了解数据的分布情况。

综上所述,这段代码的主要目的是计算金融时间序列数据的对数回报率,并查看其前几行数据以便进行初步的分析和检查。

代码段:rets.dropna(inplace=True) rets.plot(subplots=True, figsize=(10, 6))

rets.dropna(inplace=True):

含义:这行代码从rets这个DataFrame中删除了所有包含缺失值(NaN)的行。inplace=True参数意味着这个操作会在原始的rets DataFrame上直接进行,不会创建一个新的DataFrame。

目的:在金融时间序列分析中,缺失值可能会导致计算错误或误导性的结果。因此,在进一步分析之前,通常需要先清理数据,删除包含缺失值的行,以确保分析的准确性和可靠性。

rets.plot(subplots=True, figsize=(10, 6)):

含义:这行代码使用pandas的绘图功能来绘制rets DataFrame中每一列的对数回报率。subplots=True参数意味着每一列的数据都会在一个单独的子图中绘制,而不是在同一个图中重叠。这样可以更清晰地展示每一列数据的波动情况和趋势。figsize=(10, 6)参数设置了图形的大小,宽度为10英寸,高度为6英寸。

目的:通过可视化对数回报率,金融分析师可以更容易地观察不同金融时间序列的波动情况和趋势。这对于理解市场行为、制定交易策略等金融分析任务非常重要。

综上所述,这段代码的主要目的是先清理金融时间序列数据中的缺失值,然后可视化展示清理后的数据,以便进行进一步的分析和决策。

代码段:pd.plotting.scatter_matrix(rets, alpha=0.2, diagonal=“hist”, hist_kwds={“bins”: 35}, figsize=(10, 6))

pd.plotting.scatter_matrix():该函数用于生成一个散点矩阵图,它能够展示多个变量之间的两两关系。在这个例子中,它被用于展示金融时间序列数据(如标普500指数和VIX波动率指数)的对数回报率之间的关系。

rets:rets是一个包含标普500指数(.SPX)和VIX波动率指数(.VIX)对数回报率的DataFrame。这些对数回报率是通过对原始价格数据应用对数差分计算得到的。

alpha=0.2:alpha参数控制散点的透明度。在这个例子中,透明度被设置为0.2,这有助于在视觉上使散点图更加清晰,减少因重叠而带来的混乱。

diagonal=“hist”:diagonal参数决定了散点矩阵图中对角线上图形的类型。在这个例子中,它被设置为"hist",意味着对角线上将展示每个变量的直方图,以显示其分布情况。

hist_kwds={“bins”: 35}:hist_kwds是一个字典,用于向对角线上的直方图传递额外的关键字参数。在这个例子中,它指定了直方图的"bins"(箱子数量)为35,这有助于更细致地展示数据的分布情况。

figsize=(10, 6):figsize参数控制生成的散点矩阵图的大小。在这个例子中,它被设置为(10, 6),意味着图形的宽度为10英寸,高度为6英寸。

目的:该代码段的主要目的是通过散点矩阵图直观地展示标普500指数和VIX波动率指数对数回报率之间的两两关系。同时,通过对角线上的直方图展示每个变量的分布情况,从而帮助用户更深入地理解数据之间的关系和特征。

综上所述,这段代码是一个非常有用的工具,用于金融时间序列数据的可视化分析。

4.2OLS回归

代码段:# 最小二乘回归

reg = np.polyfit(rets[‘.SPX’], rets[‘.VIX’], deg=1)# 绘制对数回报率散点图。

ax = rets.plot(kind=‘scatter’, x=‘.SPX’, y=‘.VIX’, figsize=(10, 6))# 添加线性回归线

ax.plot(rets[‘.SPX’], np.polyval(reg, rets[‘.SPX’]), ‘r’, lw=2)

np.polyfit函数:作用:这段代码使用np.polyfit函数进行最小二乘回归拟合。它试图用一条直线(一次函数)来尽可能准确地描述标普500指数的对数回报率(rets[‘.SPX’])和VIX波动率指数的对数回报率(rets[‘.VIX’])之间的关系。

参数:rets[‘.SPX’]和rets[‘.VIX’]分别作为x和y的输入数据,deg=1表示拟合的直线是一次函数。

输出:输出一个包含直线斜率和截距的数组reg。

rets.plot函数:

作用:使用rets.plot函数绘制一个散点图,用于展示标普500指数对数回报率(rets[‘.SPX’])和VIX波动率指数对数回报率(rets[‘.VIX’])之间的散点关系。

参数:kind=‘scatter’表示绘制散点图,x=’.SPX’和y='.VIX’分别表示散点图的x轴和y轴数据,figsize=(10, 6)设置图像的尺寸为10英寸宽、6英寸高。

输出:输出一个散点图,用于直观展示两个变量之间的关系。

ax.plot函数:作用:在已经绘制的散点图上使用ax.plot函数添加一条线性回归线,以直观地展示两个变量之间的线性关系。

参数:rets[‘.SPX’]作为x轴数据,np.polyval(reg, rets[‘.SPX’])计算得到y轴数据(即根据拟合的直线方程计算得到的y值),'r’表示线的颜色为红色,lw=2表示线的宽度为2。

输出:在散点图上添加一条红色直线,用于表示标普500指数对数回报率和VIX波动率指数对数回报率之间的线性关系。

整体目的:通过这段代码,我们可以直观地看到标普500指数对数回报率和VIX波动率指数对数回报率之间的散点关系,以及通过最小二乘回归拟合得到的线性关系。这有助于分析两个变量之间的相关性,验证它们之间是否存在负相关的趋势。

4.3相关

代码段:rets.corr()

含义:rets.corr()是Pandas库中DataFrame对象的一个方法,它用于计算rets这个DataFrame中各列之间的相关系数。在这个特定的上下文中,rets可能包含了两个或多个金融时间序列的对数回报率,比如标普500指数(.SPX)和VIX波动率指数(.VIX)的对数回报率。

目的:计算相关系数的主要目的是为了量化两个变量之间的线性关系强度和方向。在金融分析中,这通常用于评估不同资产之间的关联程度。相关系数的值介于-1和1之间:

值为1时,表示两个变量完全正相关,即一个变量的增加会导致另一个变量的增加。

值为-1时,表示两个变量完全负相关,即一个变量的增加会导致另一个变量的减少。

值为0时,表示两个变量之间没有线性相关关系。

通过rets.corr(),我们可以得到一个相关系数矩阵,它展示了rets中所有列两两之间的相关系数。这有助于我们分析不同金融时间序列之间的关联性,从而更好地理解市场动态和制定投资策略。

代码段:

ax = rets[‘.SPX’].rolling(window=252).corr(rets[‘.VIX’]).plot(figsize=(10, 6))

ax.axhline(rets.corr().iloc[0, 1], c=‘r’)

rets[‘.SPX’].rolling(window=252).corr(rets[‘.VIX’]):

这部分代码首先选取rets DataFrame中的.SPX列(代表标普500股票指数的对数回报率),然后对该列进行滚动窗口操作,窗口大小为252(在金融领域,这通常代表一年的交易日数量)。

对于每个滚动窗口,它计算.SPX列与.VIX列(代表VIX波动率指数的对数回报率)之间的相关系数。

结果是一个序列,其中包含了每个滚动窗口期内.SPX和.VIX之间的相关系数。

.plot(figsize=(10, 6)):

这个方法将前面计算得到的相关系数序列绘制成图表,图表的大小设置为10x6英寸。

ax = …:

将绘制好的图表赋值给变量ax,以便后续进行更多的图表操作或定制。

rets.corr().iloc[0, 1]:

这部分代码计算整个rets DataFrame中.SPX列和.VIX列之间的相关系数。

.iloc[0, 1]用于选取该相关系数的值,即.SPX和.VIX之间的相关系数(在corr()的结果中,.SPX的自相关位于第一列,而.VIX与.SPX的相关系数位于第二列)。

ax.axhline(rets.corr().iloc[0, 1], c=‘r’):

这个方法在当前图表ax上添加一条红色的水平线,该线的位置是前面计算得到的整个rets DataFrame中.SPX和.VIX之间的相关系数值。

目的:通过绘制滚动窗口内的相关系数,可以直观地观察.SPX和.VIX之间相关性的动态变化。这对于理解两者之间的动态关系非常有用,特别是在金融市场中,这种相关性分析有助于投资者做出更明智的决策。

通过添加表示整个数据集上.SPX和.VIX之间相关系数的红色水平线,可以直观地比较滚动窗口内的相关系数与整体相关系数之间的差异。这有助于识别相关性是否随时间发生变化,以及是否存在任何显著的相关性变化点,从而进一步分析市场趋势和潜在风险。

4.4 高频数


代码段:

file_path = “data/data86164/fxcm_eur_usd_tick_data.csv”

tick = pd.read_csv(file_path, index_col=0, parse_dates=True)

file_path = “data/data86164/fxcm_eur_usd_tick_data.csv”:

这行代码定义了一个名为file_path的字符串变量,它存储了要读取的CSV文件的路径。这个文件名为fxcm_eur_usd_tick_data.csv,位于data/data86164/目录下。这个文件很可能包含了欧元/美元(EUR/USD)的高频交易数据(tick data)。

tick = pd.read_csv(file_path, index_col=0, parse_dates=True):

这行代码使用pandas库中的read_csv函数来读取file_path变量指定的CSV文件。

index_col=0参数告诉read_csv函数,CSV文件的第一列应该被用作生成的DataFrame的索引列。在金融时间序列分析中,这通常是时间戳列。

parse_dates=True参数指示pandas尝试将索引列(在这里是第一列)的数据解析为日期格式。这对于后续的时间序列分析非常重要,因为它允许我们基于时间对数据进行排序、切片和聚合等操作。

目的:这段代码的目的是将包含欧元/美元高频交易数据的CSV文件加载到pandas DataFrame中,以便于进行后续的数据分析或处理。通过将时间戳列设置为索引,并解析为日期格式,代码确保了时间序列数据能够按照时间顺序进行正确的分析和操作。

代码段:tick.head()

含义:tick.head()是Pandas库中的一个方法,用于查看名为tick的DataFrame对象的前几行数据。默认情况下,head()方法会返回DataFrame的前5行,但你也可以通过传递一个整数参数来指定想要查看的行数(例如,tick.head(10)会返回前10行)。

目的:这个方法的目的是快速预览DataFrame的内容。在处理大型数据集时,查看前几行数据非常有用,因为它可以帮助我们了解数据的结构和内容,比如数据的列名、数据类型、以及数据的初步统计特征等。这对于初步的数据探索和可视化步骤来说非常关键。

代码段:tick.info()

含义:tick.info()是Pandas库中DataFrame对象的一个方法,它用于快速查看DataFrame的基本信息。

目的:这个方法的目的是提供一个DataFrame的概览,包括但不限于以下内容:

列的名称:显示DataFrame中所有列的名称。

非空值的数量:对于每一列,显示非空(非NA/null)值的数量,这有助于识别是否存在缺失值。

数据类型:显示每一列的数据类型(如int64、float64、object等),这有助于确认数据类型是否符合预期,因为数据类型对于后续的数据分析和处理至关重要。

使用tick.info()可以迅速确认数据是否已经正确加载到DataFrame中,各列的数据类型是否满足后续分析的需求,以及是否存在需要处理的缺失值等。这对于数据预处理和后续的数据分析步骤来说非常有用。

代码段:

# 计算每个数据行的中间价

tick[‘Mid’] = tick.mean(axis=1)

解释:# 计算每个数据行的中间价:这是一行注释,说明接下来的代码用于计算每个数据行的中间价。注释有助于代码的可读性和维护性。

tick[‘Mid’] = tick.mean(axis=1):这行代码实际上是在计算tick DataFrame中每一行的平均值,并将这个平均值作为一个新列’Mid’添加到DataFrame中。这里,axis=1表示沿着行的方向(即水平方向)进行操作,计算每一行的平均值。

目的:这段代码的目的是计算每个数据行(通常代表一个时间点的观测值或交易数据)的中间价。在金融高频数据中,每个数据行可能包含多个价格信息(如开盘价、最高价、最低价、收盘价等)。通过计算这些价格的平均值,我们可以得到一个综合的中间价指标,这个指标可以用于后续的数据分析、可视化或交易策略的制定。

应用场景:在处理金融高频数据时,计算中间价是一个常见的预处理步骤。中间价可以作为一个综合的市场价格指标,用于分析市场的整体趋势、波动性或进行交易决策。此外,中间价还可以用于与其他金融指标(如成交量、波动率等)进行相关性分析,以揭示市场行为背后的更多信息。

代码段:tick[‘Mid’].plot(figsize=(10, 6))

解释:tick[‘Mid’]:这部分代码从名为tick的DataFrame中选取了一个名为’Mid’的列。这个列通常包含某种形式的中间价数据,可能是基于多个价格(如开盘价、最高价、最低价、收盘价等)计算得到的平均值。

.plot(figsize=(10, 6)):这部分代码是对选取的’Mid’列数据进行绘图。plot是pandas库中DataFrame对象的一个方法,用于生成数据的可视化图表。figsize=(10, 6)是一个参数,指定了图表的大小,其中宽度为10英寸,高度为6英寸。

目的:这段代码的主要目的是绘制中间价随时间变化的图表。在金融时间序列分析中,观察中间价的变化趋势是非常重要的,因为它可以帮助我们理解市场的整体走势和波动情况。

通过图形化展示数据,我们可以更加直观地看到数据的变化规律,这对于制定交易策略、分析市场行为或进行风险管理等决策过程来说是非常有用的。

代码段:

tick_resam = tick.resample(rule=‘5min’, label=‘right’).last()

tick_resam.head()

解释:tick_resam = tick.resample(rule=‘5min’, label=‘right’).last():这行代码的作用是对名为tick的DataFrame进行重采样。resample(rule=‘5min’, label=‘right’)指定了采样规则为每5分钟一次,并且标签被设置为时间段的右边界。这意味着每个时间段的代表时间点是该时间段的结束时刻。.last()表示在每个5分钟的时间段内,取该时间段内的最后一个数据点作为该时间段的代表值。这样,原始的高频数据就被降频为了较低频率的数据。

tick_resam.head():这行代码用于查看重采样后的数据集的前几行(默认为前5行)。这有助于快速了解重采样后的数据结构和内容,比如数据的列名、数据类型以及数据的初步统计特征等。

目的:数据降频:高频数据虽然包含了丰富的市场信息,但数据量巨大,处理起来可能非常耗时和占用资源。通过重采样将数据降频到较低频率(如每5分钟一次),可以显著减少数据量,同时保留数据的主要特征,使得后续的数据分析和处理变得更加高效。

便于分析:重采样后的数据更适合进行时间序列分析。因为数据的采样间隔变得规则且易于处理,所以可以更方便地应用各种时间序列分析方法和模型。此外,降频后的数据也更易于可视化,可以更容易地观察到数据随时间变化的趋势和模式,为决策提供更直观的支持。

代码段:tick_resam[‘Mid’].plot(figsize=(10, 6))

解释:tick_resam:这是一个DataFrame对象,代表经过重采样后的高频数据。重采样通常是为了减少数据的频率,比如将逐笔交易数据转换为按一定时间间隔(如每5分钟)汇总的数据。

[‘Mid’]:这部分代码从tick_resam DataFrame中选取了一个名为’Mid’的列。这个列通常包含每个采样点的中间价数据,可能是基于该采样点内所有交易价格计算得到的平均值或中位数等。

.plot(figsize=(10, 6)):这是pandas库中DataFrame对象的一个方法,用于生成数据的可视化图表。figsize=(10, 6)指定了图表的大小,其中宽度为10英寸,高度为6英寸。这样设置可以让图表在展示时更加清晰易读。

目的:该代码段的主要目的是将重采样后的高频数据(特别是中间价数据)以图形化的方式展示出来。通过图表,我们可以直观地看到数据随时间变化的趋势、波动情况以及可能存在的异常值或模式。

图形化展示数据在金融时间序列分析中尤为重要,因为它可以帮助我们更快地识别市场的走势、波动性和潜在的交易机会或风险。此外,通过比较不同时间段或不同数据集之间的图表,我们还可以发现数据之间的关联性和差异性,为决策提供更加全面的支持

5总结

金融数据研究在全球化与信息化背景下展现出极其重要的价值与意义。随着数据量的激增、金融市场的全球化、技术的革新以及监管环境的变化,金融数据研究已成为学术界和实务界关注的焦点。

首先,金融数据研究通过深入分析历史数据,能够揭示金融市场的运行规律,为投资者提供科学的投资决策依据,提升投资决策的准确性和效率。同时,它还能帮助金融机构加强风险管理,识别潜在风险,提供预警机制,降低风险损失。

其次,金融数据研究推动了金融创新的发展。大数据、人工智能等技术的融合应用为金融创新提供了无限可能,通过数据分析可以发现新的金融产品和服务需求,推动金融产品的个性化定制和智能化服务,提升金融行业的整体竞争力。

再者,金融数据研究促进了金融监管的智能化。它为监管机构提供了实时监测和分析工具,帮助监管机构及时发现和应对市场异常波动,提高监管的效率和准确性。同时,数据分析还为监管政策的制定提供了数据支持,确保政策的科学性和有效性。

最后,金融数据研究有助于增强金融市场的稳定性。通过深入研究金融数据,可以揭示金融市场的内在机制,为政策制定者和市场参与者提供决策依据,有助于维护金融市场的稳定和发展。

综上所述,金融数据研究对于提升投资决策的科学性、加强风险管理、推动金融创新、促进金融监管的智能化以及增强金融市场的稳定性等方面都具有重要意义。作为博士研究者,我们应充分利用现代科技手段,深入挖掘金融数据的价值,为金融市场的健康发展贡献智慧和力量。

 

 

 

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐