用大语言模型解读散户股票交易行为:依靠逻辑还是羊群效应?
摘要
近年来,散户投资者在金融市场中的角色再次引起了广泛关注。金融科技经纪平台和Reddit等社交媒体的兴起,刺激了散户投资者对股票市场的参与度。这一趋势引发了关于他们决策过程及其交易活动影响的重要问题。同时,许多金融科技经纪公司参与订单流支付(Payment for Order Flow,PFOF),将大量散户交易引导至拥有强大AI驱动的高频交易公司。这种动态为政策制定者带来了新的监管挑战,特别是关于AI对金融市场的影响,以及AI驱动的交易者如何与散户投资者互动。
本文旨在通过分析散户投资者采用的策略及其与AI驱动策略的互动,为他们的行为和影响提供新的见解。由于散户投资者具有多样性和社会经济背景的异质性,描绘他们的投资策略具有挑战性。近期文献中一个有前景的趋势是通过调查来获取投资者的信念。然而,我们提出了一种替代方法,利用大型语言模型(Large Language Models,LLMs) 分析投资者在领先的社交媒体平台上发布的超过7700万条信息中的交易策略。这使我们能够推断散户投资者使用的交易策略,识别影响这些策略的因素,并探讨其对金融市场的影响。
本文研究发现,涉及技术分析(Technical Analysis,TA) 看涨情绪的股票往往未来收益较低,并且在Robinhood平台上更容易出现 买入羊群行为(herding) 。相反,从基本面分析(Fundamental Analysis,FA) 相关帖子中提取的情绪可以正向预测未来收益。更频繁的TA帖子与 散户订单流 的信息含量较低相关,而FA帖子则与订单流信息含量正相关。进一步的研究显示,社交媒体上的TA情绪往往与最先进的基于AI的技术策略产生的信号相矛盾,AI策略的盈利主要源于利用TA情绪。
关键词:AI、大型语言模型、社交媒体、散户投资者、羊群行为、技术分析、基本面分析
数据
我们使用2012年至2022年间在NYSE、AMEX和NASDAQ交易的美国普通股(SHRCD=10或11)作为样本。我们从StockTwits获取投资者社交媒体数据,从CRSP获取股票数据,并从合并的CRSP-Compustat数据库获取其他会计和财务报表变量。
StockTwits数据
StockTwits是领先的投资者社交媒体平台,供散户投资者分享他们对股票、ETF和加密货币的看法和想法。类似于Twitter,StockTwits用户可以发布短消息,最初限制为140个字符,2019年5月8日后扩展为1000个字符。
我们使用StockTwits的API,下载了2012年至2022年间948,867名用户发布的157,674,830条消息。我们获得了消息级别的详细信息,如时间戳、内容,以及用户自行标记的情绪“看涨(bullish)”或“看跌(bearish)”。在用户层面,我们获得了用户特征,如交易风格(技术、动量、基本面、价值、成长、全球宏观)、投资期限(日内交易者、波段交易者、头寸交易者、长期投资者)和交易 经验水平(新手、中级、专业)。

