《构建实时机器学习系统》一3.3 利用 Pandas 分析实时股票报价数据

简介: 本节书摘来自华章出版社《构建实时机器学习系统》一 书中的第3章,第3.3节,作者:彭河森 汪涵,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.3 利用 Pandas 分析实时股票报价数据

熟悉一项软件的最好方法就是通过示例来亲自使用它。这里将会通过分析苹果公司 2015 年 8 月 3 日秒级股票价格的数据来熟悉 Pandas 的用法。建议通过Python 笔记本或交互式窗口的方法来进行下面的操作。
首先,需要导入相关的模块,在导入Pandas模块的同时,我们还用到了Datetime模块。Datetime模块的主要功能是对时间、日期等数据进行处理,导入命令如下:

import pandas as pd
from datetime import datetime

3.3.1 外部数据导入

这里将会导入 2015 年 8 月 3 日苹果公司的秒级股票交易数据,不过,相应的原始数据需要稍做清理才能使用,而这正好符合本章的学习要点。
首先,用Pandas 的read_csv 模块直接从 csv 文件中导入数据。原始数据一共有六列,分别存有原始时间戳、每秒开盘价、最高价、最低价、收盘价和成交量信息。可以通过names 参数将这些名字赋给处理好的数据,导入命令如下:

data = pd.read_csv("aapl.csv",
                   names = ["timestamp_raw","Open","High",
                            "Low","Close","Volume"], 
                   index_col = False)
print(type(data))

上面的type(data)可以打印出当前数据对象的类。可以看到,这里data 对象的类名为DataFrame,是 Pandas 中最基本的数据形态。
导入数据之后,当然还要看看我们最感兴趣的数据长什么样,在交互窗口中打印前 5 行和后 5 行。这里需要用到DataFrame 的head 和tail 函数,命令如下:

data.head(5)
data.tail(5)

可以注意到记录中的股价数值为原始股价乘以 10000。
原始数据中的时间记录为每天距离格林威治标准时间的秒数乘以 1000,为增加可读性,需要将数据先还原。这里先将data 对象的索引变为处理后的时间标记,并调用 DataFrame.index 域,示例代码如下:

UNIX_EPOCH = datetime(1970, 1, 1, 0, 0) 
def ConvertTime(timestamp_raw, date):
    """ 该函数会将原始的时间转化为所需的datetime格式 """
    delta = datetime.utcfromtimestamp(timestamp_raw) - UNIX_EPOCH
    return date + delta

data.index = map(lambda x: ConvertTime(x, datetime(2015, 8, 3)),
                 data["timestamp_raw"]/1000)

这个时候timestamp_raw 一列将不再有用,可以删掉它。这里调用了DataFrame.drop()函数来实现该功能:

data = data.drop("timestamp_raw",1)

3.3.2 数据分析基本操作

导入数据并做初步清理之后,可以调用 DataFrame 对象的函数对其进行各种基本的修改和描述。DataFrame的很多操作都是通过调用对象的函数来进行的,具体有哪些函数呢?可以通过如下dir()命令来查看:

dir(data)

经过查看可以得知,大多数的常用函数都已经包含在内了,如 mean(均值)、max(最大值)、min(最小值)。例如,为了求得该数据集每一列的均值,我们可以进行如下操作,求最大值、最小值的操作也与此类似:

data.mean()

同时还可以调用 describe 函数直接产生常用的描述性统计量,命令如下:

data.describe()

我们进行数据分析时,往往需要对数据的假设进行检验。例如美股交易时间是从美国东部时间的早上 9:30 到下午 3:30,但是很多主流股票还具有盘前和盘后交易。盘前和盘后交易时间中估价波动较大,成交量较小,对此本书不进行研讨。在进行其他分析之前,我们需要检视一下所有数据记录的时间范围。上面的统计量操作也可以在 data.index 上执行。这里DataFrame.index 相当于一个 Series 对象,命令如下:

data.index.min()
data.index.max()

可以看到,交易时间其实包括了盘前和盘后的大量时间。在实际交易策略中,我们往往只会在正常交易时间进行交易,所以需要对数据按照时间进行拆分,只保留正常交易时间的数据,完成该项操作非常容易,命令如下:

data_trading_hour = data["201508030930":"201508031529"]

3.3.3 可视化操作

进行了简单的数据清理之后,就可以开始进行可视化操作了,首先通过目测的方式来查看数据的分布。Pandas 进行可视化操作需要依赖于 Matplolib 模块,这里首先导入对应的模块,导入命令如下:

import matplotlib
from matplotlib import pyplot as plt

