Skip to content

利用 OpenAI 和 Python 预测股市行情

作者:老余捞鱼

原创不易,转载请标明出处及原作者。

写在前面的话:本文介绍了如何利用 OpenAI 和 Python 进行股市情绪预测。主要通过使用 EODHD 提供的股市和金融新闻 API 来提取新闻数据,并利用 LangChain 和 OpenAI 的大型语言模型进行情感分析。

一、综述

在当今的股票市场上,随时了解新闻和事件对于做出战略决策至关重要。认识情绪对市场趋势的影响对于相应地调整战略至关重要。这一过程始于通过各种渠道获取大量市场新闻。其中最重要的是对数据质量(如来源数量、数据更新率等)和易用性的要求。

虽然数据可以在网上获得,而且很容易访问,但满足我们需求的最方便的方法之一是使用 API 端点,将市场数据和新闻直接集成到我们的代码中。提供 API 连接的金融数据提供商有很多,它们提供的数据包、支持方式和数据质量各不相同。

在本文中,我们将使用一家名为 EODHD 的市场数据提供商提供的股票市场和金融新闻 API。该 API 提供了一个从财经新闻中提取见解的端点,便于分析市场情绪。由于使用方便,用户可以查询和检索新闻文章,对市场的正面或负面情绪进行动态评估。

通过展示应用程序接口(API)的功能,我的目标是证明其与情绪分析的无缝整合,使我们能够根据当前的市场情绪做出明智的决策。在快节奏的股市环境中,有了这样一种资源,就能确保投资方法更具适应性和战略性。


二、导入软件包

首先,让我们将所需的软件包导入 Python 环境。我们将在本文中使用三个包,分别是用于处理数据帧的 pandas、用于提取数据的 eodhd 和用于构建 LLM 模型的 langchain。除此之外,我们还将使用 config 和 re 等其他辅助软件包:

!pip install openai
!pip install langchain
!pip install eodhd
!pip install config

import re
import requests
import pandas as pd
import config as cfg
from eodhd import APIClient
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain.chat_models import ChatOpenAI

在导入之前,确保使用命令行安装软件包。现在,我们已经将所有需要的软件包导入了 Python 环境,可以进行下一步,即激活 API 密钥。


三、激活 API 密钥

请首先访问其网站,然后完成注册过程以创建 EODHD 账户,最后导航到 “设置 “页面,在那里您可以找到您的 EODHD API 密钥。重要的是要确保这个秘密 API 密钥不会泄露给任何人。您可以按照以下代码激活 API 密钥:

api_key = '<YOUR API KEY>'
api = APIClient(api_key)


代码非常简单。在第一行,我们将 EODHD API 密钥存储到 api_key,然后在第二行,我们使用 eodhd 软件包提供的 APIClient 类激活 API 密钥,并将响应存储到客户端变量中。

请注意,您需要将 替换为您的 EODHD API 密钥。除了直接用文本存储 API 密钥外,还有其他方法可以提高安全性,例如利用环境变量等。


四、提取数据

我们将通过访问 EODHD 提供的 Python 库来使用股票市场和金融新闻 API,具体如下:

resp = api.financial_news(s = "AAPL.US", from_date = '2024-01-01', to_date = '2024-01-30', limit = 100)
df = pd.DataFrame(resp) # converting the json output into datframe
df.tail()

让我来解释一下 API 中的参数:

  1. s:字符串。如果未设置参数 “t”,则为必填项。要获取新闻的股票代码。
  2. t:字符串。如果未设置参数’s’,则为必填项。用于获取给定主题新闻的标签。您可以在此页面找到提供的主题列表: https://eodhd.com/financial-apis/stock-market-financial-news-api/
  3. api_token:字符串。必填。访问 API 的 api_token。注册后即可获得。
  4. from 和 to:格式为 “YYYY-MM-DD”。如果需要 2021 年 3 月 1 日至 2021 年 3 月 10 日的数据,则应使用 from=2021-03-01 和 to=2021-03-10。
  5. limit: 数目。可选。查询返回结果的数量。默认值:50,最小值:1,最大值:1000。
  6. 偏移:数字。可选。数据的偏移量。默认值:0,最小值:0。 例如,要从 200 开始获取 100 个符号,应使用 limit=100 和 offset=200。

数据看起来是这样的:

输出数据包含以下字段:

  • 日期:文章的日期和时间采用ISO 8601 格式。
  • 标题:文章的标题。
  • 内容:文章的全文。
  • 链接:指向信息源的链接。
  • 符号:文章中提到了一系列股票代码。


五、清理数据

现在这些数据不干净,包含大量换行符和不同的命令。因此,我们要对它们进行清理:

#funtion to clean the textual data
def clean_text(text):
    cleaned_text = re.sub(r'\s+', ' ', text)
    return cleaned_text.strip()

# Apply the replacement function to the entire column
df['content'] = df['content'].apply(clean_text)

现在我们已将它应用到所有数据中,可以继续开发聊天机器人了。

六、LLMs

