使用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客户端库(Python Client library)将信息导入InfluxDB,使用Flux查询(downsample)桶,运行机器学习模型(predict)其轨迹,并在简单的网站界面上绘制所有相关信息。

为了启动讨论,我们制定了一个大致的计划,记录了项目的所有关键部分,每个部分的规格和需求,甚至预计完成时间。然后,我们转向讨论个人的优势和劣势,以及使用不同技术的经验,过去的项目。幸运的是,Andrew绘制了一个项目内部工作原理的视觉表示。

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

这个项目的大致概述使我们能够轻松地将每个部分分解成更小的任务,分配给每个团队成员。为了方便使用,我们选择使用Google Doc来组织和维护项目进度的最新日志;在这个文档中,我们还包括了对帮助资源、联系信息和将要使用的技术的列表。现在我们已经有了组织项目后勤的平台,我们需要一个组织项目本身的地方:GitHub因其普及和项目规模小而成为另一个易于选择的选择。

Influx-Intern-project

来源:我们用于组织项目任务的Google Doc屏幕截图

黑客马拉松:我的视角

当我们各自忙碌于各自的任务时,我的第一项工作就是熟悉 InfluxDB Python 客户端库,以便能够将股票数据存储到 InfluxDB Cloud 以便进行查询。InfluxDB 在他们的文档部分和云平台的指定 Python 部分提供了易于获取的文档。尽管文档中提供了有用的代码块,但我仍然遇到了一些错误,特别是 SSL 验证错误,这在尝试运行给定代码时不应该发生。我尝试了许多修复方法都没有成功,从咨询非常引人入胜的 InfluxDB 社区到使用 Pip 重新安装 Python 中的 SSL 包;直到我联系了我的导师 Zoe Steinkamp 和 Anais Georgiou,他们迅速帮我找到了一个解决方案。我将我的组织电子邮件地址替换为“org”变量中的用户 ID,这解决了问题。

Complete-example-write-script

来源:InfluxDB Python 客户端库文档

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

由于我们分配任务的方式,我无法在 Neema 完成抓取工具之前使用真实股票数据,因此为了测试目的,我临时创建了自己的 CSV 文件,格式与我们商定的格式一致。我的程序非常简单:在循环遍历每一行之前打开 CSV 文件,从 CSV 中读取每一行,将行分割成一个列表,索引到列表中,并将每个元素放入 InfluxDB 云中相应的字段或标签。在运行真实股票数据的程序后,这就是包含所有股票数据的 bucket 的样子

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

来源:数据探索功能,展示包含相关股票数据的 bucket

挑战

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

我们面临的另一个挑战是,使用 时间序列数据库 进行 机器学习 与传统的学习方式不同,你需要围绕相对时间段构建模型,而不是批量提供 带时间戳的数据。最后,显然,由于处理和发送大量股票数据需要承受的负载和处理时间,创建一种高效的处理和发送大量股票数据的方式在客户端和服务器之间是非常困难的。我们考虑的一个可能解决方案是缓存股票数据,这样我们就不必每次都获取结果,或者动态加载股票而不是批量加载。

成功

尽管我们面临了许多挑战,但我们成功部署并顺利实施了许多概念。

Advanced-Micro-Devices

Yahoo-Finance-and-Web-Scraping-Code

来源:Yahoo Finance 和 Web Scraping 代码

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

scraping-utility

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

来源:生成的模型和如何训练我们的模型的说明

我们的模型在固定的时间间隔运行,它会从我们的云端实例中获取最新的股票数据,预测它一分钟后会如何表现,并决定是买入、卖出还是持有该股票。尽管模型的表现与预期不符——绿色是我们希望看到的样子,而红色虚线是实际的样子——但我们得出结论,这是由于我们没有足够的时间用足够的数据实际训练模型,而不是技术故障。有了更多的时间,我们可以改进模型,使预期与实际情况相匹配。

Web-UI-to-display-stock-data

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

我们的简单Web应用程序用于以仪表板的方式显示股票数据,它连接到我们的InfluxDB云实例。云更新多频繁,网站就会更新。通过Python脚本,网站会从界面理解的JSON格式的桶中下载新数据,并将其附加到网站上正在显示的当前数据。

未来更改

随着项目接近尾声,我们回顾了漫长的一周编码过程。我们确实可以做一些不同的事情并加以改进。首先,我们认为一个全新的、旨在与多种股票、高度变化的数据和带时间戳的数据本机工作的交易模型将更加有效。还可能的是,与Telegraf的更好集成,当有新数据时自动运行我们的模型,比我们当前每30秒运行脚本的自动化方式更有效率。如果我们想将项目扩展到仅仅处理少量股票之外,我们需要考虑负载大小对客户端和服务器的影响。拥有高效的数据存储和检索方式至关重要,当项目规模增加时,大量数据会迅速减慢服务器的速度。我们还会做出的一项重大更改是,除了股票数据外,还提取情感数据,因为它可以导致利润更高的模型,尽管获取难度很大。

结论

总的来说,InfluxDB 2022实习生黑客马拉松是一次丰富而有洞察力的经历。这不仅让我们体验了使用新技术所带来的学习曲线,还让我们回顾了一些很久以前可能不再有用或相关的旧技能,这对于程序员来说总是有益的。在一周的时间内,我们能够构建一个相对完整的程序,它足够灵活,可以用于更大规模的应用,也仅是预示了未来实习生在InfluxDB将构建的内容。