使用 InfluxDB 的自动化股票交易模型

导航至

本文由 Tyler Nguyen 与 Alex Wang、Andrew Depke、Weston Tuescher 和 Neema Sadry 合作撰写。

每年,InfluxDB 的积极进取的员工都会在所有实习生之间组织一场友好的黑客马拉松。这是一个所有部门的实习生聚集在一起,集思广益,在一周的短暂时间内构建一系列想法的活动。在 2022 年的实习生黑客马拉松中,由 11 名实习生组成了两个团队。为了激发创意,我们准备了一个可能的项目电子表格,其中详细介绍了一些出色的创意,并反映了实习生团队的创造力。

最终,选定的两个项目是 InfluxDB 的三维交互式地球可视化和一个股票市场情绪机器人。我被分配到后一个项目,团队成员包括其他四名实习生:用户界面团队实习生 Alex Wang、自动化和计算团队实习生 Andrew Depke、Flux 团队实习生 Weston Tuescher 和电子商务团队实习生 Neema Sadry。

开始

在收到任务分配后,我和团队成员立即进入 Zoom 会议,我们的协同合作非常强大且毫不费力,我们争分夺秒,立即开始工作。我们对该项目的初步愿景如下:以固定的频率使用可用的 API 抓取股票的历史股票数据,使用 Python 客户端库将信息导入 InfluxDB,使用 Flux 查询对存储桶进行降采样,运行机器学习模型来预测其轨迹,并在一个简单的网站界面上绘制所有相关信息。

为了开始我们的讨论,我们制定了一个粗略的计划,记录了项目的所有组成部分、每个部分的规范和要求,甚至包括预计完成时间。之后,对话转向了我们各自的优势和劣势、不同技术的经验以及过去的项目。Andrew 还绘制了一个项目工作原理的内部运作的直观表示,这很有帮助

Resulting-model-and-illustration-for-how-we-trained-our-model

对项目的粗略概述使我们能够轻松地将每个部分划分为更小的任务,分配给每个团队成员。为了便于使用,我们选择使用 Google 文档来组织和维护我们的进度日志(使用表格);在该文档中,我们还包括了有用的资源、联系信息以及我们将要使用的技术列表。现在我们有了一个组织项目后勤的平台,我们需要一个组织项目本身的场所:GitHub 是另一个容易的选择,因为它很受欢迎,而且我们的项目规模很小。

Influx-Intern-project

来源:用于组织项目任务的 Google 文档的屏幕截图

埋头苦干:我的视角

当我们各自开始处理任务时,我的首要任务是熟悉 InfluxDB Python 客户端库,以便能够将股票数据存储到 InfluxDB Cloud 中进行查询。InfluxDB 在其文档部分和云平台的指定 Python 部分提供了易于访问的文档。即使文档中提供了一个有用的代码起始块,我仍然遇到了一些错误,特别是 SSL 验证错误,考虑到我只是试图运行给定的代码,这本不应该发生。我尝试了很多修复方法,但都没有成功,从咨询非常活跃的 InfluxDB 社区到使用 Pip 重新安装 Python 附带的 SSL 包;直到我联系了我的导师 Zoe Steinkamp 和 Anais Georgiou,他们才迅速帮助我找到了一个解决方法。我用我的用户 ID 替换了“org”变量中的组织电子邮件,从而解决了这个问题。

Complete-example-write-script

来源:InfluxDB Python 客户端库文档

既然我能够从 Python 向 InfluxDB 发送数据,我就可以开始计划如何编写 Python 脚本,将网络抓取的数据转换为 InfluxDB Cloud 可以理解的格式。我与负责从 API 抓取股票市场数据的团队成员 Neema Sadry 进行了协调,我们一致认为将抓取的数据输出到 CSV 文件,每行包含股票代码、当前价格和公司名称,将是在 Python 中打包和解析信息的最简单方法。

