全文链接:https://tecdat.cn/?p=39614 

本文主要探讨了如何利用大语言模型(LLMs)进行股票分析。通过使用提供的股票市场和金融新闻获取数据,结合Python中的相关库,如Pandas、langchain等,实现对股票新闻的情感分析。利用大语言模型构建情感分析模型,通过提示工程等技术优化模型,最终通过可视化展示股票市场的情感倾向,为股票投资决策提供参考。

关键词

大语言模型;股票分析;情感分析;API

一、引言

在当今的股票市场中,及时了解新闻和事件对于做出战略决策至关重要。认识到市场情绪对市场趋势的影响,是相应调整投资策略的关键。首先,我们需要从各种来源获取大量的市场新闻数据。这其中,数据质量(如来源数量、数据更新率等)和使用便捷性是重要的考量因素。
虽然数据在网上易于获取,但对于我们的需求来说,最便捷的方法之一是使用API端点将市场数据和新闻直接集成到代码中。有许多金融数据提供商提供API连接,它们在数据套餐、支持方式和数据质量上各有不同。
在本文中,我们将使用由提供的股票市场和金融新闻API。在我看来,该API在质量和价格之间达到了很好的平衡。该API提供了一个从金融新闻中提取见解的端点,便于进行市场情绪分析。由于其易于使用,用户可以查询和检索新闻文章,动态评估市场的积极或消极基调。
通过展示该API的功能,旨在展示其在情感分析中的无缝集成,使我们能够根据市场情绪做出明智的决策。在快速变化的股票市场环境中,获得这样的资源有助于我们采取更灵活和策略性的投资方法。

二、导入包

首先,我们需要在Python环境中导入所需的包。在本文中,我们将使用三个主要的包:Pandas用于处理数据帧,用于提取数据,langchain用于构建大语言模型。此外,我们还将使用其他辅助包,如config和re。

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

三、API密钥激活

为了使用API的功能,必须注册API密钥。

四、数据提取

我们将通过访问:

response = client.financial\_news(s="AAPL.US", from\_date='2024-01-01', to_date='2024-01-30', limit=100)
data_frame = pd.DataFrame(response) # 将json输出转换为数据帧
data_frame.tail()

下面解释一下API中的参数:

  • s:字符串类型。如果未设置参数t,则此参数为必填项。表示要获取新闻的股票代码。
  • t:字符串类型。如果未设置参数s,则此参数为必填项。表示获取特定主题新闻的标签。可以
  • api_token:字符串类型。必填项。访问API的令牌,注册后可获得。
  • fromto:格式为YYYY-MM-DD。如果需要2021年3月1日至2021年3月10日的数据,则应使用from=2021-03-01to=2021-03-10
  • limit:数字类型。可选参数。表示查询应返回的结果数量。默认值为50,最小值为1,最大值为1000。
  • offset:数字类型。可选参数。表示数据的偏移量。默认值为0,最小值为0。例如,要从第200个开始获取100个符号,应使用limit=100offset=200
    数据如下所示:
    AAPL news data extracted using EODHD API
    输出数据包含以下字段:
  • date:文章的日期和时间。
  • title:文章的标题。
  • content:文章的全文。
  • link:文章来源的链接。
  • symbols:文章中提到的股票代码数组。

五、数据清洗

现在获取到的数据并不干净,包含许多换行符和不同的命令。因此,我们需要对其进行清洗:

# 清洗文本数据的函数
def clean\_textual\_data(text):
 clean_text = re.sub(r'\\s+','', text)
 return clean_text.strip()
# 将清洗函数应用到整个列
data\_frame\['content'\] = data\_frame\['content'\].apply(clean\_textual\_data)

现在我们已经将清洗函数应用到所有数据,可以继续构建我们的聊天机器人(这里指后续基于这些数据进行的分析流程类似聊天机器人调用数据的过程)。

六、大语言模型(LLM)

现在我们将使用Langchain与OpenAI模型形成一个大语言模型链。

language_model = ChatOpenAI(model="gpt-3.5-turbo",
 openai\_api\_key='YOUR OPENAI API KEY', 
temperature=0)

这段代码片段通过实例化gpt-3.5-turbo并将温度设置为0来初始化语言模型。选择温度为0可确保模型的确定性,防止其偏离主题,并保持专注和一致的生成结果。
现在,我们将使用不同的技术使其更精确地适用于我们的下游任务,即情感分析。有很多不同的方法可以实现:

6.1 提示工程

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

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

6.2 微调

