python股票预测 (利用openai炒股)

利用openai炒股,用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 API 密钥。如果您没有 EODHD API 密钥,请首先访问他们的网站,然后完成注册过程以创建 EODHD 帐户,最后导航到“设置”页面,您可以在其中找到您的秘密 EODHD API 密钥。请务必确保此 API 密钥不会泄露给任何人。您可以通过以下代码激活 API 密钥:

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

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

请注意,您需要将 <YOUR API KEY> 替换为您的 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. 限制 :数量。选修的。结果数应随查询一起返回。默认值:50,最小值:1,最大值:1000。
  6. 偏移量 :数字。选修的。数据的偏移量。默认值:0,最小值:0。例如,要获取从 200 个符号开始的 100 个符号,您应该使用 limit=100 和 offset=200。

数据如下所示:

利用openai炒股,用openai做期货

输出数据有以下字段:

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

清理数据

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

#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)

现在我们已将其应用于所有数据,我们可以继续使用我们的聊天机器人。

法学硕士

现在我们将使用Langchain与OpenAI模型形成LLM链。

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

注意:您应该将 您的 OPENAI API 密钥 替换为您自己的 OpenAI API 密钥,以便代码顺利运行而不会出现任何错误。

此代码片段通过实例化温度为 0 的 GPT-2.5-turbo 来初始化语言模型 (LM)。温度 0 的选择确保了模型中的确定性,防止模型偏离轨道并保持专注且一致的生成。

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

1) 及时工程:

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

以下是一些常用的快速工程技术:

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

2)微调

微调是一个有用的过程,可让用户针对特定任务定制预训练的语言模型 (LLM)。通过在包含特定于任务的数据的小数据集上微调模型,您可以增强其针对特定任务的性能,同时保持其整体语言理解完整。

两种主要的Fine-tuning方法如下:

  1. 全指令微调 :全指令微调是一种用于使大型语言模型(LLM)适应特定任务的技术。该过程涉及使用特定于任务的数据调整法学硕士的所有参数。这种适应使模型能够更有效地执行特定任务,从而有可能提高性能。需要进行全面的指令微调,因为即使是最强大的预训练法学硕士也可能并不总能立即满足特定需求。例如,申请可能需要独特的结构或风格,或者经过预先培训的法学硕士可能缺乏对申请至关重要的特定文件的了解。此外,某些领域、行业甚至特定企业通常具有独特的术语、概念和结构,这些术语、概念和结构在一般预训练数据中没有突出体现。因此,完整的指令微调是根据更具体的用例定制法学硕士的一种有价值的方法。
  2. 参数高效微调: 参数高效微调(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 情绪预测(作者图片)

分析

现在来分析 AAPL(苹果)股票的市场状况,让我们分析 100 篇文章并得出一些结论。

因此,首先,我们必须确保不会超出模型的代币限制,对我来说是 4097。因此我们将过滤掉 token 数量 < 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)

根据 TokenCount 过滤数据帧:

# 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]))

利用openai炒股,用openai做期货

太好了,我们现在可以获得简洁的输出。现在,我们将创建一个 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()

AAPL 市场情绪(作者图片)

饼图表明大量文章是中立的。然而,为了确保准确性,我们应该过滤数据并专注于仅分析非中性信息。

删除中性值:

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()

AAPL 市场情绪,不包括中性价值(作者图片)

观察趋势,+5和+7的组合贡献了近40%的数据。考虑到+10、+8和+3等附加值,正面文章的累计百分比上升至52.5%。这种模式表明了普遍的乐观情绪,意味着最近的文章对苹果公司的看法良好。所确定的积极前景可能会对塑造苹果市场表现的整体情绪产生潜在影响。

结论

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

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

这种整体方法使我们能够根据新闻中表达的情绪提取对市场趋势的有意义的见解。话虽如此,您已经到达了本文的结尾。希望您今天学到了一些新的有用的东西。非常感谢您的宝贵时间。