现在,我们将使用 Langchain 与 OpenAI 模型组成一个 LLM 链。

llm = ChatOpenAI(model = "gpt-3.5-turbo",
                 openai_api_key = 'YOUR OPENAI API KEY', 
                 temperature = 0)

注意:您应该用自己的 OpenAI API 密钥,以便代码顺利运行。

该代码片段通过实例化温度为 0 的 GPT-2.5-turbo 来初始化语言模型 (LM)。选择温度为 0 可确保我们的模型具有确定性,防止其偏离轨道,并保持生成的集中性和一致性。

现在,我们将使用不同的技术使其精确地用于我们的下游任务,即情感分析。有很多不同的方法可以做到这一点:

1) 迅速开展工程:

提示工程是一个不断发展的领域,它涉及设计和优化提示,以最大限度地提高 GPT 等大型语言模型的性能。随着这些模型的发展,我们提示它们的方式也变得越来越重要。最近的研究表明,精心设计的提示可以显著提高可靠性,并使模型能够处理比以前认为更复杂的任务。

以下是一些常用的及时工程技术:

  1. Zero-shot prompting: 这种方法能让大型语言模型(LLM)在没有实例或不了解任务的情况下处理新任务。它是通过一种称为 “提示 “的技术来实现的,只需向 LLM 提供所需的任务的自然语言描述即可。
  2. Few-shot prompting: 虽然大型语言模型展示了出色的 “零镜头 “能力,但在使用 “零镜头 “设置时,它们在更复杂的任务上仍有不足。少量提示可以作为一种实现情境学习的技术,我们可以在提示中提供示范,引导模型获得更好的性能。这些示范可以作为后续示例的条件,在这些示例中,我们希望模型能够生成响应。
  3. Chain of Thought Prompting: 是人工智能系统简化复杂任务的一种有用技术,它将任务分解为易于管理的步骤。这种方法不是一次性解决一个具有挑战性的问题,而是通过将解决方案分解成一系列较小的渐进步骤来解释推理过程。首先要明确定义最终目标,然后考虑实现该目标所需的逻辑前提和子任务。

2) 微调

微调是一个非常有用的过程,可让用户针对特定任务定制预训练语言模型(LLM)。通过在包含特定任务数据的小型数据集上对模型进行微调,您可以提高其在特定任务中的性能,同时保持其整体语言理解能力不变。

两种主要的微调方法如下:

  1. Full instruction fine-tuning: 全指令微调:全指令微调是一种用于调整大型语言模型(LLM)以适应特定任务的技术。这一过程包括利用特定任务数据调整大型语言模型的所有参数。这种调整可使模型更有效地完成特定任务,从而提高性能。之所以需要进行全面的指令微调,是因为即使是功能最强大的预训练 LLM,也不一定能满足开箱即用的特定需求。例如,应用程序可能需要独特的结构或风格,或者预先训练的 LLM 可能缺乏对应用程序至关重要的特定文档的知识。此外,某些领域、行业甚至特定企业往往有独特的术语、概念和结构,而这些在一般的预训练数据中并不突出。因此,全指令微调是一种有价值的方法,可根据更具体的使用案例对 LLM 进行定制。
  2. Parameter-efficient fine-tuning: 参数效率微调:参数效率微调(PEFT)是一种用于调整大型预训练模型以适应各种下游应用的技术,无需对模型的所有参数进行微调。这是因为微调所有参数的成本过高。相反,PEFT 方法只对少量(额外的)模型参数进行微调。这大大降低了计算和存储成本,同时获得了与完全微调模型相当的性能。PEFT 解决了在消费级硬件上进行完全微调的不可行性,以及为每个下游任务独立存储和部署微调模型的高成本等问题。它还克服了灾难性遗忘问题,这是在对大型语言模型(LLM)进行全面微调时观察到的一种行为。

在本例中,我们将利用提示工程技术,利用 Langchain 模板功能,构建一个优化的提示,用于对股票市场进行情感分析。我们的目标是创建一个不仅能提供情绪分析,还能为模型推论提供解释的提示。

template = """
Identify the sentiment towards the Apple(AAPL) stocks from the news article , where the sentiment score should be from -10 to +10 where -10 being the most negative and +10 being the most positve , and 0 being neutral

Also give the proper explanation for your answers and how would it effect the prices of different stocks

Article : {statement}
"""

#forming prompt using Langchain PromptTemplate functionality
prompt = PromptTemplate(template = template, input_variables = ["statement"])
llm_chain = LLMChain(prompt = prompt, llm = llm)

既然我们已经建立了 LLM 链,那就让我举一个推理的例子。

运行 LLM 链 :

print(llm_chain.run(df['content'][13]))

输出结果如下:



七、股票分析

现在,为了分析 AAPL(苹果)股票的市场状况,让我们来分析 100 篇文章并得出一些结论。因此,首先,我们必须确保不超过我们模型的标记限制,对我来说是 4097。因此,我们将过滤掉标记数小于 3500 的文章:

#A function to count the number of tokens
def count_tokens(text):
    tokens = text.split()  
    return len(tokens)

