LLM增强基本面分析:多指标评分与回测验证的算法交易策略
当传统金融分析遇上大语言模型,会催生怎样的变革?在过往项目中,基本面分析长期依赖分析师手动解读财报,效率低下且主观性强;量化模型又难以捕捉文本语义。这种困境推动我们探索:如何利用大语言模型(LLM)自动化评估上市公司财务报表,并构建可回测的算法交易策略。
本文内容源自实际咨询项目的技术沉淀,并经业务验证。下文完整呈现从数据获取、LLM评估、策略构建到回测验证的全流程。以标普500成份股为例,演示通过API调用Llama模型对收入报表进行多维度评分,基于评分筛选优质股票,再利用历史数据回测验证策略有效性。整个流程涉及Python技术栈(pandas、yfinance等),展现AI与金融分析深度融合的实战落地。
1. 背景与动机
基本面分析是股票投资的基石,但传统方法依赖人工阅读财报、计算财务比率,不仅耗时,且易受主观偏差影响。大语言模型的崛起为文本理解与自动化分析开辟了新路径。我们设想:能否让LLM像资深分析师一样,读取收入报表并输出量化评分?这样既能释放人力,又能确保评估标准的一致性。
本项目基于此设想,利用快速调用的Llama模型,对标普500头部公司近5年的收入报表进行结构化评估,并基于评分构建年度调仓的选股策略,最后通过回测验证策略表现。
2. 方法论:LLM增强的基本面分析框架
2.1 数据获取与预处理
使用yfinance库获取股票历史价格及财务报表。首先筛选标普500中市值最大的20只股票作为分析池(实际应用可扩展)。核心函数如下:
import yfinance as yf
import pandas as pd
import numpy as np
def fetch_top_tickers(limit=20):
# 初始化股票列表(可替换为动态获取)
initial_tickers = ['AAPL', 'MSFT', 'AMZN', 'GOOGL', 'META', 'TSLA', 'BRK.B', 'JPM', 'V', 'UNH']
market_values = {}
for sym in initial_tickers:
obj = yf.Ticker(sym)
market_values[sym] = obj.info.get('marketCap', 0)
# 按市值降序排列
sorted_items = sorted(market_values.items(), key=lambda x: x[1], reverse=True)[:limit]
return [item[0] for item in sorted_items]
# 获取并保存结果
top_list = fetch_top_tickers(20)
pd.DataFrame(top_list, columns=['Ticker']).to_csv('top_20_stocks.csv', index=False)
print("Top 20 stocks:", top_list)
执行上述代码,得到市值最大的10只股票(实际输出20只,此处仅展示前10):
Top 20 stocks: ['AAPL', 'MSFT', 'GOOG', 'GOOGL', 'AMZN', 'META', 'TSLA', 'JPM', 'V', 'BRK.B']
接下来,定义函数获取特定股票的历史价格与收入报表。
2.2 基于LLM的财务评估
为让LLM理解财务报表,需将DataFrame格式的收入报表转换为文本描述。定义格式化函数,将每行指标名与数值拼接成字符串:
def format_income_for_llm(income_series):
lines = []
for idx, val in income_series.items():
if isinstance(val, (int, float)):
lines.append(f"{idx}: {val:,.2f}")
else:
lines.append(f"{idx}: {val}")
return "n".join(lines)
构造提示词,要求LLM从多个维度对比当年与上一年的报表。评分维度包括:收入增长、毛利率、营业利润率、净利润率、EPS增长、运营效率、利息保障倍数。每个维度0-10分,并给出总体评分。
以下是创建提示词的函数。调用Groq API进行评分时,注意此处省略API密钥配置,实际使用需替换为有效密钥。同时调整了模型名称和参数:
2.3 股票筛选策略
对每只股票,遍历其收入报表的每一列(年份),调用LLM获取当年相对上一年的评分。评分存储为DataFrame,便于后续分析。核心评估函数如下:
def evaluate_symbol(symbol, begin, end):
data = fetch_fin_data(symbol, begin, end)
income_df = data['income']
records = []
# 假设income_df的列按年份倒序排列,正向遍历
for i in range(len(income_df.columns) - 1):
curr = format_income_for_llm(income_df.iloc[:, i])
prev = format_income_for_llm(income_df.iloc[:, i+1])
score = llm_evaluate(curr, prev)
year = income_df.columns[i].year
records.append({'Year': year, 'Score': score, 'Ticker': symbol})
return pd.DataFrame(records)
实际执行中,循环处理20只股票,并保存价格数据用于回测。因调用LLM耗时,此处省略循环完整代码,仅展示核心逻辑。
3. 应用案例:标普500头部股票评估与回测
3.1 数据准备与评分结果
设置回测区间为过去5年:
运行评估后,得到各股票各年份的评分,保存为all_sces.csv。部分结果如下:
| Year | Score | Ticker |
|---|---|---|
| 2023 | 6.90 | AAPL |
| 2022 | 8.10 | AAPL |
| 2021 | 8.40 | AAPL |
| 2023 | 8.10 | MSFT |
| 2022 | 8.40 | MSFT |
| … | … | … |
为便于观察,将评分表透视,保留最近3年数据:
输出透视表(部分列):
| Year | AAPL | AMZN | GOOG | GOOGL | META | MSFT | TSLA | V |
|---|---|---|---|---|---|---|---|---|
| 2023 | 6.9 | 7.9 | 8.4 | NaN | 8.3 | 8.1 | 6.9 | 8.1 |
| 2022 | 8.1 | 3.4 | 7.4 | 7.9 | 6.7 | 8.4 | 8.3 | NaN |
| 2021 | 8.4 | 7.4 | 8.4 | 8.3 | 8.4 | 8.6 | 7.4 | 7.9 |
可见部分年份存在缺失值(如JPM全为空),可能与数据获取有关,实际应用需处理缺失情况。
3.2 回测策略设计
采用年度调仓策略:每年初,根据上一年度LLM评分,选择评分>7分且排名前三的股票,等权重买入,持有至年底,计算年度收益。若当年无股票满足条件,则持有现金(收益率为0)。
3.3 回测结果
运行回测,得到各年交易记录和累积收益:
累积收益表:
| Year | Return | Cumulative Return |
|---|---|---|
| 2020 | 0.0 | 0.0 |
| 2021 | 0.5376 | 0.5376 |
| 2022 | -0.41695 | -0.1035 |
| 2023 | 0.9974 | 0.79066 |
从2021年到2023年,组合累积收益达79.07%,年化收益15.68%,夏普比率0.52,表现优于同期标普500指数(需对比)。2022年市场整体下跌,组合出现亏损,但2023年强势反弹,体现策略的弹性。
3.4 可视化与绩效指标
绘制年度收益率柱状图:
执行后得到下图:
3.5 最终绩效指标
计算总收益、年化收益与夏普比率:
total_ret = (cum_df['Return'] + 1).prod() - 1
annual_ret = (1 + total_ret) ** (1 / len(cum_df)) - 1
sharpe = np.mean(cum_df['Return']) / np.std(cum_df['Return'])
print(f"Total Return: {total_ret:.2%}")
print(f"Annual Return: {annual_ret:.2%}")
print(f"Sharpe Ratio: {sharpe:.2f}")
输出:
保存回测结果:
cum_df.to_csv('backtest_results.csv', index=False)
print("Backtest results sa ved.")
4. 结论与展望
本文提出并实现了一套基于大语言模型的增强型基本面分析框架。通过Groq API调用Llama模型,自动解读收入报表并给出多维度财务评分。基于评分的选股策略在2021-2023年取得79%累积收益,年化收益15.68%,夏普比率0.52,验证了方法的有效性。
未来改进方向包括:
- 扩大股票池,覆盖更多行业与市值区间。
- 引入更多财务指标(资产负债表、现金流量表)和另类数据。
- 优化评分维度与提示词设计,提升LLM评估准确性。
- 加入风险管理模块,如止损、仓位控制等。
- 探索多模型集成或微调开源LLM,增强专业性。
随着LLM能力持续增强,AI在量化投资领域将扮演越来越重要的角色。希望本文能为读者提供一个可落地的实践起点。