由于我们分配任务的方式,在 Neema 完成抓取工具之前,我无法使用真实的股票数据,因此为了测试目的,我暂时按照我们商定的格式制作了自己的 CSV 文件。我的程序非常简单:先打开 CSV 文件,然后循环遍历每一行,从 CSV 文件中读取每一行,在每个逗号处将行拆分为列表,索引到列表并将每个元素输入到 InfluxDB Cloud 中的相应字段或标签中。在使用真实股票数据运行程序后,这就是包含所有股票数据的存储桶的样子

Data-Explorer-featuring-our-bucket-that-contains-relevant-stock-data

来源:数据浏览器,其中显示了包含相关股票数据的存储桶

挑战

在艰苦的一周问题解决过程中,我们逐渐发现了一系列我们无法预料的障碍。例如,我们很快发现大多数市场模拟都不是免费的,这意味着我们必须粗略地估计模型的行为,并且必须牺牲一些准确性。

我们面临的另一个挑战是,时间序列数据库的机器学习与传统学习不同,从某种意义上说,您需要围绕相对时间段来构建模型,而不是批量输入时间戳标记的数据。最后,很明显,创建一种在客户端和服务器之间处理和发送大量股票数据的有效方法本质上是困难的,因为这需要巨大的负载和处理时间。我们考虑过的一个可能的解决方案是使用缓存股票数据的方法,这样我们就不必每次都获取结果,或者动态加载股票而不是批量加载。

成功

尽管我们遇到了相当多的挑战,但我们还是成功部署并顺利实施了许多概念。

Advanced-Micro-Devices

Yahoo-Finance-and-Web-Scraping-Code

来源:雅虎财经和网络抓取代码

我们的网络抓取工具完全按照预期工作,这对我们的整个项目至关重要。数据被抓取、清理和消毒,没有任何问题,并且很容易发送到 InfluxDB。

scraping-utility

Resulting-model-and-illustration-for-how-we-trained-our-model

来源:结果模型以及我们如何训练模型的说明

我们的模型以一致的间隔运行,它从我们的云实例中提取最新的股票数据,预测股票在一分钟后的表现,并决定买入、卖出或持有股票。尽管模型的行为与预期不符,绿色线是应该的样子,而红色虚线是实际的样子,但我们得出的结论是,这是由于没有足够的时间用足够的数据来实际训练模型,而不是技术故障。如果有更多的时间,我们可以改进模型,使预期与现实相符。

Web-UI-to-display-stock-data

来源:用于显示股票数据的 Web UI

我们用于以仪表板方式显示股票数据的简单 Web 应用程序已链接到我们的 InfluxDB Cloud 实例。与云更新的频率一样,网站将通过 Python 脚本更新,该脚本以我们的界面可以理解的 JSON 格式从存储桶下载新数据,并将其附加到网站上当前显示的数据中。

未来改进

随着项目的结束,我们回顾了漫长的一周编码工作。肯定有一些我们可以做得不同并加以改进的地方。首先,我们认为,构建一个全新的交易模型,使其能够原生处理多只股票、高度多样化的数据和时间戳数据,将更加有效。更好地集成 Telegraf,以便在新数据出现时自动运行我们的模型,可能比我们目前每三十秒运行一次脚本的自动化方式更有效。如果我们想扩展项目以处理多只股票,而不仅仅是少数几只,我们需要考虑负载大小对客户端和服务器的影响。拥有高效的存储和检索数据的方法至关重要,当项目规模增加时,大量数据会迅速减慢服务器速度。我们最后要包含的主要更改是在股票代码数据之外提取情绪数据,因为尽管情绪数据很难获得,但它可以带来利润更高的模型。

结论

总的来说,InfluxDB 2022 年实习生黑客马拉松是一次丰富且富有洞察力的体验。它不仅让我们体验了使用新技术带来的学习曲线,还让我们能够温习很久以前可能在最近没有用处的一些旧技能,或者加强相关的技能,这作为一名程序员总是有益的。在一周的短暂时间内,我们能够构建一个相对完整的程序,该程序足够通用,可以用于更大规模的应用程序,并且仅仅预示了未来实习生将在 InfluxDB 构建的内容。