微调是一个有用的过程,它允许用户针对特定任务定制预训练的语言模型(LLMs)。通过在包含特定任务数据的小数据集上对模型进行微调,可以在保持其整体语言理解能力的同时,提高其在该特定任务上的性能。
主要的两种微调方法如下:

  • 全指令微调:全指令微调是一种用于使大语言模型(LLMs)适应特定任务的技术。该过程涉及使用特定任务的数据调整大语言模型的所有参数。这种调整使模型能够在特定任务上更有效地执行,可能会导致性能提升。之所以需要全指令微调,是因为即使是最强大的预训练大语言模型也可能无法直接满足特定需求。例如,一个应用程序可能需要独特的结构或风格,或者预训练的大语言模型可能缺乏对该应用程序至关重要的特定文档的知识。此外,某些领域、行业甚至特定企业通常具有在一般预训练数据中未显著体现的独特术语、概念和结构。因此,全指令微调是使大语言模型适应更特定用例的有价值方法。
  • 参数高效微调:参数高效微调(PEFT)是一种用于使大型预训练模型适应各种下游应用而无需微调模型所有参数的技术。这是因为微调所有参数的成本可能过高。相反,PEFT方法仅微调少量(额外的)模型参数。这显著降低了计算和存储成本,同时产生与完全微调模型相当的性能。PEFT解决了诸如在消费级硬件上进行全量微调不可行、为每个下游任务独立存储和部署微调模型成本高昂等问题。它还克服了在大语言模型(LLMs)全量微调期间观察到的灾难性遗忘问题。
    在本文中,我们将利用提示工程技术,利用Langchain模板功能,构建一个优化的提示,用于在股票市场中进行情感分析。目标是创建一个提示,不仅提供情感分析,还能为模型的推断提供解释。
template = """
从新闻文章中识别对苹果(AAPL)股票的情绪,情绪评分范围为-10到+10,其中-10表示最负面,+10表示最正面,0表示中性。
同时给出你的答案的合理解释,以及它将如何影响不同股票的价格。
文章:{statement}
"""
# 使用Langchain PromptTemplate功能形成提示
prompt = PromptTemplate(template=template, input_variables=\["statement"\])
llm\_chain = LLMChain(prompt=prompt, llm=language\_model)

现在我们已经建立了大语言模型链,下面给出一个推理示例。

6.3 运行大语言模型链

输出如下所示:
AAPL sentiment prediction by the model

七、分析

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

# 计算令牌数量的函数
def count\_token\_numbers(text):
 tokens = text.split()
 return len(tokens)

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

template_2 = """
从新闻文章中识别对苹果(AAPL)股票的情绪,评分范围为-10到+10,其中-10表示最负面,+10表示最正面,0表示中性。
仅用一个单词回答,且该单词应为分数。
文章:{statement}
"""
# 使用Langchain PromptTemplate功能形成提示
prompt\_2 = PromptTemplate(template=template\_2, input_variables=\["statement"\])

让我们形成新的大语言模型链:

下面展示一个推理:

print(new\_data\_frame\['content'\]\[2\])
print('')
print('新闻情绪:', llm\_chain\_2.run(new\_data\_frame\['content'\]\[2\]))

结果如图:
Updated model’s sentiment prediction
很好,我们现在能够得到简洁的输出。现在,我们将创建一个for循环,遍历数据并获取每条新闻的情绪:

results = \[\]
for i in range(0, new\_data\_frame.shape\[0\]):
 results.append(llm\_chain\_2.run(new\_data\_frame\['content'\]\[i\]))

八、可视化

现在让我们绘制一些饼图,以查看AAPL股票的市场情绪:

import matplotlib.pyplot as plt
data = pd.DataFrame(results) # 转换为数据帧
col_name = 0 # 这是我的列名,你应根据你的数据进行更改
counts = data\[col\_name\].value\_counts()
# 绘制饼图
plt.pie(counts, labels=counts.index, autopct='%1.1f%%', startangle=140)
plt.title(f'饼图')
plt.axis('equal') # 等比例确保饼图绘制为圆形
# 显示饼图
plt.show()

结果如图:

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

8.1 删除中性值

value\_to\_delete = '0'
# 删除列中出现指定值的所有行
new\_data = data\[data\[0\]!= value\_to_delete\]

8.2 可视化新数据

counts = new\_data\[col\_name\].value_counts()
# 绘制饼图
plt.pie(counts, labels=counts.index, autopct='%1.1f%%', startangle=140)
plt.title(f'饼图')
plt.axis('equal') # 等比例确保饼图绘制为圆形
# 显示饼图
plt.show()

结果如图:

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

九、结论

在本研究中,我们使用了API收集股票市场新闻文章,并利用OpenAI的情感分析模型评估这些文章中传达的情绪。


拓端tecdat
198 声望51 粉丝