Matplotlib 自带的画图风格比较僵硬,需要改改,同时为了向 R 致敬,这里设置画图风格为 R ggplot 风,设置命令如下:

matplotlib.style.use('ggplot')

画图查看每一秒的收盘价。这里只需要对 Series 类的变量调用plot 函数,即可得到
图3-1所示的股价走势图,调用命令如下:

data_trading_hour["Close"].plot()
plt.show()

screenshot

同时,也有人可能对成交量感兴趣。根据格兰杰因果检验等研究,成交量对股价变化也有影响。每秒成交量是什么样的分布?可以通过下面的命令做出直方图。只需要调用 Series 类对象的plot.hist 函数即可:

data_trading_hour["Volume"].plot.hist() 
plt.show()

直方图画出来之后,读者将会发现大多数观测集中在了较小的范围之内,但是有若干秒的交易量是其他时候的数倍。为了更深入地研究,可以画出时序图做进一步的观察,画时序图的命令如下,得到的图形如图3-2所示。

screenshot

data_trading_hour["Volume"].describe() 
data_trading_hour["Volume"].plot() 
plt.show()

果然正如我们所假设的,中午时分有大单交易发生。

3.3.4 秒级收盘价变化率初探

当然,对于实时量化交易,我们最感兴趣的还是每秒的变化率。那么下面我们就来看看股价变化的分布情况。为了到相邻时间点股价的变化率,我们可以通过调用diff 函数来实现,得到的变化率序列也是一个 Series 类对象。就如3.3.3节一样,我们可以将变化率可视化,得到图3-3。调用diff 函数的命令如下:

data_trading_hour["Close"].diff().plot.hist() 
plt.show()

change = data_trading_hour["Close"].diff()/data_trading_hour["Close"] 
change.plot() 
plt.show()

screenshot

现在回到出发点,我们分析和可视化数据是为了在后文中发掘出可能的量化交易策略。我们常常听说股价会追涨杀跌,在这种模式中的股价会按照趋势继续上涨或下跌。我们也听说过可能会均值反转,在这种模式中的股价会在具有了大幅波动之后回归平均值。那么,秒级数据又有什么样的趋势模式呢?可以通过shift 函数对时间序列进行错位,并且通过corr 函数计算两个时间序列之间的相关性系数。绝对值较大的相关性系数代表前后时间中股价变化的相关程度较高;绝对值近乎为 0则代表前后时间中股票变化相关线性程度低。shift 函数命令如下:

change.shift(1).corr(change) 
change.shift(2).corr(change)

通过图3-4可以看到,前后一秒股价变化率的相关性系数为 -0.167,这样的相关性对于金融数据来说已经非常显著了。但是这一相关性在两秒的间隔之后迅速衰减到了-0.034,所以这就要求我们的实时交易策略系统必须具有非常低的延迟,才能抓住这样的先机,得到超额的收益。
其实,在时间序列研究中,已经有了一套比较完备的描述性统计量,自相关性(auto-correlation)就是这样一个例子。MatplotLib 的 acorr 函数可以自动对时间序列做出自相关图,acorr 函数的命令如下:

plt.acorr(change[1:], lw = 2) 
plt.show()

screenshot

图3-4所示为AAPL 股价变化率自相关系数柱状图,其横轴的每个刻度均代表时间序列的错位大小,1 表示时间序列与错位 1 秒的自身进行相关性计算;2表示时间序列与错位 2 秒的自身进行相关性计算。以此类推。该图纵轴代表计算的相关性系数大小。在错位为 0 时,时间序列和自身完美相关,这里的相关性系数为 1。
从图3-4可以看出,苹果公司当天股价变化率的自相关性随着时间错位的增加而递减。前一秒股价变化率和后一秒股价呈负相关关系,这暗示我们在短期股票交易中,股价变化具有均值回归的模式。在均值回归模式中,如果股票出现大幅上涨或下跌,那么在后面的短时间内,可能会出现反向的股价波动,以减弱前期的变化。

