1. 项目概述一个由AI驱动的共同基金筛选器最近在折腾一个挺有意思的量化小项目叫 MF Screener AI。简单来说它不是一个传统意义上由人类专家编写策略的选基工具而是一个“让AI来写策略”的实验场。项目的核心思路是把共同基金的历史数据喂给不同的AI模型比如 Claude、Gemini 和 Codex然后让它们各自生成一套量化评分算法最后把这些算法的结果汇总起来形成一个综合排名。这个想法的出发点其实很朴素在投资领域尤其是量化分析策略的多样性和视角的差异性至关重要。一个由人类设计的模型难免会带有个人经验和认知的局限。而不同的AI模型基于其训练数据和内在逻辑可能会从完全不同的角度来解读同一组数据。比如有的模型可能更看重风险调整后收益有的则对动量因子情有独钟。把它们“凑”在一起有点像组建一个由不同风格分析师构成的虚拟投研团队看看谁的“眼光”更独到或者综合起来是否能产生更稳健的判断。项目本身托管在 GitHub 上结构清晰完全开源。它主要干这么几件事先从 TickerTape 这个数据源拉取共同基金的元数据和历史净值数据然后运行几个由不同AI生成的Python脚本这些脚本会根据诸如年化复合增长率、夏普比率、阿尔法、动量等一系列指标给基金打分接着把所有模型的分数进行归一化和编译得出一个最终的综合排名最后这个排名会被发布到一张 Google 表格里方便任何人查看和筛选。我必须强调这纯粹是一个技术实验和开源项目。里面所有的策略逻辑和代码主体部分都是AI生成的。虽然它们使用了夏普比率、阿尔法这些标准的金融指标但算法本身可能包含偏见或错误。所以这绝对不是也绝不能被视为任何形式的投资建议。它的价值更多在于展示一种可能性如何利用现代AI工具以一种低成本、高迭代的方式去探索量化金融的策略生成。对于开发者、量化爱好者或者单纯对“AI金融”交叉领域感兴趣的朋友来说这是一个可以亲手把玩、甚至自己动手改造的绝佳样本。2. 核心架构与工作流拆解2.1 整体设计思路AI作为策略生成器MF Screener AI 的核心创新点在于将AI定位为“策略生成器”而非简单的数据分析工具。传统量化项目通常是“人设计策略机器执行回测”而这里变成了“人定义任务和目标AI生成策略代码机器执行”。这种“Vibecoding”一种强调与AI协同、流畅编码的体验模式极大地降低了策略原型开发的门槛。项目的架构围绕一个清晰的工作流展开我们可以把它理解为一个四步流水线数据供给层由MfDataProvider模块负责。它的任务是连接到 TickerTape 的API获取印度共同基金市场的相关数据。这里获取的不仅仅是历史净值还包括基金的基本元数据比如基金类型股票型、债券型、混合型、所属分类大盘股、中盘股、小盘股等、成立日期、资产管理规模等。干净、规整的数据是后续所有分析的基础。策略执行层这是最有趣的部分。项目预置了三个由不同AI模型生成的策略脚本分别针对小盘股、中盘股和全市场基金。每个脚本都是一个独立的分析引擎里面封装了该AI模型对“如何评价一只基金”的理解。它们会读取数据供给层提供的数据进行计算并输出一个分数。结果聚合层单个AI模型的评分可能有其片面性。因此项目设计了一个编译和归一化流程。简单说就是把 Claude、Gemini、Codex 给出的分数通过一定的数学方法比如 Min-Max 归一化或 Z-Score 标准化转换到同一个量纲上然后加权平均或采用其他方式合成一个“综合得分”。这个分数更能反映多个智能体的共识。成果展示层最终的综合排名和详细分数通过 API 自动更新到一份公开的 Google Sheets 中。选择表格作为输出形式非常巧妙因为它无需开发前端界面就能提供排序、筛选、查看历史快照等基本功能极大提升了项目的可访问性和实用性。这种设计的好处是模块化程度高。数据源、策略脚本、聚合方法、输出方式每个环节都可以被单独替换或升级使得项目易于维护和扩展。2.2 核心模块深度解析2.2.1 MfDataProvider数据桥梁的构建MfDataProvider是整个项目的基石。在实操中构建一个稳健的数据提供模块需要注意以下几个关键点API 接口与限流处理TickerTape 或其他金融数据API通常会有调用频率限制。在MfDataProvider的实现中必须内置合理的延时和重试逻辑。例如在连续请求之间插入time.sleep(1)并封装try-except块来捕获网络异常进行指数退避重试。数据清洗与标准化原始API返回的数据格式可能不统一。这个模块需要负责将数据清洗成后续策略脚本期望的标准格式。比如确保日期字段是统一的datetime对象净值数据是浮点数处理可能的缺失值或异常值如某天净值为0或空。本地缓存机制为了避免每次测试都重新拉取大量历史数据这很慢且不必要一个良好的实践是引入本地缓存。可以将获取的数据按基金代码和日期范围保存为parquet或csv文件。下次请求时先检查缓存是否存在且有效从而大幅提升开发调试和日常运行的效率。实操心得在初期我直接让AI生成的数据获取代码可能没有考虑周全的异常处理。后来自己补充了1) 对HTTP状态码如429-请求过多500-服务器错误的分类处理2) 对返回的JSON结构进行验证防止因API变更导致解析失败3) 添加了详细的日志记录记录每次请求的参数、状态和数据量这在排查问题时非常有用。2.2.2 AI策略脚本黑盒中的逻辑项目提供的三个策略小盘、中盘、全市场是亮点。我们以“小盘股策略”为例窥探AI生成的逻辑可能包含哪些要素一个典型的小盘股基金评分算法可能会侧重以下几个方面长期增长能力计算过去3年、5年的年化复合增长率。小盘股波动大但成长性也高因此CAGR的权重可能不低。风险调整后收益计算夏普比率。这是衡量基金“性价比”的关键指标即每承担一单位风险能获得多少超额回报。对于波动剧烈的小盘股一个优秀的夏普比率尤为重要。超额收益能力计算阿尔法。即基金相对于其业绩比较基准比如Nifty Smallcap 250指数的超额收益。正的阿尔法表明基金经理有选股或择时能力。动量效应计算特定时间段如过去6个月或12个月的价格动量。学术研究和市场实践都表明动量因子在小盘股领域往往表现显著。下行风险控制计算索提诺比率或最大回撤。索提诺比率类似于夏普比率但它只考虑下行波动坏波动更能反映对下跌风险的控制能力。AI生成的脚本会将这些指标量化并为每个指标分配一个权重最后加权求和得到总分。例如最终分数 (CAGR * 权重1) (夏普比率 * 权重2) (阿尔法 * 权重3) (动量得分 * 权重4) - (最大回撤 * 权重5)注意事项AI生成的权重分配逻辑有时会显得“机械”或缺乏经济含义。例如它可能简单地给所有指标赋以相同权重。在实际应用中我们需要审视这些权重是否符合该策略的投资逻辑。比如在追求成长的小盘股策略中CAGR和动量的权重是否应该高于稳健的大盘股策略这需要人工介入进行校准和回测验证。2.2.3 结果编译与归一化合成共识的艺术当Claude、Gemini、Codex分别给出自己的评分后如何公平地合成一个总排名这里涉及到数据标准化的技术。假设Claude给基金A打分为85Gemini打分为120Codex打分为0.5。这些分数量纲和范围完全不同直接平均毫无意义。因此需要归一化。常用的方法有Min-Max 归一化将每个模型的分数线性变换到[0, 1]或[0, 100]区间。归一化分数 (原始分数 - 该模型所有分数中的最小值) / (该模型所有分数中的最大值 - 最小值) * 100这种方法简单直观但受极端值最大值、最小值影响大。Z-Score 标准化基于分数的均值和标准差进行转换。标准化分数 (原始分数 - 该模型所有分数的均值) / 该模型所有分数的标准差得到的是均值为0标准差为1的分布。这能更好地反映基金在该模型评价体系中的相对位置。在MF Screener AI中很可能采用了类似的方法。将每个模型的分数标准化后再赋予每个模型一个权重例如认为三个模型同等重要则各占1/3进行加权求和得到最终的综合得分。避坑技巧归一化时务必分模型独立进行。即先对Claude的所有输出分数做归一化再对Gemini的所有输出分数做归一化以此类推。如果混在一起归一化就破坏了每个模型内部的评分体系结果会失真。3. 从零开始搭建与运行你的MF Screener3.1 本地开发环境配置要运行这个项目你需要一个基本的Python开发环境。以下是详细的步骤和要点获取代码git clone https://github.com/as1605/mf-screener-ai.git cd mf-screener-ai创建并激活虚拟环境强烈推荐避免包冲突# 使用 venv (Python 3.3) python -m venv .venv # 在 Windows 上激活 .venv\Scripts\activate # 在 macOS/Linux 上激活 source .venv/bin/activate安装依赖 项目根目录下应该有一个requirements.txt文件。pip install -r requirements.txt典型的依赖可能包括pandas(数据处理),numpy(数值计算),requests(API调用),google-auth和google-api-python-client(用于写入Google Sheets),scipy或statsmodels(用于计算夏普比率、阿尔法等统计指标)。配置API密钥与环境变量TickerTape API你需要注册TickerTape并获取API密钥。通常密钥会通过请求头如X-API-KEY传递。Google Sheets API为了让脚本能自动更新表格你需要设置Google Cloud项目启用Sheets API并下载服务账户的JSON凭证文件。 最佳实践是将这些敏感信息存储在环境变量中而不是硬编码在脚本里。可以创建一个.env文件记得加入.gitignoreTICKERTAPE_API_KEYyour_key_here GOOGLE_SHEETS_CREDENTIALS_JSONpath/to/your/credentials.json然后在Python中使用os.getenv()来读取。常见问题1安装依赖时报错。这通常是因为某些包如ta-lib一个技术分析库需要系统级的编译工具。在Ubuntu上你可能需要先运行sudo apt-get install build-essential。在Windows上可以考虑使用预编译的whl文件或者安装Anaconda发行版它包含了许多科学计算包的二进制版本。常见问题2Google Sheets API权限错误。确保你的服务账户JSON文件路径正确并且你已经在Google Sheets中分享了目标表格给这个服务账户的邮箱形如your-service-accountyour-project.iam.gserviceaccount.com并赋予其“编辑者”权限。3.2 运行现有策略并解读结果环境配置好后运行项目通常有一个主入口脚本比如main.py或run_screener.py。python run_screener.py运行过程会在终端输出日志显示正在获取哪些基金的数据、正在执行哪个策略、计算进度等。最终脚本会输出一个本地的结果文件如CSV并尝试更新Google Sheets。如何解读输出结果假设最终的Google Sheets表格有以下几列基金名称、基金分类、Claude评分、Gemini评分、Codex评分、综合评分、排名。横向看同一基金比较不同AI模型对同一只基金的评分差异。如果三个模型都给某只基金打了高分说明这只基金在不同评价体系下都表现优异共识度高可能值得进一步关注。如果评分分歧很大比如Claude给高分而Gemini给低分你就需要深入看看它们各自依据的指标是什么分歧点在哪里。纵向看同一模型观察某个AI模型如Claude给出的排名。这个排名反映了该模型独特的“偏好”。你可以思考这种偏好是否符合某种投资逻辑例如Claude生成的策略是否更偏向高动量、高成长的基金。关注综合评分与排名这是项目的核心输出融合了多个视角。排名靠前的基金可以加入你的观察列表。但切记这只是一个筛选起点绝不是买入信号。你必须基于这个列表去做进一步的基本面研究阅读基金说明书了解基金经理分析持仓等。实操心得第一次运行可能会因为数据获取失败而中断。建议先写一个小的测试脚本单独测试MfDataProvider能否成功获取一两只基金的数据。确保数据链路畅通后再运行完整的筛查流程。另外可以将完整运行设置为定时任务如每周日晚上自动更新表格实现定期筛查。3.3 核心环节策略生成与回测浅析虽然项目主要展示AI生成策略但作为一个严谨的实践我们必须思考如何验证这些策略的有效性。这就引出了“回测”的概念。什么是回测回测是在历史数据上模拟运行一个交易策略以评估其潜在表现。对于这个选基策略一个简单的回测思路是假设我们在每个月初根据当时的基金数据和策略模型选出排名前10的基金等权重投资持有到月底下个月再根据新的排名调仓。然后计算这个投资组合在历史区间的收益率、波动率、最大回撤等。为什么项目本身可能没有复杂回测因为AI生成的是“评分策略”而非“交易策略”。评分策略回答的是“此刻哪些基金更好”而交易策略需要明确“何时买、买多少、何时卖”。将评分转化为交易规则本身就需要设计例如只买排名前5的评分高于多少才买。此外严谨的回测需要考虑交易费用、滑点、分红再投资等复杂因素这超出了这个初始实验项目的范围。你可以如何尝试如果你想深入一步可以这样做固化评分模型选定一个你相对认可的AI生成脚本比如Claude的小盘股策略将其逻辑固定下来。设计交易规则制定简单的规则如“每月第一个交易日买入综合排名前5的基金每只分配20%资金卖出不再在前5的持仓”。获取历史数据你需要基金每日的净值历史数据而不仅仅是当前快照。这可能需要更复杂的数据获取或购买专业数据库。使用回测框架利用backtrader,zipline或QuantConnect等Python回测库编写代码模拟上述交易过程。分析结果计算策略的年化收益、夏普比率、最大回撤并与基准指数如Nifty Smallcap 250进行比较。这个过程能让你真正理解一个策略从生成到验证的全貌也是从“实验项目”走向“严肃研究”的关键一步。4. 创造属于你自己的AI选基策略这是MF Screener AI项目最吸引人的部分它不是封闭的而是鼓励你 fork 并创建自己的算法。下面是一个 step-by-step 的指南。4.1 定制化路径详解Fork 与克隆首先在GitHub上fork原项目到你自己的账户下然后将你的fork克隆到本地。这样你就能在一个完全属于自己的代码库上工作自由修改而不会影响原项目。理解任务文件项目的核心引导文件是docs/TASKS.md和tasks/2_algorithm.md。2_algorithm.md很可能是一个给AI如 Cursor看的提示词模板。你需要仔细阅读并修改它。修改提示词打开tasks/2_algorithm.md。它的内容可能类似于“请扮演一个量化分析师为我生成一个Python脚本。这个脚本需要分析印度共同基金数据并针对[目标板块]的基金进行评分。请使用[你选择的AI模型如GPT-4]的风格和逻辑。评分应基于以下指标CAGR, 夏普比率, 阿尔法, 动量并考虑[你的特殊要求如低波动性、高股息等]。” 你需要做的是将[目标板块]替换为你感兴趣的领域例如“基础设施行业基金”、“银行与金融服务业基金”、“国际股票基金”或“侧重ESG的基金”。将[你选择的AI模型]替换为你打算使用的模型比如 “Claude 3.5 Sonnet”、“GPT-4o” 或 “Gemini 1.5 Pro”。不同的模型可能会产生不同风格的代码。在[你的特殊要求]里注入你的投资理念。比如“请特别重视下行风险指标如索提诺比率和最大回撤”或者“请加入对基金换手率的考量偏好低换手率的基金”。使用AI助手生成代码用 Cursor、GitHub Copilot Chat 或直接使用 ChatGPT/Claude 的聊天界面将修改好的2_algorithm.md内容发送给AI。明确指示它生成一个完整的、可运行的Python脚本。生成的脚本应该能够读取项目约定的数据格式通常是Pandas DataFrame并输出一个包含基金代码和评分的DataFrame。集成与测试将AI生成的脚本保存到项目的算法目录下例如algorithms/My_Infrastructure_Strategy.py。修改项目的主运行脚本或配置将你的新策略添加到待执行策略列表中。在本地小范围运行测试确保它能正确读取数据、执行计算、不报错并输出合理的分数比如分数没有全是NaN或无穷大。运行与比较运行完整的筛查流程。看看你的新策略选出的基金与原有的小盘股、中盘股策略选出的有何不同。思考这些差异是否符合你的预期。4.2 不同AI模型的策略风格猜想根据项目描述不同的AI模型已经展现了不同的倾向Claude描述中提及“自适应信念”这可能意味着Claude生成的策略会包含某种动态权重调整机制。例如在市场波动率上升时自动调高夏普比率的权重在趋势明显的市场调高动量权重。这种“情境感知”能力是高级策略的特征。Gemini强调“多因子回归”。这可能意味着Gemini的策略更像一个传统的量化多因子模型。它会尝试将基金的收益分解为多个风险因子如市场因子、规模因子、价值因子等的暴露然后用回归分析来评估基金经理剔除这些因子影响后的纯阿尔法能力。这种方法更学院派也更稳健。Codex使用“前向验证”。这是一种比简单历史回测更严谨的验证方法。它可能将历史数据分成多个时间窗口在每个窗口内训练模型参数并在紧随其后的窗口测试如此滚动向前。这能更好地防止策略在历史数据上“过拟合”评估其泛化能力。当你创建自己的策略时也可以尝试引导AI模仿这些风格或者创造全新的风格。例如你可以要求AI生成一个“基于宏观经济指标如利率、通胀动态调整行业权重的战术资产配置策略”。4.3 高级定制与扩展思路当你熟悉基本流程后可以尝试更高级的定制引入新数据源除了基金净值是否可以引入基本面数据比如通过其他API获取基金的持仓股票列表然后计算持仓股票的平均市盈率、市净率、净资产收益率等将这些作为评分因子。这能让策略从纯量价分析扩展到基本面分析。设计更复杂的聚合逻辑现在的综合评分是简单的加权平均。你可以尝试更高级的聚合方法比如基于历史表现的动态加权根据每个AI模型策略在最近一段时间如过去6个月的模拟表现信息比率来分配权重表现好的模型权重高。投票机制不直接加总分数而是采用“投票”制。例如三个模型都将其排在前10%的基金标记为“强烈推荐”两个模型排在前10%的标记为“推荐”。构建模拟组合与可视化写一个额外的脚本将最终选出的基金构建成一个模拟投资组合计算其每日净值变化并绘制出与基准指数的对比图。使用matplotlib或plotly库生成美观的图表让结果更直观。添加自动化警报设置一个监控脚本当某只基金的排名发生剧烈变动如从前50名跌出前100名或者其关键指标如夏普比率跌破阈值时自动发送邮件或Telegram消息提醒你。5. 常见问题、排错与实战经验在复现和扩展这个项目的过程中你几乎一定会遇到一些问题。下面是我踩过的一些坑和解决方案。5.1 数据获取与处理类问题问题运行脚本时在数据获取阶段卡住或报错。排查步骤检查网络与API密钥首先确认你的网络能正常访问 TickerTape。在浏览器中手动尝试一个API端点如果有公开示例或用curl命令测试确保密钥有效且未过期。检查请求频率立即停止脚本。查看代码中的请求间隔是否太短。免费API通常有严格的限流如每秒1次。在MfDataProvider的请求函数中增加time.sleep(1.5)或更长的间隔。处理分页与数据量如果要获取全市场基金数据数据量很大。API可能采用分页返回。检查代码是否正确处理了分页逻辑next_page参数或Link响应头。查看完整错误信息在Python中使用try-except包裹请求代码并打印出完整的异常信息traceback这能精确定位错误行和错误类型。问题数据清洗时遇到缺失值或异常值导致后续计算报错如计算对数收益率时出现inf。解决方案# 示例在计算收益率前清洗数据 import numpy as np # 假设 nav_series 是基金净值序列 # 1. 向前填充缺失值对于基金净值通常用前一日净值填充 nav_series_filled nav_series.ffill() # 2. 确保没有零或负值虽然极少见但需防范 nav_series_positive nav_series_filled[nav_series_filled 0] # 3. 计算日收益率 returns nav_series_positive.pct_change().dropna() # 4. 处理收益率中的极端值可选如 Winsorization from scipy.stats import mstats returns_winsorized mstats.winsorize(returns, limits[0.01, 0.01]) # 缩尾1%5.2 策略脚本执行类问题问题AI生成的策略脚本运行时报语法错误或导入错误。原因与解决AI生成的代码并非100%完美。常见问题包括使用了未安装的第三方库、变量名拼写错误、缩进问题特别是混合空格和制表符时。解决仔细阅读错误信息定位到出错行。首先检查该行及附近行的语法。然后检查文件顶部的import语句确保所有引用的库都已安装在当前虚拟环境中。如果AI使用了像talib这样的库你需要额外安装TA-Lib。问题策略计算出的分数全部相同或者全是NaN/Inf。排查思路检查输入数据打印出传入策略函数的DataFrame的前几行和后几行确认数据格式正确且包含计算所需的所有列如navdate。检查指标计算逐步调试。单独提取一只基金的数据手动计算一遍CAGR、夏普比率等看中间步骤是否出错。例如计算夏普比率需要无风险利率检查代码中这个值是否设置合理比如用了0或者一个不存在的利率序列。检查分母为零的情况在计算比率指标时如果分母是波动率而某只基金波动率为0会导致除零错误。在计算前应加入判断if volatility 1e-10: sharpe (return - risk_free) / volatility else: sharpe 0。5.3 结果输出与集成类问题问题无法更新Google Sheets报权限错误。详细解决步骤确认你的服务账户JSON文件路径在环境变量中设置正确。打开你的Google Sheets表格点击右上角的“共享”按钮。在邀请框中输入你的服务账户邮箱格式如xxxxxx.iam.gserviceaccount.com权限选择“编辑者”然后发送邀请。在代码中确保你使用的是服务账户的认证方式并且spreadsheet_id表格ID填写正确。表格ID是URL中/d/和/edit之间的那串字符。问题最终排名看起来不合理明星基金排名很低。理性分析数据周期检查策略使用的数据周期。如果只用了最近3个月的数据而明星基金过去3个月表现不佳排名低是正常的。策略反映的是在其设定规则下的表现。策略偏好你的策略可能偏好低波动、高股息而明星基金可能是高增长、高波动风格。这没有对错只是策略风格不同。过拟合风险AI生成的策略可能在历史数据上表现好但不适应未来的市场风格切换。这是所有量化模型面临的共同挑战。行动建议不要盲目相信排名。将排名视为一个“初选清单”用它来缩小研究范围而不是代替你的深入研究。5.4 性能与优化建议当基金数量很多时循环获取数据和计算可能会很慢。向量化操作尽量使用Pandas和NumPy的向量化函数避免使用Python原生for循环。例如计算所有基金的日收益率序列用df.pct_change()一次完成比循环每只基金快得多。并行计算对于可以独立计算的任务如不同基金的评分可以使用concurrent.futures库进行多线程或多进程并行处理充分利用多核CPU。缓存中间结果将计算好的中间指标如每只基金的波动率、Beta值缓存起来。如果多个策略脚本都需要这些指标直接从缓存读取避免重复计算。这个项目就像一个乐高套装提供了基础模块和搭建思路。真正的乐趣和收获来自于你亲手修改提示词、生成新策略、解决运行中遇到的各种问题并最终看到一套属于你自己的、自动运行的基金筛选系统产出结果的那一刻。它可能不会让你立刻成为投资高手但它绝对是一个理解AI在金融领域应用、学习量化分析流程的绝佳实践入口。记住保持批判性思维把AI的输出当作一个有创意的同事的建议而最终的决策权永远在你手中。