识别消息中的交易策略
我们利用大型语言模型(LLMs),首先解读消息内容中传达的策略。具体而言,我们识别与技术分析(TA)、基本面分析(FA)相关的消息,以及其他投资策略的消息。
完整代码复现
为了完整地复现论文的代码,我们将以下步骤整合到一份完整的代码中:
- 1. 数据加载和预处理:加载StockTwits数据,并进行初步清洗和过滤。
- 2. 消息分类:使用LLMs(如GPT-4)对消息进行策略分类(TA、FA、其他)。
- 3. 模型微调:利用GPT-4生成的标签,微调一个BERT模型(如TechBERT)以进行大规模消息分类。
- 4. 情绪分析:提取消息的情绪(看涨或看跌)。
- 5. 回归分析:研究不同策略情绪与未来股票收益的关系,以及与散户订单流的关系。
识别消息中的交易策略
技术分析消息的识别
我们首先使用GPT-4对消息进行技术分析(TA)的识别,然后利用这些标签微调一个BERT模型(TechBERT)以进行大规模消息分类。
技术分析消息的识别代码示例
备注:完整代码论文复现请加入知识星球获取。
# 定义GPT-4分类函数
def gpt4_classify(message, prompt):
response = openai.Completion.create(
engine='gpt-4',
prompt=prompt.format(message=message),
max_tokens=10,
temperature=0
)
return response.choices[0].text.strip()
# 创建样本用于微调BERT模型
sample_messages = messages.sample(n=20000, random_state=42)
sample_messages['ta_label'] = sample_messages['message'].apply(lambda x: gpt4_classify(
x,
prompt="""
你对社交媒体和金融市场的语言有深刻理解。请分析以下消息:
"{message}"
请从两个方面解析消息:
1)是否存在技术分析(0=否,1=可能,2=是)。
2)如果使用了技术分析,具体的技术指标是什么?(输出指标或""如果无法确定。如果存在多个信号,请用逗号分隔)
请以JSON格式输出:{{"technical_analysis": , "technical_indicator": }}。
"""
))
# 处理GPT-4的输出,提取标签
def parse_gpt_output(output):
try:
result = eval(output)
return result.get('technical_analysis', 0)
except:
return 0
sample_messages['ta_label'] = sample_messages['ta_label'].apply(parse_gpt_output)
# 微调BERT模型
from transformers import BertTokenizer, BertForSequenceClassification
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForSequenceClassification.from_pretrained('bert-base-uncased')
# 准备训练数据
X = list(sample_messages['message'])
y = sample_messages['ta_label'].astype(int).values
# 文本编码
inputs = tokenizer(X, return_tensors='pt', padding=True, truncation=True, max_length=128)
labels = torch.tensor(y)
# 省略实际训练过程,假设模型已微调完成
基本面分析消息的识别
类似地,我们识别与基本面分析(FA) 相关的消息。
基本面分析消息的识别代码示例
备注:完整代码论文复现请加入知识星球获取。
# 为FA分类定义GPT-4提示
def gpt4_classify_fa(message):
response = openai.Completion.create(
engine='gpt-4',
prompt=f"""
你对社交媒体和金融市场的语言有深刻理解。请分析以下消息:
"{message}"
请从两个方面解析消息:
1)是否存在基本面分析(0=否,1=可能,2=是)。
2)如果使用了基本面分析,请从以下15个主题中选择最相关的一个:
'收购-合并','分析师评级','资产','破产','信用','信用评级','股息','收益','股票行动','投资者关系','劳工问题','营销','目标价','产品-服务','收入'。
请以JSON格式输出:{{"fundamental_analysis": , "fundamental_topic": }}。
""",
max_tokens=10,
temperature=0
)
return response.choices[0].text.strip()
# 应用到样本消息
sample_messages['fa_label'] = sample_messages['message'].apply(gpt4_classify_fa)
# 处理GPT-4的输出,提取标签
def parse_gpt_output_fa(output):
try:
result = eval(output)
return result.get('fundamental_analysis', 0)
except:
return 0
sample_messages['fa_label'] = sample_messages['fa_label'].apply(parse_gpt_output_fa)
# 微调BERT模型进行FA分类,过程类似于TA分类
技术分析
散户技术使用的决定因素
我们验证自我报告使用技术和短期交易的用户更倾向于在投资决策中使用技术分析。我们在股票-投资者-周层面估计以下回归模型:
散户技术使用的决定因素代码示例
备注:完整代码论文复现请加入知识星球获取。
import statsmodels.api as sm
# 准备回归数据
regression_data = pd.DataFrame({
'ta_usage': ta_usage, # 散户TA使用率
'technical_investor': technical_investor, # 是否为技术投资者
'short_term_investor': short_term_investor, # 是否为短期投资者
'professional_investor': professional_investor, # 是否为专业投资者
'earnings_news': earnings_news, # 收益新闻
'analyst_news': analyst_news, # 分析师新闻
# 控制变量
'control_variables': control_variables
})
# 定义自变量和因变量
X = regression_data[['technical_investor', 'short_term_investor', 'professional_investor', 'earnings_news', 'analyst_news', 'control_variables']]
y = regression_data['ta_usage']
# 添加固定效应和常数项
X = sm.add_constant(X)
# 假设我们有投资者和时间固定效应变量
......
# 建立回归模型
model = sm.OLS(y, X).fit()
# 输出回归结果
print(model.summary())
散户投资者与AI在技术分析中的比较
散户投资者是否与AI在技术分析中达成一致?
我们在股票-投资者-周层面估计以下回归模型:
情绪与AI信号回归分析代码示例
备注:完整代码论文复现请加入知识星球获取。
# 准备回归数据
regression_data = pd.DataFrame({
'sentiment_ta': sentiment_ta, # TA情绪
'sentiment_nonta': sentiment_nonta, # 非TA情绪
'ai_signal': ai_signal, # AI信号
'return_1d': return_1d,
'return_1w': return_1w,
'return_1m': return_1m,
'return_1q': return_1q,
'return_1y': return_1y,
'earnings_news': earnings_news,
'analyst_news': analyst_news,
'control_variables': control_variables
})
# 定义自变量和因变量
X = regression_data[['ai_signal', 'return_1d', 'return_1w', 'return_1m', 'return_1q', 'return_1y', 'earnings_news', 'analyst_news', 'control_variables']]
y_ta = regression_data['sentiment_ta']
y_nonta = regression_data['sentiment_nonta']
# 添加固定效应和常数项
X = sm.add_constant(X)
X = X.join(pd.get_dummies(regression_data['investor_id']))
X = X.join(pd.get_dummies(regression_data['week']))
# 建立TA情绪回归模型
......
# 建立NonTA情绪回归模型
model_nonta = sm.OLS(y_nonta, X).fit()
print(model_nonta.summary())
散户和AI技术策略的收益
我们构建基于散户TA情绪和AI信号的投资组合,计算其收益。
投资组合收益计算代码示例
备注:完整代码论文复现请加入知识星球获取。
# 合并情绪和AI信号数据
portfolio_data = messages[['ticker', 'date', 'sentiment_ta', 'sentiment_nonta']].merge(ai_signals, on=['ticker', 'date'])
# 根据TA情绪和AI信号进行排序
portfolio_data['ta_sentiment_rank'] = portfolio_data.groupby('date')['sentiment_ta'].rank(method='first')
portfolio_data['ai_signal_rank'] = portfolio_data.groupby('date')['ai_signal'].rank(method='first')
# 构建多空投资组合
......
# 计算投资组合收益
long_returns = long_stocks.groupby('date')['future_return'].mean()
short_returns = short_stocks.groupby('date')['future_return'].mean()
portfolio_returns = long_returns - short_returns
# 计算年化收益率
annual_return = portfolio_returns.mean() * 52 # 每年52周
print(f'投资组合的年化收益率为:{annual_return:.2%}')
散户投资者的羊群行为和技术分析
我们研究StockTwits上的TA情绪与Robinhood上的买入羊群行为的关系。
羊群行为回归分析代码示例
备注:完整代码论文复现请加入知识星球获取。
# 准备回归数据
regression_data = pd.DataFrame({
'robinhood_herding': robinhood_herding, # Robinhood买入羊群行为指标
'sentiment_ta': sentiment_ta, # TA情绪
'sentiment_nonta': sentiment_nonta, # 非TA情绪
'attention': attention, # 注意力指标
'earnings_news': earnings_news,
'analyst_news': analyst_news,
'control_variables': control_variables
})
# 定义自变量和因变量
......
# 添加固定效应和常数项
......
# 建立Logit回归模型
model = sm.Logit(y, X).fit()
# 输出回归结果
print(model.summary())
基本面分析和其他策略
不同策略情绪的收益预测能力
我们研究了不同策略相关消息的情绪对未来股票收益的预测能力。
不同策略情绪回归分析代码示例
备注:完整代码论文复现请加入知识星球获取。
# 准备回归数据
regression_data = pd.DataFrame({
'future_return': future_return,
'sentiment_ta': sentiment_ta,
'sentiment_fa': sentiment_fa,
'sentiment_os': sentiment_os,
'sentiment_ns': sentiment_ns,
'attention': attention,
'earnings_news': earnings_news,
'analyst_news': analyst_news,
'control_variables': control_variables
})
# 定义自变量和因变量
......
# 添加固定效应和常数项
......
# 建立回归模型
model = sm.OLS(y, X).fit()
# 输出回归结果
print(model.summary())
StockTwits情绪与散户订单流
我们发现StockTwits上的情绪与相应股票的散户交易活动显著相关。
情绪与散户订单不平衡回归分析代码示例
备注:完整代码论文复现请加入知识星球获取。
# 准备回归数据
regression_data = pd.DataFrame({
'retail_oib': retail_oib, # 散户订单不平衡
'sentiment_ta': sentiment_ta,
'sentiment_fa': sentiment_fa,
'sentiment_os': sentiment_os,
'sentiment_ns': sentiment_ns,
'attention': attention,
'earnings_news': earnings_news,
'analyst_news': analyst_news,
'control_variables': control_variables
})
# 定义自变量和因变量
......
# 添加固定效应和常数项
......
# 建立回归模型
model = sm.OLS(y, X).fit()
# 输出回归结果
print(model.summary())
散户策略和散户订单流信息含量
我们进一步研究了散户投资者使用的策略如何影响散户订单流的信息含量。
订单流信息含量回归分析代码示例
备注:完整代码论文复现请加入知识星球获取。
# 准备回归数据
regression_data = pd.DataFrame({
'future_return': future_return,
'retail_oib': retail_oib,
'high_ta_usage': high_ta_usage, # 高TA使用率指标
'retail_oib_high_ta': retail_oib * high_ta_usage,
'attention': attention,
'earnings_news': earnings_news,
'analyst_news': analyst_news,
'control_variables': control_variables
})
# 定义自变量和因变量
X = regression_data[['retail_oib', 'high_ta_usage', 'retail_oib_high_ta', 'attention', 'earnings_news', 'analyst_news', 'control_variables']]
y = regression_data['future_return']
# 添加固定效应和常数项
X = sm.add_constant(X)
X = X.join(pd.get_dummies(regression_data['week']))
# 建立回归模型
model = sm.OLS(y, X).fit()
# 输出回归结果
print(model.summary())
结论
本文利用大型语言模型(LLMs)分析了投资者在社交媒体平台上的交易策略,揭示了散户投资者在技术分析和基本面分析上的差异。研究发现,散户投资者在技术分析上的情绪往往错误地预测未来收益,而在基本面分析上的情绪则具有信息性。此外,社交媒体上的技术分析讨论可能导致散户投资者的羊群行为,降低了散户订单流的信息含量。
这些发现强调了散户投资者投资方法的异质性及其不同程度的成熟度。我们的研究表明,社交媒体情绪和散户订单流的信息含量比之前所认识的更加复杂。当散户投资者过度依赖技术交易策略时,情绪和订单流的预测能力会降低,可能导致交易的过度拥挤。
我们的研究还提供了散户投资者与利用强大AI策略的高级交易者之间互动的新见解。发现最先进的、具有高盈利性的AI技术分析策略主要通过与StockTwits上的技术情绪相反的交易获利。这表明,投资者在有效利用技术信号方面的能力差异在决定金融市场的赢家和输家方面起着关键作用。
随着AI继续重塑投资格局,社交媒体可能加剧这种不平衡,对市场公平性和完整性的担忧变得更加紧迫。我们的研究结果为金融市场中AI监管和投资相关社交媒体平台的监督提供了政策讨论的依据。
参考文献
- ? Barber, B. M., Huang, X., Jin, L., & Liu, G. (2022). Attention Induced Trading and Returns: Evidence from Robinhood Users. Journal of Finance, 77(6), 2633-2672.
- ? Boehmer, E., Jones, C. M., Zhang, X., & Zhang, X. (2021). Tracking Retail Investor Activity. Journal of Finance, 76(5), 2249-2305.
- ? Cookson, J. A., & Niessner, M. (2020). Why Don’t We Agree? Evidence from a Social Network of Investors. Journal of Finance, 75(1), 173-228.
- ? Jiang, J., Kelly, B., & Xiu, D. (2023). Empirical Technical Analysis: The Case of the Moving Average. Journal of Financial Economics, 147(2), 324-343.
- ? Dou, W., Ji, Y., Wu, W., & Xiong, W. (2024). Reshaping Financial Markets: AI-Driven Investment and Its Challenges. Journal of Financial Economics, 152(2), 273-297.
注:本文旨在介绍学术论文《Wisdom or Whims? Decoding Investor Trading Strategies with Large Language Models》的主要内容,所有公式和符号均与原文保持一致。