相关文章
|
12天前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
200 0
|
5月前
|
数据采集 安全 数据挖掘
Pandas数据合并:10种高效连接技巧与常见问题
在数据分析中,数据合并是常见且关键的步骤。本文针对合并来自多个来源的数据集时可能遇到的问题,如列丢失、重复记录等,提供系统解决方案。基于对超1000个复杂数据集的分析经验,总结了10种关键技术,涵盖Pandas库中`merge`和`join`函数的使用方法。内容包括基本合并、左连接、右连接、外连接、基于索引连接、多键合并、数据拼接、交叉连接、后缀管理和合并验证等场景。通过实际案例与技术原理解析,帮助用户高效准确地完成数据整合任务,提升数据分析效率。
476 13
Pandas数据合并:10种高效连接技巧与常见问题
|
1月前
|
机器学习/深度学习 数据采集 算法
量子机器学习入门:三种数据编码方法对比与应用
在量子机器学习中,数据编码方式决定了量子模型如何理解和处理信息。本文详解角度编码、振幅编码与基础编码三种方法,分析其原理、实现及适用场景,帮助读者选择最适合的编码策略,提升量子模型性能。
151 8
|
4月前
|
机器学习/深度学习 存储 运维
机器学习异常检测实战:用Isolation Forest快速构建无标签异常检测系统
本研究通过实验演示了异常标记如何逐步完善异常检测方案和主要分类模型在欺诈检测中的应用。实验结果表明,Isolation Forest作为一个强大的异常检测模型,无需显式建模正常模式即可有效工作,在处理未见风险事件方面具有显著优势。
317 46
|
8月前
|
监控 物联网 数据处理
Pandas高级数据处理:数据流式计算
本文介绍了如何使用 Pandas 进行流式数据处理。流式计算能够实时处理不断流入的数据,适用于金融交易、物联网监控等场景。Pandas 虽然主要用于批处理,但通过分块读取文件、增量更新 DataFrame 和使用生成器等方式,也能实现简单的流式计算。文章还详细讨论了内存溢出、数据类型不一致、数据丢失或重复及性能瓶颈等常见问题的解决方案,并建议在处理大规模数据时使用专门的流式计算框架。
497 100
Pandas高级数据处理:数据流式计算
|
6月前
|
机器学习/深度学习 算法 数据挖掘
PyTabKit:比sklearn更强大的表格数据机器学习框架
PyTabKit是一个专为表格数据设计的新兴机器学习框架,集成了RealMLP等先进深度学习技术与优化的GBDT超参数配置。相比传统Scikit-Learn,PyTabKit通过元级调优的默认参数设置,在无需复杂超参调整的情况下,显著提升中大型数据集的性能表现。其简化API设计、高效训练速度和多模型集成能力,使其成为企业决策与竞赛建模的理想工具。
200 12
PyTabKit:比sklearn更强大的表格数据机器学习框架
|
8月前
|
数据采集 数据可视化 数据处理
Pandas高级数据处理:数据仪表板制作
《Pandas高级数据处理:数据仪表板制作》涵盖数据清洗、聚合、时间序列处理等技巧,解决常见错误如KeyError和内存溢出。通过多源数据整合、动态数据透视及可视化准备,结合性能优化与最佳实践,助你构建响应快速、数据精准的商业级数据仪表板。适合希望提升数据分析能力的开发者。
195 31
|
8月前
|
缓存 数据可视化 BI
Pandas高级数据处理:数据仪表板制作
在数据分析中,面对庞大、多维度的数据集(如销售记录、用户行为日志),直接查看原始数据难以快速抓住重点。传统展示方式(如Excel表格)缺乏交互性和动态性,影响决策效率。为此,我们利用Python的Pandas库构建数据仪表板,具备数据聚合筛选、可视化图表生成和性能优化功能,帮助业务人员直观分析不同品类商品销量分布、省份销售额排名及日均订单量变化趋势,提升数据洞察力与决策效率。
145 12
|
8月前
|
消息中间件 数据挖掘 数据处理
Pandas高级数据处理:数据流式计算
在大数据时代,Pandas作为Python强大的数据分析库,在处理结构化数据方面表现出色。然而,面对海量数据时,如何实现高效的流式计算成为关键。本文探讨了Pandas在流式计算中的常见问题与挑战,如内存限制、性能瓶颈和数据一致性,并提供了详细的解决方案,包括使用`chunksize`分批读取、向量化操作及`dask`库等方法,帮助读者更好地应对大规模数据处理需求。
166 17
|
7月前
|
存储 人工智能 自然语言处理
基于QwQ-32B+Hologres+PAI搭建 RAG 检索增强对话系统
本文介绍如何使用PAI-EAS部署基于QwQ大模型的RAG服务,并关联Hologres引擎实例。Hologres与达摩院自研高性能向量计算软件库Proxima深度整合,支持高性能、低延时、简单易用的向量计算能力。通过PAI-EAS,用户可以一键部署集成大语言模型(LLM)和检索增强生成(RAG)技术的对话系统服务,显著缩短部署时间并提升问答质量。具体步骤包括准备Hologres向量检索库、部署RAG服务、通过WebUI页面进行模型推理验证及API调用验证。Hologres支持高性能向量计算,适用于复杂任务的动态决策,帮助克服大模型在领域知识局限、信息更新滞后和误导性输出等方面的挑战。

热门文章

最新文章