1. 项目概述:一个用大语言模型做实盘交易的实验框架
看到那些铺天盖地的“AI选股神器”广告,你是不是也和我一样,第一反应是翻个白眼?这些营销话术听起来天花乱坠,但背后到底有多少真材实料,谁也不知道。与其被动的怀疑,不如主动的验证。这就是“LLM Trading Lab”这个项目诞生的初衷。它不是什么一夜暴富的秘籍,而是一个持续了6个月的、用真金白银进行的严肃实验:让ChatGPT作为唯一的投资组合决策者,在严格的预设规则下,管理一个真实的微市值股票投资组合。
这个项目最初只是一个简单的想法:既然大家都在吹嘘AI的投资能力,那我们就用最透明、最可复现的方式,看看它到底行不行。我投入了100美元作为启动资金,每天向ChatGPT提供市场数据,让它做出买卖决策,并忠实地记录下每一个步骤、每一次对话和每一分钱的盈亏。如今,这个实验已经结束,但它留下的远不止一份业绩报告。整个代码仓库已经演变成一个用于研究大语言模型作为投资组合决策者行为的基线框架。所有的历史数据、研究文档和日志都完整保留,确保了完全的透明度和可审计性。无论你是量化研究员、对AI应用感兴趣的开发者,还是单纯好奇AI在金融领域边界的爱好者,这个项目都提供了一个绝佳的、可以亲手把玩的“实验室”。
2. 核心设计思路:如何构建一个可信的AI交易实验
让AI管理真钱听起来很酷,但如何确保实验的科学性和可信度,而不是一场胡闹?这是我在设计整个框架时思考的核心。一个严谨的实验必须能回答两个关键问题:第一,AI的决策过程是否可追溯、可审计?第二,实验结果是否排除了人为干预,纯粹反映了模型的能力(或缺陷)?基于这两点,我确立了以下几个核心设计原则。
2.1 原则一:决策的“前向唯一性”
这是整个实验的基石。所谓“前向唯一性”,指的是AI在每天的交易时段做出的决策是最终且不可更改的。就像真实交易中,订单一旦提交就无法撤回(在T+0市场),实验中的AI决策一旦根据当日数据生成并记录,就成为历史事实。我不会在事后因为看到结果不好,而让AI“重新思考”或修改决策。这模拟了真实市场中的决策压力和信息不可逆性,所有评估都基于这些“冻结”在时间里的决策序列。在代码实现上,这意味着每天运行的主脚本trading_script.py只会执行一次,生成的交易指令和聊天记录会立刻被归档到collected_artifacts/目录下,作为只读文件保存。
2.2 原则二:规则约束下的有限自由
我们不能让AI在市场上为所欲为,那会变成一场灾难。因此,我给它套上了“缰绳”——一套严格、明确的交易规则。这些规则定义了实验的边界条件,例如:
- 资金管理:初始资金100美元,单笔交易最大仓位比例(例如,不超过总资金的20%)。
- 标的范围:限定在“微市值”股票(通常指市值在3亿至20亿美元之间,但实验中我可能定义得更小)。这既控制了风险,也聚焦于AI分析小型、信息不对称公司的潜力。
- 风险控制:强制性的止损规则(例如,持仓亏损达到7%时自动平仓)。
- 操作频率:每日调仓,避免高频交易带来的复杂性和额外成本。
AI的“智能”体现在规则内对具体股票的选择和买卖时机的判断,而不是发明新规则。这就像给一个基金经理规定了投资范围和风控红线,然后考察他的选股能力。
2.3 原则三:全链路透明与可复现
金融领域的AI应用最忌“黑箱”。在这个项目中,透明度体现在三个层面:
- 输入透明:每天喂给AI的数据源是公开的(主要使用
yfinance,备用Stooq),数据获取代码公开。 - 过程透明:与ChatGPT的完整对话日志(
chats.md)、每周的深度研究总结(Weekly_Deep_Research_MD/)都详细记录。你可以看到AI是如何分析数据、如何推理、最终如何做出买入/卖出/持有决策的。 - 输出透明:所有的交易记录(
Trade_Log.csv)、每日资产组合更新(Daily_Updates.csv)以及绩效图表(images/)全部公开。
这意味着任何一个有技术能力的人,都可以下载这个仓库,检查从数据到决策再到结果的每一个环节,甚至可以完全复现这个实验(当然,由于市场变化,结果不会相同,但过程一致)。
2.4 原则四:历史数据的不可变性
项目仓库的结构设计遵循“仅追加,不修改”的哲学。experiments/chatgpt_micro_cap/目录下的所有历史实验数据、日志和报告都是冻结的。任何新的分析、评估或未来实验,都以新增文件或新建目录的方式“叠加”在原有结构之上,绝不会去修改历史文件。这样做的好处是,无论未来我的分析思路如何变化,原始实验记录始终作为一份可信的“原始档案”存在,确保了研究结论的可靠基础。你看到的evaluation/paper.pdf这份40多页的评估报告,正是基于这些冻结的数据生成的。
3. 技术栈与核心模块解析
工欲善其事,必先利其器。这个项目没有使用复杂晦涩的量化平台,而是基于一个清晰、轻量且完全由Python构建的技术栈。这样的选择是为了最大化透明度和可访问性,让关注点集中在AI决策逻辑本身,而非工具的使用上。
3.1 核心技术栈选择
- Python 3.11+:现代Python版本在性能和特性上都有良好支持,是数据科学和自动化任务的事实标准。
- pandas:数据处理和分析的核心库。用于清洗、整理从API获取的股票数据,计算指标,以及管理投资组合的每日状态。
- yfinance:主要数据源。一个免费、易用的库,可以获取雅虎财经上的历史价格、基本面数据等。虽然非官方,但对于此类实验项目来说完全足够。
- Stooq:备用数据源。设计备用源是至关重要的实操经验。金融数据API有时会不稳定或变更,
Stooq提供了一个简单的备用方案,确保在yfinance失效时实验不会中断。 - Matplotlib:用于生成所有绩效分析图表,如资金曲线、回撤图、与基准(如标普500)的对比图等。可视化是理解模型表现不可或缺的一环。
注意:数据源的可靠性。免费公开的数据源可能存在延迟、错误或格式变化。在生产级系统中这不可接受,但对于一个以过程透明和研究为核心的开源实验,使用这些广为人知的免费源反而是优势——它降低了任何人复现实验的门槛。在代码中,需要对数据获取进行异常处理,并记录任何数据问题。
3.2 核心代码模块深度拆解
整个项目的运行引擎围绕experiments/chatgpt_micro_cap/trading_script.py这个主脚本展开。我们来拆解它的典型工作流程和关键模块。
3.2.1 数据准备与预处理 (processing/ProcessPortfolio.py)在调用AI之前,脚本首先需要获取并格式化当日的市场数据。这个过程大致如下:
- 读取当前组合:从
csv_files/Daily_Updates.csv加载上一交易日的投资组合持仓、现金余额。 - 获取行情数据:根据关注列表(微市值股票池),使用
yfinance批量获取最新股价、成交量、涨跌幅等。 - 计算关键指标:可能会计算一些简单的技术指标(如移动平均线、相对强弱指数RSI)或基本面比率(如市盈率),这些指标将作为后续提示词的一部分喂给AI。
ProcessPortfolio.py模块很可能封装了这些数据清洗和组合状态更新的逻辑。 - 检查止损:遍历当前持仓,检查是否有任何头寸触发了预设的止损线。如果触发,生成“强制平仓”指令,这个指令的优先级高于AI的新决策。
3.2.2 构造AI提示词与交互这是整个系统的“大脑”接口。提示词的设计质量直接决定了AI决策的合理性。我的提示词模板通常包含以下几个部分:
- 系统角色设定:明确告知AI它的角色是一名遵守特定规则的量化分析师。
- 当前组合状态:以清晰格式列出当前持有的股票、数量、成本价、当前价、浮动盈亏。
- 可用资金:明确告知可以用于购买新头寸的现金数额。
- 市场数据摘要:以表格形式提供候选股票列表及其关键指标(股价、日内变化、市值、近期趋势等)。
- 决策规则重申:再次强调交易规则(仓位限制、止损位、只交易微市值股等)。
- 决策任务:要求AI输出一个明确的行动列表,例如:“卖出X股A公司,因为...;买入Y股B公司,因为...;持有C公司,因为...”。
- 输出格式要求:严格要求AI以指定的JSON或结构化文本格式输出,以便脚本能自动解析。
这个精心构造的提示词,是将开放域的大语言模型“约束”到特定专业任务上的关键。在collected_artifacts/chats.md中,你可以看到每一天具体的提示词和AI的完整回复。
3.2.3 交易指令解析与执行模拟收到AI的回复后,trading_script.py需要解析其输出。由于是模拟实盘(或小额实盘),这里的“执行”可能分为两种情况:
- 完全模拟:根据解析出的指令,在内存中更新投资组合状态,计算新的持仓、现金和总资产,并记录到CSV文件中。不涉及真实的券商API。
- 半自动实盘:如果连接了券商API(如Alpaca、Interactive Brokers等),脚本可以将解析后的指令转化为API订单并发送。在本实验中,考虑到风险和复杂性,我采用的是第一种完全模拟的方式,但框架设计上为第二种留下了可能性。
3.2.4 日志记录与归档这是保证透明度的最后一步,也是最重要的一步。每一步都必须记录:
- 交易日志(
Trade_Log.csv):记录每一笔交易的日期、股票代码、买卖方向、数量、价格、手续费(如适用)。 - 组合更新日志(
Daily_Updates.csv):记录每日收盘后的总资产、现金、持仓明细和市值。 - AI对话日志(
chats.md):完整保存当天的提示词和AI回复。 - 每周深度研究(
Weekly_Deep_Research_MD/):每周,我会让AI对当前组合和市场进行更深入的分析,形成一份总结报告并保存。
所有这些文件共同构成了一个不可篡改的实验记录链。
4. 绩效评估体系:超越简单的盈亏
评判一个交易策略,尤其是AI策略,绝不能只看最终是赚是赔。一个运气好但风险极高的策略,长期来看注定失败。因此,我建立了一套多维度的量化评估体系,这些评估逻辑大多实现在metrics/目录下的脚本中。
4.1 核心绩效指标计算
- 累计收益率与年化收益率:最直观的指标,反映策略的整体盈利能力。计算时需考虑资金的时间价值。
- 波动率(年化):衡量收益的波动程度,是风险的基础度量。AI的决策是否导致了净值的剧烈波动?
- 夏普比率:衡量风险调整后收益的黄金标准。计算公式为
(组合收益率 - 无风险利率) / 组合波动率。它回答了“每承担一单位风险,能获得多少超额回报”的问题。夏普比率越高,说明策略的单位风险收益越好。在计算中,通常用国债利率近似作为无风险利率。 - 索提诺比率:夏普比率的改进版,它只考虑下行波动率(即亏损的波动)。因为投资者通常只讨厌下跌的风险,不讨厌上涨的波动。索提诺比率能更好地衡量策略对下行风险的控制能力。
- 最大回撤:从任意一个历史高点,到后续最低点之间的最大跌幅。这是衡量策略“抗揍”能力的关键指标,反映了投资者可能承受的最大心理压力。
graphing/drawdown.py脚本专门用于可视化这一指标。 - 阿尔法与贝塔:基于资本资产定价模型。贝塔衡量策略相对于市场基准(如罗素2000指数)的波动性;阿尔法则衡量扣除市场波动影响后的超额收益。正的阿尔法意味着AI确实具备了超越市场平均的选股或择时能力。
4.2 基准对比分析
孤立的数字没有意义。因此,我将AI组合的绩效与两个关键基准进行了对比:
- 标普500指数:代表美国大盘股整体市场表现。
- 罗素2000指数:代表美国小盘股表现。由于实验聚焦微市值股(可视为更小盘),与罗素2000对比比与标普500对比更具参考价值。
通过graphing/daily_returns.py等脚本,可以生成叠加的资金曲线对比图,直观地看出AI组合是跑赢了市场,还是仅仅跟随了市场趋势。
4.3 行为分析与决策质量评估
这是本项目超越传统量化回测的地方。我们不仅看结果,还通过日志分析AI的“行为模式”:
- 换手率:AI是频繁交易还是长期持有?高换手率可能带来高交易成本,并暗示决策缺乏耐心。
- 持仓集中度:AI是分散投资还是重仓少数几只股票?这反映了它的风险分散意识。
- 决策一致性:在相似的市场环境下,AI的决策逻辑是否一致?还是充满了随机性?
- 归因分析:盈利主要是来自少数几只牛股的贡献,还是普遍盈利?亏损是因为系统性判断错误,还是个别“黑天鹅”事件?
这些分析部分体现在evaluation/paper.pdf这份综合评估报告中,它不仅仅是一份绩效报表,更是一份AI决策行为的“心理学”报告。
5. 实操复现指南与避坑要点
如果你对这个实验感兴趣,想在自己的环境下复现或基于此框架开展新的研究,以下是具体的操作步骤和必须注意的陷阱。
5.1 环境搭建与初始化
克隆仓库:
git clone https://github.com/LuckyOne7777/LLM-Trading-Lab.git cd LLM-Trading-Lab创建并激活虚拟环境(强烈推荐,避免包冲突):
python -m venv venv # On Windows venv\Scripts\activate # On macOS/Linux source venv/bin/activate安装依赖:
pip install -r requirements.txt如果
requirements.txt未指定精确版本,你可能需要手动安装核心库:pip install pandas yfinance matplotlib requests
5.2 配置与运行实验
研究项目结构:首先仔细阅读
README.md,并浏览experiments/chatgpt_micro_cap/目录下的文件结构,理解数据流向。配置实验参数:你需要修改或创建自己的配置文件(或直接修改脚本中的常量),设定:
INITIAL_CAPITAL:初始资金。STOCK_UNIVERSE:你的股票池列表(可以从微市值ETF的成分股中筛选,或自行定义)。MAX_POSITION_SIZE:单只股票最大仓位比例(如0.2)。STOP_LOSS_PCT:止损百分比(如0.07)。- 最重要的:你的OpenAI API密钥(如果使用ChatGPT)。务必通过环境变量管理密钥,不要硬编码在脚本中!
export OPENAI_API_KEY='your-api-key-here' # Linux/macOS set OPENAI_API_KEY=your-api-key-here # Windows CMD $env:OPENAI_API_KEY='your-api-key-here' # Windows PowerShell
运行每日脚本:理论上,你可以手动运行主交易脚本。
cd experiments/chatgpt_micro_cap python trading_script.py脚本会执行数据获取、调用AI、生成决策、更新组合CSV和日志这一完整流程。
生成报告:在实验运行一段时间后,使用
metrics/和graphing/下的脚本来计算绩效和生成图表。python metrics/load_dataV3.py # 可能用于加载和整理数据 python graphing/daily_returns.py # 生成收益曲线图
5.3 关键避坑指南与实操心得
坑一:数据源的时区与延迟。
yfinance获取的数据默认是美东时间,且免费数据有15分钟延迟。如果你的脚本在美股开盘期间运行,获取的可能是前一日收盘价。解决方案:明确你的实验设计。如果是“收盘价交易”(基于当日收盘价做决策,次日开盘执行),那么使用收盘价是合理的。如果是模拟盘中交易,则需要考虑延迟,或使用付费的实时数据源。在日志中必须明确注明所用数据的性质。坑二:API调用成本与速率限制。频繁调用OpenAI API会产生费用,并且有速率限制。在提示词设计上要力求简洁高效,避免不必要的上下文。可以考虑对历史对话进行摘要,而不是每次都发送全部聊天历史。实操心得:在本地先使用便宜的模型(如GPT-3.5-Turbo)进行逻辑测试和调试,待流程稳定后再换用更强大的模型(如GPT-4)进行正式实验。
坑三:AI输出的解析失败。大语言模型的输出具有一定随机性,即使要求结构化输出,偶尔也可能格式错误或包含额外解释文本。解决方案:在解析逻辑中必须加入健壮的异常处理。尝试用正则表达式匹配关键信息,而不仅仅是依赖完美的JSON解析。在
chats.md中记录原始输出,以便人工复核和调试解析器。坑四:过拟合与“幸运”的决策。一个运行6个月的实验,其统计显著性有限。AI可能因为一两次幸运的押注而表现良好,但这不代表其策略具有普适性。解决方案:这正是项目未来方向“LLM Investor Behavior Benchmark (LIBB)”要解决的问题——通过大量、多样的模拟市场环境,对LLM的投资行为进行压力测试和基准评估,从而得到更具统计意义的结论。
最重要的心得:过程重于结果。这个项目的核心价值不在于证明AI炒股一定能赚钱,而在于展示了一种透明、可审计、可复现的研究方法。当你复现时,结果可能与原实验截然不同,这完全正常,甚至更有价值。请把你的关注点放在分析AI的决策逻辑、它在不同市场环境下的行为变化、以及整个实验框架的稳健性上。
6. 从实验到框架:LIBB与未来展望
最初的微市值实验已经结束,并产出了一份详细的评估报告。但故事远未结束。这个项目的真正遗产是它沉淀下来的方法论和代码框架,为系统性地研究LLM的投资行为铺平了道路。
6.1 LLM投资者行为基准
我目前正在全力开发一个更通用、更强大的框架:LLM Investor Behavior Benchmark。LIBB的目标是成为一个标准化的测试平台,它的设计思路包括:
- 多样化的市场环境模拟:不仅限于历史数据回测,还可以生成具有不同特征(牛市、熊市、震荡市、黑天鹅事件)的模拟市场,测试LLM在不同压力下的表现。
- 标准化的任务与评估:定义一系列明确的投资任务(如行业轮动、风险平价、事件驱动套利等),并配套统一的评估指标集,使不同LLM或不同提示词策略的结果可以公平比较。
- 剥离交易能力:LIBB可能更侧重于评估LLM的“决策质量”而非最终盈亏。例如,给定相同的市场信息,比较不同LLM构建的投资组合在风险收益特征上的差异。
- 开源与协作:希望LIBB能成为一个社区项目,汇集更多研究者和开发者的智慧,共同探索LLM在金融决策中的能力边界与潜在风险。
6.2 新实验方向:IPO市场分析
基于现有框架,我计划启动一个新的实验方向:聚焦于新上市公司的IPO后表现。这个想法源于微市值实验中的一个观察——LLM对于挖掘未被充分研究的小公司似乎有一些独特的视角。IPO市场充满了信息不对称和短期情绪波动,这是一个检验LLM信息整合与价值判断能力的绝佳场景。实验设计可能包括:
- 月度调仓:降低交易频率,更侧重于基本面和中长期趋势分析。
- 深度研究提示:要求LLM综合招股说明书、首日股价表现、早期财务数据、行业新闻等多源信息。
- 对比基准:与IPO指数或类似策略的ETF进行对比。
这个实验的进展和深度分析,我计划通过我的Substack进行持续分享,将开源代码与深度解读结合起来。
6.3 对社区与贡献者的邀请
“LLM Trading Lab”始终保持开放。无论是你发现了代码中的一个bug,对实验设计有尖锐的批评,还是有一个绝妙的想法想要扩展这个框架,都非常欢迎参与进来。高质量的贡献者未来可能会被邀请共同维护像LIBB这样更大的项目。在金融与AI交叉的这个新兴领域,需要的是更多严谨的探索和开放的讨论,而非夸大的营销。这个项目就是我提交的一份“开源实验报告”,它或许不完美,但足够真实。希望它能为你自己的探索,点燃第一盏灯。