计算数据帧中所有行的次数:

# Applying the tokenization function to the DataFrame column
df['TokenCount'] = df['content'].apply(count_tokens)

根据令牌计数过滤数据帧:

# Define a token count threshold (for example, keep rows with more than 2 tokens)
token_count_threshold = 3500

# Create a new DataFrame by filtering based on the token count
new_df = df[df['TokenCount'] < token_count_threshold]

# Drop the 'TokenCount' column from the new DataFrame if you don't need it
new_df = new_df.drop('TokenCount', axis = 1)

# Resetting the index
new_df = new_df.reset_index(drop = True)

现在,我将改变我的提示模板,以便获得简洁的输出:

template_2 = """
Identify the sentiment towards the Apple(AAPL) stocks of the news article from -10 to +10 where -10 being the most negative and +10 being the most positve , and 0 being neutral

GIVE ANSWER IN ONLY ONE WORD AND THAT SHOULD BE THE SCORE

Article : {statement}
"""

#forming prompt using Langchain PromptTemplate functionality
prompt_2 = PromptTemplate(template = template_2, input_variables = ["statement"])

让我们组成新的 LLM 链:

llm_chain_2 = LLMChain(prompt = prompt_2, llm = llm)

在这里演示一个推论:

print(new_df['content'][2])
print('')
print('News sentiment: ', llm_chain_2.run(new_df['content'][2]))

现在可以得到一个简洁的输出。我们要创建一个 for 循环,遍历数据并获取每条新闻的情感:

x = []
for i in range(0,new_df.shape[0]):
    x.append(llm_chain_2.run(new_df['content'][i]))

八、可视化

通过饼图来了解 AAPL 股票的市场情绪:

import matplotlib.pyplot as plt

dt = pd.DataFrame(x) #Converting into Dataframe
column_name = 0 # this is my column name you should change it according to your data
value_counts = dt[column_name].value_counts()

# Plotting the pie chart
plt.pie(value_counts, labels = value_counts.index, autopct = '%1.1f%%', startangle = 140)
plt.title(f'Pie Chart')
plt.axis('equal')  # Equal aspect ratio ensures that the pie is drawn as a circle.

# Show the pie chart
plt.show()

饼状图表明,相当多的文章是中立的。但是,为了确保准确性,我们应该对数据进行过滤,只重点分析非中立信息。

删除中性值:

value_to_remove = '0'
# Remove all rows where the specified value occurs in the column
dt_new = dt[dt[0] != value_to_remove]

将新数据可视化:

value_counts = dt_new[column_name].value_counts()

# Plotting the pie chart
plt.pie(value_counts, labels = value_counts.index, autopct = '%1.1f%%', startangle = 140)
plt.title(f'Pie Chart')
plt.axis('equal')  # Equal aspect ratio ensures that the pie is drawn as a circle.

# Show the pie chart
plt.show()

从趋势上看,+5 和 +7 的组合占了近 40% 的数据。再加上 +10、+8 和 +3,正面文章的累计百分比上升到 52.5%。这种模式表明了一种普遍的乐观情绪,意味着在最近的文章中,人们对苹果公司有好感。这种积极的前景可能会对苹果公司市场表现的整体情绪产生潜在影响。

九、结论

在研究中,我们利用 EODHD 提供的股市财经新闻 API 收集股市新闻文章,并利用 OpenAI 的情感分析模型评估这些文章所传达的情感。

为了确保我们的数据与 OpenAI 模型无缝兼容,我们使用了语言处理工具 LangChain。为了完善 OpenAI 模型的输入并提高情感分析的准确性,我们采用了提示工程技术。我们对 100 篇文章进行了情感分析,以衡量当前围绕 APPL 股票的市场情绪。

  1. 股市情绪分析是做出投资策略决策的关键因素之一,新闻情绪的监测和分析可以帮助投资者调整策略以应对市场趋势。
  2. API 集成是一种高效的方法,可以直接在分析代码中获取和使用市场数据和新闻。
  3. EODHD 的股市和金融新闻 API 提供了高质量的数据服务,适合进行市场情绪分析。
  4. 使用 LangChain 和 OpenAI 的大型语言模型可以实现高效的自然语言处理和情感分析。
  5. 通过提示工程和链式推理技术,可以优化模型的输出,提高情感分析的准确性。
  6. 结合数据可视化技术,如制作饼图,可以直观地展示市场情绪,帮助投资者快速把握市场趋势。
  7. 通过对 AAPL 股票新闻情绪的分析,文章得出了一个积极的市场情绪趋势,这可能对苹果公司的市场表现产生积极影响。

这种综合方法使我们能够根据新闻中表达的情绪,对市场趋势提出有意义的见解。说了这么多,文章到此结束。希望您今天能学到一些有用的新知识。非常感谢您抽出宝贵的时间。


文内容仅仅是技术探讨和学习,并不构成任何投资建议。

转发请注明原作者和出处。

Published inAI&Invest专栏

Be First to Comment

    发表回复