昨晚跑策略又把服务器内存给干满了,一看日志,好家伙,又是高频数据惹的祸。做量化的朋友应该都懂,数据质量直接决定了策略是印钞机还是碎纸机。今天不聊策略,就聊聊我平时打交道最多的几种数据源,特别是期货期权这块的,给想入门或者正在踩坑的朋友们一个参考。 说到数据,很多人第一反应可能就是K线。但真正做高频或者微观结构分析,K线就太粗糙了。你得往下钻,看Level 2,看Tick。这些数据就像市场的显微镜,能看见买卖双方最真实的博弈。 先说说最“重”的——高频(Tick)数据 这东西记录的是市场上每一笔成交的明细。有多细呢?价格、成交量、成交时间(精确到毫秒)、买卖方向(主动买还是主动卖)全都有。它就像一个不知疲倦的记录员,市场动一下,它就记一笔。数据量巨大,一天一个活跃的期货合约就能产生几十万甚至上百万条记录。硬盘杀手名不虚传,处理起来对算力和存储都是考验。 新手不建议一上来就碰这个,真的,容易怀疑人生。但如果你想研究订单流、测算交易成本,或者构建超短线的信号,这又是绕不开的。 然后是Level 2行情(买卖五档) 这个比Tick数据“轻”一点,但信息量更结构化。它不记录每一笔成交,而是快照式地记录某个时刻的订单簿状态。最核心的就是买一到买五、卖一到卖五的价格和挂单量。别小看这十档数据,盘口厚度、压力支撑位、大单动向都能从这里看出端倪。 我有个习惯,回测前会先看看历史盘口。比如,有时候价格在某个位置磨蹭很久,盘口上看买一挂了巨量单子,但价格就是上不去。这可能就是所谓的“假单墙”,用来迷惑散户的。为了验证一些关于盘口行为的规律,我调取了CMES金融数据库中过去三年的主力合约数据进行回测,发现清洗好的标准数据确实能省掉很多预处理的时间。 为了方便对比,我简单列了个表,看看这几种数据的区别: 数据类别 更新频率 核心内容 个人使用感受 高频(Tick) 逐笔成交 每笔成交价、量、时间、方向 数据量爆炸,分析起来很爽,存储起来很痛。 Level2(五档) 快照(如3秒) 买卖各五档的报价与挂单量 研究市场微观结构的利器,比Tick规整,信息密度高。 期权行情 依类型而定 类似期货,含期权特有字段(如希腊值) 玩期权必备,字段多,维度复杂,对冲时用得着。 分钟/日线 分钟/日 开高低收成交量 最基础,回测快,适合初期策略验证和长周期分析。 期权数据是个单独的“副本” 如果你做期权,那数据维度就更复杂了。除了合约本身的价格、成交量,通常还会包含一些计算好的衍生字段,比如大家常说的Delta、Gamma、Vega这些希腊字母(Greeks)。这些是衡量期权风险暴露的关键指标。做期权策略,尤其是波动率交易或者对冲,没有这些数据基本就是盲人摸象。 对了,说到具体获取数据,如果你用Python,可能会用到类似下面的代码。这里只是个示意,具体参数和调用方式得看接口文档。 # 示例:调用金融数据接口获取行情数据 # 注意:需要先安装相应的数据包,例如 pip install cmesdata import cmesdata # 初始化客户端,需要替换为你的认证信息 client = cmesdata.Client(api_key='your_api_key_here') # 尝试获取某个期货合约的Level2历史数据 # CMES金融数据库的行情接口,注意入参正确,调用频率要遵守平台限制 try: # 参数示例:合约代码、开始时间、结束时间、数据类型 data = client.get_market_data( symbol='RU2409', data_type='level2', start_time='2024-01-01 09:00:00', end_time='2024-01-01 15:00:00' ) print(data.head()) except Exception as e: print(f"数据获取失败: {e}") 大家好,我想和大家分享一个我最近开发的项目——一款面向量化交易的 AI 智能助手工具网站。它可以帮助大家快速生成高质量、可直接复制运行的量化策略代码,无论你是量化小白还是策略开发者,都能从中受益。 核心亮点: 1.多平台支持:目前已支持 PTrade、QMT、miniQMT、聚宽等,并计划不断扩展更多平台。 2.策略生成高效:用户只需选择平台并输入策略想法,AI 即可生成可运行的量化策略代码。 3.快速入门与优化: • 对量化小白:轻松生成可直接运行的策略,快速上手交易。 • 对策略开发者:帮助完善、优化已有策略,节省开发时间。 • 对文档需求者:可作为量化平台的 API 文档问答机器人,方便查询和使用。 4.业内首创:这是首个面向多平台的量化交易 AI 助手,解决了现有 Deepseek 或 Trae 等 AI 工具因缺乏平台知识库而生成代码无法运行的问题。 使用方式:登录 → 选择你使用的平台 → 输入策略想法 → 生成可运行的策略代码。 我希望这个工具能帮助大家更高效地进行策略开发和量化交易,也欢迎大家在帖子里分享使用体验和建议。 网站链接:https://iris.findtruman.io/ai/tool/ai-quantitative-trading/ 如果大家有任何问题或功能需求,也可以在帖子里留言,我会持续优化和更新,让它成为量化交易领域最实用的 AI 助手! 各位 Quant 朋友,今天聊一个细节但致命的问题:回测和实盘中,你是怎么处理停牌股票的行情的? 是不是经常发现某些停牌票的“最新价”还留在时间序列里,拉偏了整个板块的收益率?我最近重构一个高频选股策略时就重点优化了这一块,从客户需求、投顾痛点一路到具体实现,给大家做个分享。 客户与策略的需求:干净的行情输入 我们做量化,最怕输入数据有“脏东西”。停牌票的价格如果不剔除,会直接污染因子计算和组合表现。例如在市值因子、动量因子中混入一个停牌不变的数值,信号就会失真。对投顾型策略输出而言,客户也要求推荐池子里不能有不可交易的标的,否则合规和体验都成问题。 投顾/策略开发者的真实痛点 传统的行情数据,有些源并不提供明确的停牌标识。我就碰到过一个接口,停牌后成交量的确不动了,但价格还在每秒推送,甚至买卖盘口遗留了停牌前的挂单。回测时没注意,选股池里混进一只停牌股,结果用市价单模拟无法成交,信号回测偏差大到离谱。而实盘监控里,如果订阅几千只股票,停牌票持续消耗 WebSocket 流量,CPU 占用也会无谓升高。 数据支撑:停牌股票的接口特征 我梳理过多个数据源在停牌期间的行为,基本覆盖以下几种: 接口特征 判断方式 量化策略里的应用 最新价冻结 价格序列方差为零 不能单独作为停牌依据 成交量持续为零 连续N分钟无成交量 可作为辅助过滤 状态字段suspend 布尔值直接判断 可靠性最高,建议优先使用 时间戳连续但无交易 序列有更新时间 直接忽略时间戳 显然,有状态字段的接口对量化最友好。 我的过滤升级方案 我现在实盘和回测都在用的三层架构,效果很好。 数据清洗层:在接收数据后,立即对每条 tick 检查状态字段;若无,则用“成交量 == 0 且 last_price 连续 N 秒不变”作为备用规则,打上停牌标签。 因子计算层:所有计算因子的函数,都先执行 df = df[df['suspend'] == False],保证输入干净。 订阅管理层:在 WebSocket 回调里,一旦识别出停牌,就动态取消对该标的的订阅,释放带宽。我目前使用的实时数据源(如 AllTick)直接提供 suspend 字段,让这步操作十分轻量。 import websocket import json def on_message(ws, message): data = json.loads(message) for tick in data.get("ticks", []): if tick.get("suspend"): # 判断是否停牌 print(f"{tick['symbol']} 停牌中") else: print(f"{tick['symbol']} 最新价: {tick['last_price']}") ws = websocket.WebSocketApp("wss://api.alltick.co/stock", on_message=on_message) ws.run_forever() 接口差异与适配 不同行情 API 差异挺大,有些停牌就断流,有些价格照推但盘口为空。我习惯在接入新数据源时,先跑一天观察,把股票分三类:活跃、停牌、新上市/退市,用不同管道处理。停牌处理本质上是数据清洗的第一关,把这关做好了,策略的鲁棒性会显著提升。 很多人学量化时,会把注意力放在“策略”上。 这当然重要。但如果你真的想长期做研究,只靠零散脚本是不够的。今天一个 test.py,明天一个 ma_final_v3.py,后天一个 真的最终版.ipynb,时间久了你会发现,自己根本不知道哪个结果可信。 一个更好的做法是:从一开始就给自己搭一个轻量的量化研究工作台。 它不需要很复杂,也不需要上来就做成专业系统。你只需要把数据获取、策略代码、回测结果、图表、配置文件放到固定位置,让每一次研究都能复现。 这篇文章讲一个适合个人使用的工作台结构:AlphaFeed 负责稳定获取行情数据,Codex 帮你写策略、调试、重构和补测试。 1. 为什么需要工作台 零散脚本的最大问题不是丑,而是不可复现。 你可能会遇到这些情况: 策略结果不错,但忘了当时用的参数。 图表保存了,但不知道对应哪段代码。 换了一组股票池,旧结果和新结果混在一起。 某天改了复权方式,历史回测全变了。 Codex 帮你改了代码,但你没记录改动原因。 量化研究要长期迭代,必须让每次实验留下痕迹。 一个轻量工作台可以这样组织: quant-workbench/ data/ raw/ processed/ strategies/ ma_cross.py etf_rotation.py reports/ charts/ runs/ configs/ ma_cross.json etf_rotation.json notebooks/ main.py requirements.txt 这不是唯一标准,但它能帮你把事情分清楚。 2. 数据层:统一从 AlphaFeed 取数 先写一个数据模块,比如 data_loader.py: from pathlib import Path import pandas as pd from alphafeed import AlphaFeed class AlphaFeedDataLoader: def __init__(self, cache_dir: str = "data/raw"): self.af = AlphaFeed() self.cache_dir = Path(cache_dir) self.cache_dir.mkdir(parents=True, exist_ok=True) def load_daily_bars( self, symbol: str, count: int = 800, adjust: str = "forward", use_cache: bool = True, ) -> pd.DataFrame: cache_file = self.cache_dir / f"{symbol}_{count}_{adjust}.csv" if use_cache and cache_file.exists(): return pd.read_csv(cache_file) df = self.af.klines.get( symbol, period="1d", count=count, adjust=adjust, to_dataframe=True, ) df = df.sort_values("trade_date").reset_index(drop=True) df.to_csv(cache_file, index=False) return df def load_quotes(self, symbols: list[str]) -> pd.DataFrame: return self.af.quotes.get(symbols=symbols, to_dataframe=True) 这样做有几个好处: 策略代码不直接关心 API 细节。 缓存文件可以减少重复请求。 复权方式、数据长度都写在函数参数里。 以后如果要换数据源,只需要改数据层。 3. 策略层:每个策略写成可复用函数 比如双均线策略: import pandas as pd def ma_cross_signal( df: pd.DataFrame, short_window: int = 20, long_window: int = 60, ) -> pd.DataFrame: df = df.copy() df["ma_short"] = df["close"].rolling(short_window).mean() df["ma_long"] = df["close"].rolling(long_window).mean() df["signal"] = (df["ma_short"] > df["ma_long"]).astype(int) return df 注意,这里只生成信号,不计算收益。 把“信号生成”和“回测计算”分开,是一个很好的习惯。否则每个策略文件里都会复制一堆收益、回撤、画图代码,越写越乱。 4. 回测层:统一处理收益、成本和指标 写一个通用回测函数: import numpy as np import pandas as pd def calc_metrics(equity: pd.Series, returns: pd.Series) -> dict: total_return = equity.iloc[-1] / equity.iloc[0] - 1 annual_return = (1 + total_return) ** (252 / len(equity)) - 1 drawdown = equity / equity.cummax() - 1 sharpe = 0 if returns.std() == 0 else returns.mean() / returns.std() * np.sqrt(252) return { "total_return": total_return, "annual_return": annual_return, "max_drawdown": drawdown.min(), "sharpe": sharpe, } def backtest_single_asset( df: pd.DataFrame, fee: float = 0.0003, slippage: float = 0.0002, ) -> tuple[pd.DataFrame, dict]: df = df.copy().dropna(subset=["signal"]) df["position"] = df["signal"].shift(1).fillna(0) df["ret"] = df["close"].pct_change().fillna(0) df["strategy_ret"] = df["position"] * df["ret"] df["turnover"] = df["position"].diff().abs().fillna(0) df["cost"] = df["turnover"] * (fee + slippage) df["strategy_ret"] = df["strategy_ret"] - df["cost"] df["equity"] = (1 + df["strategy_ret"]).cumprod() metrics = calc_metrics(df["equity"], df["strategy_ret"]) return df, metrics 以后你写任何单标的策略,只要生成 signal,就能复用这套回测逻辑。 这就是工作台的意义:把重复劳动变少,把研究动作变标准。 5. 配置层:每次实验都保存参数 不要把所有参数都写死在代码里。 用一个 JSON 配置: { "name": "ma_cross_600519", "symbol": "600519.SH", "count": 800, "adjust": "forward", "short_window": 20, "long_window": 60, "fee": 0.0003, "slippage": 0.0002 } 主程序读取配置: import json from data_loader import AlphaFeedDataLoader from strategies.ma_cross import ma_cross_signal from backtest import backtest_single_asset with open("configs/ma_cross.json", "r", encoding="utf-8") as f: config = json.load(f) loader = AlphaFeedDataLoader() df = loader.load_daily_bars( config["symbol"], count=config["count"], adjust=config["adjust"], ) df = ma_cross_signal( df, short_window=config["short_window"], long_window=config["long_window"], ) result, metrics = backtest_single_asset( df, fee=config["fee"], slippage=config["slippage"], ) print(metrics) 这样你每次实验的输入都能被记录下来。 当你以后回看结果时,不会只剩下一张不知道怎么来的图。 6. 报告层:保存结果,而不是只打印 每次回测建议保存三类东西: 配置。 指标。 净值曲线和明细。 from pathlib import Path import json import matplotlib.pyplot as plt run_dir = Path("reports/runs/ma_cross_600519") run_dir.mkdir(parents=True, exist_ok=True) with open(run_dir / "config.json", "w", encoding="utf-8") as f: json.dump(config, f, ensure_ascii=False, indent=2) with open(run_dir / "metrics.json", "w", encoding="utf-8") as f: json.dump(metrics, f, ensure_ascii=False, indent=2) result.to_csv(run_dir / "result.csv", index=False) result.set_index("trade_date")["equity"].plot(figsize=(10, 5)) plt.tight_layout() plt.savefig(run_dir / "equity.png", dpi=160) 一个实验目录长这样: reports/runs/ma_cross_600519/ config.json metrics.json result.csv equity.png 这就非常舒服了。你可以随时回看,也可以把结果发给 Codex 继续分析。 7. Codex 在工作台里能做什么 当你的项目结构稳定之后,Codex 的作用会被放大。 你可以让它做这些事: 请在 strategies/ 下新增一个 rsi_reversal.py。 要求生成 signal 字段: 1. RSI 小于 30 时买入。 2. RSI 大于 50 时卖出。 3. 不要在策略函数里计算收益。 4. 保持和 ma_cross.py 一样的函数风格。 或者: 请给 backtest_single_asset 增加一个 benchmark 参数。 如果传入 benchmark 收益序列,请输出超额收益和信息比率。 或者: 请检查整个回测代码是否有未来函数。 重点检查 signal、position、ret 的日期关系。 最关键的是:你不再让 Codex 面对一团零散脚本,而是让它在一个清晰项目里工作。它会更容易理解你的意图,也更容易做出稳定修改。 8. 一个适合发给 Codex 的项目提示词 你可以把这段作为工作台的长期说明: 这是我的个人量化研究工作台。 数据源使用 AlphaFeed: - AlphaFeed 官网:https://alphafeed.org/ - Python SDK 文档:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart 常用接口: - 日 K:af.klines.get(symbol, period="1d", count=800, adjust="forward", to_dataframe=True) - 批量 K 线:af.klines.batch(symbols, period="1d", count=800, adjust="forward", to_dataframe=True) - 实时行情:af.quotes.get(symbols=symbols, to_dataframe=True) - 全量 A 股:af.quotes.get(universes="CN_Stock", to_dataframe=True) - 全量 ETF:af.quotes.get(universes="CN_ETF", to_dataframe=True) - 五档盘口:af.depth.get(symbol) 项目约定: 1. data_loader.py 只负责取数和缓存。 2. strategies/ 里的策略函数只生成 signal,不计算收益。 3. backtest.py 负责 position、returns、cost、equity、metrics。 4. 所有 signal 都必须 shift 后才能变成 position。 5. 每次实验都要保存 config、metrics、result.csv、equity.png。 6. 不要把 API key 写进代码,使用 ALPHAFEED_API_KEY 环境变量。 有了这段上下文,你以后新增策略会非常顺手。 9. 工作台的下一步:从脚本到小应用 当命令行版本稳定后,可以继续升级: 方向 做法 参数面板 用 Streamlit 做输入表单 图表展示 展示净值、回撤、持仓 实验列表 读取reports/runs 展示历史回测 盘中监控 接入 AlphaFeed 实时行情 自动总结 让 AI 根据 metrics 写研究摘要 但不要一开始就做复杂系统。 个人量化工作台最重要的是“研究闭环”: 提出想法 -> 获取数据 -> 生成信号 -> 回测 -> 保存结果 -> 复盘 -> 继续迭代 只要这个闭环跑通,你的研究效率就会明显提升。 结语 量化研究不是只写一个策略文件。 它更像一套长期工作流:数据稳定、代码清晰、结果可复现、实验可追踪。AlphaFeed 解决数据接入和行情统一的问题,Codex 解决代码生成、调试和重构的问题,而你负责提出问题、判断逻辑、理解风险。 这三者配合起来,普通人也可以搭出一个像样的量化研究环境。 先从一个轻量工作台开始。不要追求完美,追求每次研究都能留下清楚痕迹。 相关链接: AlphaFeed 官网:https://alphafeed.org/ Python SDK 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart 用 Python 做一个 ETF 轮动策略:普通人也能理解的多资产量化入门 如果你刚开始学量化,我不建议一上来就研究几千只股票。 股票数量多、停牌多、涨跌停多、财务和行业因素复杂。新手很容易在数据处理、选股池、交易规则里迷路。 ETF 轮动反而是一个更适合入门的方向。 它的核心思想很简单:在一组 ETF 里,定期选择近期表现更强的品种持有。如果所有品种都不好,就降低仓位或空仓。 这篇文章我们用 AlphaFeed 写一个最小可运行的 ETF 轮动策略。它不追求复杂,也不承诺收益。重点是展示一个清晰、可复现、可继续迭代的量化研究流程。 1. 什么是 ETF 轮动 ETF 轮动是一种相对强弱策略。 假设你关注这些方向: 宽基指数 ETF。 科技或成长 ETF。 红利或价值 ETF。 债券或货币类 ETF。 黄金、商品或海外市场 ETF。 每隔一段时间,比如每周或每月,你计算每个 ETF 过去一段时间的收益率,选择表现最强的一个或几个持有。 背后的假设是:市场趋势有一定延续性。近期强的资产,短期内可能继续强。 当然,这不是永远有效。趋势会反转,轮动会失灵,所以必须通过回测和风险控制来评估。 2. 准备 ETF 数据 AlphaFeed 支持 ETF 行情和 K 线。代码格式和股票一致,比如 A 股 ETF 通常使用交易所后缀: from alphafeed import AlphaFeed af = AlphaFeed() df = af.klines.get( "510300.SH", period="1d", count=300, adjust="forward", to_dataframe=True, ) print(df.tail()) 如果你想看全量 ETF 实时行情,可以使用: etfs = af.quotes.get(universes="CN_ETF", to_dataframe=True) print(etfs.head()) 为了方便演示,我们先手动设定一个 ETF 池。实际研究时,你可以根据规模、成交额、跟踪指数等条件筛选。 ETF_POOL = [ "510300.SH", # 沪深300 ETF 示例 "510500.SH", # 中证500 ETF 示例 "159915.SZ", # 创业板 ETF 示例 "588000.SH", # 科创50 ETF 示例 "518880.SH", # 黄金 ETF 示例 ] 注意:不同账户和数据权限下,具体可用标的请以接口返回为准。 3. 批量获取 ETF 日 K from alphafeed import AlphaFeed af = AlphaFeed() dfs = af.klines.batch( ETF_POOL, period="1d", count=1000, adjust="forward", to_dataframe=True, show_progress=True, ) 我们先把每个 ETF 的收盘价整理成一个矩阵: import pandas as pd def build_close_matrix(dfs: dict[str, pd.DataFrame]) -> pd.DataFrame: series = [] for symbol, df in dfs.items(): one = df.sort_values("trade_date").set_index("trade_date")["close"] one.name = symbol series.append(one) close = pd.concat(series, axis=1).sort_index() close = close.dropna(how="all") return close close = build_close_matrix(dfs) print(close.tail()) 这个 close 就是后面所有研究的基础: trade_date 510300.SH 510500.SH 159915.SZ ... 2026-06-01 ... ... ... ... 2026-06-02 ... ... ... ... 多资产策略的第一步,往往就是把不同标的对齐到同一个日期索引上。 4. 定义轮动信号 我们用一个非常简单的规则: 每天计算每个 ETF 过去 60 个交易日收益率。 选择收益率最高的 ETF。 如果最高收益率小于 0,则空仓。 今天生成的选择,明天才持有,避免未来函数。 lookback = 60 momentum = close / close.shift(lookback) - 1 selected = momentum.idxmax(axis=1) best_momentum = momentum.max(axis=1) signal = pd.DataFrame(0, index=close.index, columns=close.columns) for date in close.index: if pd.notna(best_momentum.loc[date]) and best_momentum.loc[date] > 0: symbol = selected.loc[date] signal.loc[date, symbol] = 1 这里的 signal 是一个持仓矩阵。 如果某天选择 510300.SH,那这一行里 510300.SH 为 1,其他 ETF 为 0。如果所有 ETF 动量都小于 0,则全为 0。 5. 计算组合收益 先计算每个 ETF 的日收益: ret = close.pct_change().fillna(0) 再把信号后移一天: position = signal.shift(1).fillna(0) 组合收益: portfolio_ret = (position * ret).sum(axis=1) equity = (1 + portfolio_ret).cumprod() 加入交易成本: fee = 0.0003 slippage = 0.0002 turnover = position.diff().abs().sum(axis=1).fillna(0) cost = turnover * (fee + slippage) portfolio_ret_after_cost = portfolio_ret - cost equity_after_cost = (1 + portfolio_ret_after_cost).cumprod() 完整回测逻辑并不复杂,但每一步都要清楚: 步骤 目的 计算动量 找近期更强的 ETF 生成 signal 记录当日选择 signal 后移 避免未来函数 计算收益 得到组合日收益 加交易成本 更接近真实交易 生成净值 观察长期表现 6. 计算指标 import numpy as np def calc_metrics(equity: pd.Series, returns: pd.Series) -> dict: total_return = equity.iloc[-1] / equity.iloc[0] - 1 annual_return = (1 + total_return) ** (252 / len(equity)) - 1 drawdown = equity / equity.cummax() - 1 max_drawdown = drawdown.min() sharpe = 0 if returns.std() == 0 else returns.mean() / returns.std() * np.sqrt(252) return { "total_return": total_return, "annual_return": annual_return, "max_drawdown": max_drawdown, "sharpe": sharpe, } metrics = calc_metrics(equity_after_cost, portfolio_ret_after_cost) print(metrics) 再画净值曲线: import matplotlib.pyplot as plt equity_after_cost.plot(figsize=(10, 5), title="ETF Rotation Equity") plt.tight_layout() plt.savefig("etf_rotation_equity.png", dpi=160) 7. 输出每天持有了什么 只看净值不够。轮动策略还应该能解释每天持仓。 holding = position.idxmax(axis=1) has_position = position.sum(axis=1) > 0 holding = holding.where(has_position, "CASH") report = pd.DataFrame({ "holding": holding, "portfolio_ret": portfolio_ret_after_cost, "equity": equity_after_cost, }) print(report.tail(20)) 这份报告能告诉你: 策略最近持有什么。 什么时候切换了 ETF。 空仓发生在哪些阶段。 净值变化和持仓是否对应。 策略不能只是一个黑箱。尤其是新手阶段,你必须能解释结果。 8. 参数扫描:20 日、60 日、120 日动量谁更稳 轮动策略最重要的参数之一是动量周期。 我们可以扫描多个 lookback: def run_rotation(close: pd.DataFrame, lookback: int) -> dict: momentum = close / close.shift(lookback) - 1 selected = momentum.idxmax(axis=1) best_momentum = momentum.max(axis=1) signal = pd.DataFrame(0, index=close.index, columns=close.columns) for date in close.index: if pd.notna(best_momentum.loc[date]) and best_momentum.loc[date] > 0: signal.loc[date, selected.loc[date]] = 1 ret = close.pct_change().fillna(0) position = signal.shift(1).fillna(0) portfolio_ret = (position * ret).sum(axis=1) turnover = position.diff().abs().sum(axis=1).fillna(0) cost = turnover * 0.0005 portfolio_ret = portfolio_ret - cost equity = (1 + portfolio_ret).cumprod() metrics = calc_metrics(equity, portfolio_ret) metrics["lookback"] = lookback return metrics results = [run_rotation(close, lb) for lb in [20, 40, 60, 120]] result_df = pd.DataFrame(results).sort_values("sharpe", ascending=False) print(result_df) 还是那句话:不要只看最优参数。你要看不同参数下结果是否都还能接受。 如果只有 40 日动量很好,20、60、120 都不行,那要警惕过拟合。 9. 可以继续升级的方向 ETF 轮动是一个很好的量化练习框架,因为它可以逐步加复杂度: 升级方向 示例 多持仓 每次持有动量前 2 或前 3 波动率调整 对高波动 ETF 降低权重 趋势过滤 只有指数在长期均线上方才开仓 再平衡频率 从每日切换改成每周或每月 成交额过滤 排除流动性较差的 ETF 加入债券/黄金 提高资产类别分散度 比如多持仓版本,可以让策略更平滑: top_n = 2 signal = pd.DataFrame(0, index=close.index, columns=close.columns) for date in momentum.index: row = momentum.loc[date].dropna() row = row[row > 0].sort_values(ascending=False).head(top_n) if len(row) > 0: signal.loc[date, row.index] = 1 / len(row) 这时策略不再把所有资金压到一个 ETF 上,而是分散到近期表现较强的多个 ETF。 10. 为什么 ETF 轮动适合新手 ETF 轮动有几个优点: 标的数量少,容易理解。 数据结构简单,适合 pandas 练习。 不需要复杂财务数据。 策略逻辑直观,容易解释。 很适合学习多资产回测。 它也有缺点: 趋势反转时可能回撤。 参数容易过拟合。 频繁切换会产生交易成本。 ETF 选择会影响结果。 过去有效不代表未来有效。 新手最应该学到的不是“ETF 轮动一定能赚钱”,而是完整研究流程:选池、取数、对齐、生成信号、延迟持仓、计算收益、加入成本、输出指标、检查参数稳定性。 这套流程学会了,以后研究股票、指数、美股、港股都能复用。 结语 ETF 轮动是普通人学习量化的好入口。 它足够简单,能让你快速跑出结果;又足够真实,能覆盖数据对齐、持仓矩阵、交易成本、参数扫描这些关键问题。 AlphaFeed 在这个过程里承担的是数据底座的角色。你用统一的 Python SDK 获取 ETF K 线和实时行情,把精力放在策略假设和回测逻辑上,而不是反复修数据接口。 先写一个简单版本,再一点点加规则。量化研究就是这样长出来的。 相关链接: AlphaFeed 官网 Python SDK 快速开始 引言:一个细思极恐的假设 近期,市场的持续震荡与非理性波动让“销户离场”的声音在社交媒体上此起彼伏。作为资深策略分析师,我常听到一种误区,认为散户只是市场的“噪音”,甚至觉得“去散户化”是市场走向成熟的标志。但我们必须面对一个冷酷的现实:如果占据A股交易额70%以上的散户真的彻底“撤了摊子”,这个市场非但不会变得更高级,反而会迅速进入崩塌的倒计时。这不仅是个体的无奈离场,更是对整个金融生态底层逻辑的一次连环爆破。 核心论点 1:流动性瞬间“干涸”,两万亿交易额缩水八成 流动性是资本市场的生命线,而散户正是这条生命线最核心的供血者。官方数据显示,散户目前贡献了市场70%以上的交易活跃度,这种高频、分散且自带情感驱动的买卖行为,构成了市场最基础的换手层级。总之,散户的活跃度直接决定了资产的变现效率。 一旦这股力量彻底离场,目前常态化的2万亿至3万亿元成交额将迅速萎缩,极有可能跌至不足5000亿元。当交易量极度匮乏时,买卖价差将呈几何级数放大,市场将从波涛汹涌的蓝海瞬间演变为一潭死水。一言以蔽之,失去散户的流动性支撑,股市将丧失基本的资产定价功能。 核心论点 2:大股东的“好日子”到头了,僵尸股成群出现 在过去的生态中,充足的流动性是大股东能够顺利减持、实现资本套现的重要前提。正是因为有源源不断的散户买盘作为承接,大股东和原始资本才能获得极高的资产流动性溢价。 “大股东的好日子算是走到头了。” 如果没有了散户提供的对手盘,市场的“退出通道”将被彻底锁死。失去流动性的支撑,绝大多数上市公司的股价将面临灾难性的估值折价(Valuation Discount),由于没有足够的买盘承接,大量公司将迅速沦为无人问津的“僵尸股 (Zombie stocks)”,这对于依赖股权质押和再融资的实体企业而言,无疑是灭顶之灾。 核心论点 3:量化交易的“收割机”将原地报废 近年来风光无限的量化私募,其核心盈利逻辑本质上是建立在“收割”散户交易行为的基础之上的。量化算法需要大量的“噪音信号”和高频非理性订单来完成获利,散户提供的正是这种无序的波动性与深度。 如果散户集体离场,市场不仅失去了流动性深度,更失去了算法赖以生存的波动率(Volatility)。没有了散户作为对手方,那些所谓“天才”的自动化收割策略将因缺乏收割目标而原地报废。散户的离场,是对这种技术不对称、极度不公平交易生态的一次釜底抽薪。 核心论点 4:券商与金融机构的“连锁崩塌” 金融中介机构在这场危机中同样无法独善其身。对于券商而言,散户的撤离不仅意味着佣金收入的消失,更意味着整个资金中介链条的断裂。 特别是那些高度依赖利息收入的机构,由于散户消失,转融通业务将彻底沦为摆设,失去对手盘意味着这一盈利模型将难以为继。当底层“活水”枯竭,券商面临的不仅仅是业务萎缩,而是由于资金周转率下降引发的系统性资金难题,整个金融服务链条都将因底层生态的荒漠化而面临集体性覆灭。 6. 深度反思:从“水能载舟”到实体经济的倒退 散户虽然单体力量薄弱,但其提供的流动性却是维持整个金融机器运转的润滑剂。当前这种依靠散户“输血”维持的体系一旦崩溃,其代价将由全社会共同承担。 从宏观角度看,这种崩塌遵循着极为残酷的逻辑链条: 短期内: 资产价格因流动性枯竭而发生非理性暴跌。 中期内: 资本市场的基本功能,如IPO融资、再融资及定价功能将全面瘫痪。 长期内: 金融市场的信用萎缩将传导至实体经济,导致企业融资成本飙升,引发现实世界的经济衰退。 “水能载舟,亦能覆舟。” 散户正是那载动万亿资本市场的“水”,水枯则舟沉,这是最朴素的市场真理。 结语:散户的力量,远比你想象的更沉重 散户并不是市场的“韭菜”,而是市场流动性的生命活水。当这一群体因为对制度透明度、公平性的绝望而选择彻底“撤摊子”时,震动的将是整个金融大厦的根基。 我们必须正视散户作为市场基石的不可替代性。如果不能从根本上改善交易生态、保护散户的合法权益,那么当市场失去最后一名散户时,剩下的机构与量化巨头们,将面对一个连博弈空间都不复存在的废墟。 最后留给各位一个思考:当市场失去了所有的**“散户对手盘”****,剩下的博弈者是在寻找自救的方案,还是在废墟中加速自毁?** 引言:周五的“魔咒”与人性的“试验田” 兄弟们,今天你被“量化”收割了多少? 你是否发现,近期的市场仿佛陷入了一个诡异的循环:每逢周五,总有一根冷酷的中阴线在前方守候。这已经是连续第三周上演“周五砸盘”的戏码了。 看看这令散户窒息的盘面:早盘指数一度冲高至 4078 点,市场情绪刚被点燃,无数人以为行情终于“行了”,纷纷入场加仓。然而,午后却毫无征兆地一路硬生生砸到 4027 点。上午套住追高的,下午割掉恐慌的,尾盘竟还玩起一出“探底回升”,再次勾起你对下周的希望。 这种在一天之内反复拉扯、精准拿捏人性的走势,绝非普通的机构或游资所为。真相是:某些大手笔资金已经把市场情绪当成了“试验田”,把散户当成了“流动性燃料”。你感到挫败,并非因为判断失误,而是陷入了一场从设备到信息完全不对等的“量化收割手术”。 量化真相:不谈感情,只看波动的“收割机” 在量化的逻辑里,没有所谓的“基本面信仰”。它们不看业绩报告,不研读题材逻辑,更不关心政策利好。它们的目标只有一个:捕捉波动。 “他们在市场上没有恐慌,没有贪婪,也没有犹豫。” 普通投资者的交易靠的是眼神、手指和心态,而量化交易靠的是专线、算力和光速报单。当你还在为一笔交易纠结、犹豫、反复思量时,算法已经完成了成千上万次的扫描。散户的恐慌是它们的利润,散户的犹豫则是它们套利的空间。这场对局从一开始,就是一场不对等的降维打击。 第一招:9:24:59 的“毫秒级抢单” 博弈,在开盘前最后一秒就已经结束了。 早上 9:24:59,这是集合竞价的最后关头。当大部分散户还在盯着屏幕犹豫“挂什么价才合适”时,量化算法已秒级扫描完几千只股票。它们能精准检测到哪里有集中的买单和高涨的情绪,并直接加价 0.01 元。 请注意,这加价的 0.01 元不是随意的,而是为了在交易引擎的“价格优先”规则中跳过所有排队指令,实现精准抢筹。开盘瞬间,成交即告完成。等到你终于点下买入键时,量化资金可能已在借助冲高反手卖出,收割已在毫秒间宣告结束。 第二招:算法诱导,武器化你的“乐观情绪” 现在的算法,甚至比你更懂你的人性。它们不仅监测盘面,还会实时爬取股吧、论坛以及各大直播间的数据,通过语义分析监测市场热度。 一旦发现某个题材关注度升高,量化会立刻利用大量小单把股价一点点点火拉升。这种温水煮青蛙式的诱导,本质上是在武器化散户的乐观情绪。当你被这种节节攀升的假象吸引,情绪拉到最满、满仓杀入时,量化会瞬间甩出“八位数”的超级大单直接砸盘。你在山顶站岗,它已在毫秒间落袋为安。 第三招:狩猎止损单,数学计算出的“倒在黎明前” “刚割肉它就涨”绝非巧合,而是算法中精准的数学计算结果。 假设某只股票价格为 10 元,机器通过大数据可以计算出大部分散户的心理止损位在 9 元附近。于是,它会利用资金优势故意将股价砸穿 9 元,来到 8.9 元左右。这种人为制造的破位走势会瞬间引发恐慌性的抛售。 就在你忍痛割肉的刹那,量化算法会瞬间将这些带血的筹码全部接回并直线拉升。这不再是心理博弈,而是基于数学模型的确定性打击,让你在最憋屈的时刻“倒在黎明前”。 避坑指南:如何识别被量化盯上的“机器股”? 在这个算力碾压的时代,保命法则是:不跟机器内卷,不跟算力博弈。 以下是识别量化控盘的三个实战维度: **●**一看分时图: 警惕那种“心电图”式的走势。如果分时线极度不自然,且挂单极其整齐(如清一色的几百手、几千手反复压盘或托盘),这通常是机器在进行高频对倒收割。 **●**二看龙虎榜: 这是最关键的“冒烟火枪”。如果买一到买五的席位金额高度均匀,且均为知名的量化营业部,这标志着“量化抱团(Quant Clusters)”而非游资合力。量化没有长情,今日封板,明日大概率就是第一个反手砸盘的出逃资金。 **●**三看尾盘异动: 特别关注下午 2:30 以后莫名其妙的拉升,或是最后 3 分钟集合竞价时被大单直线“灌下”的走势。这往往是机器在调仓控盘或制造收盘价,没有任何技术面意义。 结语:市场需要波动,但更需要规则 散户是市场的基石,是流动性的根本。看着每天高达 **3 **万亿(3 Trillion) 的成交额,我们必须反思:这其中有多少是机器之间互相掏兜的“无效空转”?这种“机器互掏”并没有为实体经济创造任何价值,仅仅是将普通投资者的辛苦钱变成了算法里的燃料。 这些年,很多散户不是输给了行情,而是输给了那个完全不对等的对手盘。我们不要求市场一直上涨,也不要求市场偏袒弱者,我们只想要一个更公平、更有底线、更有规矩的环境。 我们要问的是:当机器停止旋转、收割殆尽时,这个市场的根基还剩下什么? 市场可以有波动,但规则不能没有底线。在公平的阳光照进现实之前,学会识别并远离这些“收割机”,是每一位普通投资者的必修课。 不要去什么财经站点了,,找半天找不到想看的品种合约,费劲找到了还是个不缴费就延时的。 直接去这个https://www.immtb.com这个地方,找客服要就行了。 之前我分享过一个小工具网站,支持国内主流量化平台,可以让 AI 直接帮你写各个平台的策略代码,直接生成可运行的策略代码,代码质量远高于直接使用 DeepSeek、Trae 等平台。上线之后获得了非常多朋友的好评。 大家可以直接用描述策略,然后一键生成可运行的完整策略代码,也可以把它当做一个API 查询工具。 AI工具平台:https://iris.findtruman.io/ai/tool/ai-quantitative-trading/ 我看平台正在开发SuperMind支持,很快就能支持同花顺了 过去学量化,路径通常很长: 先学 Python,再学 pandas,再学金融市场基础,再学技术指标,再学回测,再学调参,再学实盘接口。每一步都没错,但对普通人来说,门槛确实高。很多人不是没有想法,而是卡在“我不知道怎么把想法写成代码”。 现在有了 Codex 这类编程智能体,学习路径可以换一种方式。 你不需要先把所有语法背完,也不需要先掌握完整的回测框架。你可以先做一件事:把数据源接好,然后让 Codex 根据你的研究问题写代码、运行、报错、修复、优化。 AlphaFeed 在这里很适合做量化入门的数据底座。它的 Python SDK 足够直接:安装、初始化、拿 K 线、拿实时行情、拿五档盘口、拿标的信息。Codex 只要知道这套接口怎么用,就可以围绕它生成策略研究代码。 这篇文章讲一个实战流程:如何把 AlphaFeed 接入 Codex,然后让 Codex 帮你完成一个从想法到回测结果的量化研究。 1. 先告诉 Codex:数据源怎么接 你可以把下面这段提示词直接发给 Codex: 我正在做量化研究,数据源使用 AlphaFeed。 请记住 AlphaFeed Python SDK 的基本用法: 安装: pip install alphafeed 初始化: from alphafeed import AlphaFeed af = AlphaFeed(api_key="your-api-key") 也可以从环境变量读取: export ALPHAFEED_API_KEY="your-api-key" af = AlphaFeed() 常用标的代码: - A 股上交所:600519.SH - A 股深交所:000001.SZ - 美股:AAPL.US - 港股:00700.HK 获取 K 线: df = af.klines.get("600519.SH", period="1d", count=300, adjust="forward", to_dataframe=True) 批量获取 K 线: dfs = af.klines.batch(["600519.SH", "000001.SZ"], period="1d", count=300, adjust="forward", to_dataframe=True) 获取日内分时: df = af.klines.intraday("600519.SH", period="1m", to_dataframe=True) 获取实时行情: quotes = af.quotes.get(symbols=["600519.SH", "000001.SZ"], to_dataframe=True) 获取全量 A 股行情: all_cn = af.quotes.get(universes="CN_Stock", to_dataframe=True) 获取五档盘口: depth = af.depth.get("600519.SH") 常见 DataFrame 字段: - trade_date - trade_time - open - high - low - close - volume - amount - symbol - name 请用这些接口帮我写策略研究代码,并在每次写回测时注意: 1. 不要使用未来函数。 2. 信号必须 shift 后再计算收益。 3. 输出累计收益、年化收益、最大回撤、夏普比率。 4. 尽量把代码拆成函数,便于我复用。 如果你想让 Codex 读取官方文档,可以补一句: AlphaFeed Python SDK 文档在这里: https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart 请优先按这个文档里的接口写代码。 这个动作很关键。很多人使用 AI 写量化代码,失败不是因为 AI 不会写策略,而是因为它不知道你实际的数据源长什么样。你把 AlphaFeed 的接口、字段、标的格式交代清楚,后面的生成质量会明显提高。 2. 让 Codex 先写一个最小可运行回测 不要一上来就让 Codex 写“年化 30%、回撤 5% 的策略”。这类目标容易把研究带偏。 更好的第一句是: 请用 AlphaFeed 写一个最小可运行的双均线回测脚本。 要求: 1. 标的使用 600519.SH。 2. 获取最近 800 根日 K,前复权。 3. 计算 20 日和 60 日均线。 4. 20 日均线高于 60 日均线时持有,否则空仓。 5. 信号后移一天,避免未来函数。 6. 输出累计收益、年化收益、最大回撤、夏普比率。 7. 保存净值曲线图到 ma_strategy.png。 Codex 大概率会生成类似这样的结构: import numpy as np import pandas as pd import matplotlib.pyplot as plt from alphafeed import AlphaFeed def calc_metrics(equity: pd.Series, returns: pd.Series) -> dict: total_return = equity.iloc[-1] / equity.iloc[0] - 1 annual_return = (1 + total_return) ** (252 / len(equity)) - 1 drawdown = equity / equity.cummax() - 1 max_drawdown = drawdown.min() sharpe = 0 if returns.std() == 0 else returns.mean() / returns.std() * np.sqrt(252) return { "total_return": total_return, "annual_return": annual_return, "max_drawdown": max_drawdown, "sharpe": sharpe, } def run_backtest(symbol: str) -> tuple[pd.DataFrame, dict]: af = AlphaFeed() df = af.klines.get( symbol, period="1d", count=800, adjust="forward", to_dataframe=True, ) df = df.sort_values("trade_date").reset_index(drop=True) df["ma20"] = df["close"].rolling(20).mean() df["ma60"] = df["close"].rolling(60).mean() df["signal"] = (df["ma20"] > df["ma60"]).astype(int) df["position"] = df["signal"].shift(1).fillna(0) df["ret"] = df["close"].pct_change().fillna(0) df["strategy_ret"] = df["position"] * df["ret"] df["equity"] = (1 + df["strategy_ret"]).cumprod() df["buy_hold"] = (1 + df["ret"]).cumprod() metrics = calc_metrics(df["equity"], df["strategy_ret"]) return df, metrics df, metrics = run_backtest("600519.SH") print(metrics) df.set_index("trade_date")[["equity", "buy_hold"]].plot(figsize=(10, 5)) plt.tight_layout() plt.savefig("ma_strategy.png", dpi=160) 这份代码不复杂,但它有一个重要意义:它把“想法”变成了“可运行研究对象”。 从这里开始,你就可以让 Codex 继续迭代,而不是自己在语法里打转。 3. 让 Codex 帮你做参数扫描 下一步不要急着换策略。先问一个基础问题:均线参数对结果敏感吗? 提示词: 请在刚才的 AlphaFeed 双均线策略基础上,增加参数扫描。 要求: 1. short_window 测试 [5, 10, 20, 30]。 2. long_window 测试 [40, 60, 120, 250]。 3. short_window 必须小于 long_window。 4. 每组参数输出 total_return、annual_return、max_drawdown、sharpe。 5. 最后按 sharpe 从高到低排序。 6. 不要只输出最优结果,也要输出完整参数表,避免过拟合。 为什么要强调“不要只输出最优结果”? 因为量化研究里,最危险的东西之一就是参数过拟合。你扫 1000 组参数,总会找到一组历史表现很好。但这不代表它未来也好。完整参数表能让你观察策略是否有“参数稳定区间”。 如果只有 17/43 一组参数特别好,周围参数都很差,那更像偶然。如果 10/60、20/60、20/120 都还不错,说明策略逻辑可能更稳。 4. 让 Codex 扩展到股票池 单只股票回测只是玩具。真正研究时,你需要一组标的。 提示词: 请把策略扩展到多标的回测。 使用 AlphaFeed 批量获取 K 线: dfs = af.klines.batch(symbols, period="1d", count=800, adjust="forward", to_dataframe=True, show_progress=True) 股票池: ["600519.SH", "000001.SZ", "601318.SH", "600000.SH", "000858.SZ"] 要求: 1. 对每只股票单独运行同一个双均线策略。 2. 输出每只股票的收益、回撤、夏普。 3. 再计算一个简单等权组合:每天持有所有 signal=1 的股票,平均分配仓位。 4. 注意不同股票日期可能不完全一致,需要按 trade_date 对齐。 5. 输出组合净值曲线图。 这里开始,Codex 的价值会更明显。 对齐日期、处理缺失值、组合收益计算,这些细节很容易写错,也很容易消耗新手的耐心。你可以让 Codex 写第一版,然后让它自己检查: 请检查这份回测代码是否存在未来函数、日期错位、收益重复计算、缺失值处理不当的问题。 如果有,请直接修改代码,并解释修改原因。 这比“从零背 pandas”更适合普通人入门。你仍然需要理解代码,但你不用把每个低层细节都靠手搓完成。 5. 让 Codex 加入交易成本和滑点 没有成本的回测,很容易过度乐观。 提示词: 请给策略加入交易成本。 要求: 1. 当 position 发生变化时,认为发生一次交易。 2. 单边手续费设置为 0.0003。 3. 滑点设置为 0.0002。 4. 总交易成本 = abs(position.diff()) * (fee + slippage)。 5. 策略收益 = position.shift 后的持仓收益 - 交易成本。 6. 输出加入成本前后的指标对比。 加入成本后,你会发现很多高频切换的策略表现大幅下降。这不是坏事,而是回测更接近真实世界了。 对于普通人来说,量化学习最重要的不是一开始就写复杂模型,而是尽早建立“研究纪律”: 研究纪律 目的 信号后移 避免未来函数 加交易成本 避免高估收益 多标的测试 避免个股偶然性 参数扫描 检查稳定性 输出完整指标 避免只看收益 Codex 可以帮你写代码,但这些原则需要你自己掌握。掌握之后,你给 Codex 的指令会越来越清楚,得到的结果也会越来越可靠。 6. 用 AlphaFeed 实时行情做盘中监控 历史回测之外,你还可以让 Codex 写一个盘中监控脚本。 提示词: 请使用 AlphaFeed 写一个盘中行情监控脚本。 要求: 1. 使用 af.quotes.get(universes="CN_Stock", to_dataframe=True) 获取全量 A 股实时行情。 2. 计算涨跌幅,如果 ext.change_pct 存在就优先使用;否则用 (last_price - prev_close) / prev_close。 3. 筛选涨幅前 20、跌幅前 20、成交量前 20。 4. 每 60 秒刷新一次。 5. 输出到终端,格式尽量清晰。 6. 代码里加入异常处理,接口失败时等待后重试。 这类脚本看起来简单,但很适合练习“研究到观察”的过渡。 你可以进一步让 Codex 加规则: 请在盘中监控脚本里加入一个观察条件: 如果某只股票涨幅超过 3%,且成交量位于全市场前 20%,就打印 ALERT。 注意,这仍然只是观察,不是交易建议。量化研究的第一步是看清数据和规则,不是马上下单。 7. 一套适合普通人的 Codex 量化提示词模板 如果你不知道怎么问,可以用这个模板: 我想研究一个量化策略,请你用 AlphaFeed Python SDK 帮我完成。 研究目标: [写你的想法,比如:突破 20 日新高后持有 5 天] 数据要求: - 市场:[A 股/美股/港股] - 标的:[例如 600519.SH,或一个股票列表] - K 线周期:[1d/1m/5m] - 数据长度:[例如最近 800 根] - 复权方式:[forward/none] 回测要求: - 不使用未来函数 - 信号后移一天 - 加入交易成本,单边 0.0003 - 输出累计收益、年化收益、最大回撤、夏普比率 - 输出净值曲线图 代码要求: - 使用 pandas - 拆成函数 - 可以直接运行 - 如果运行报错,请根据错误修改 这个模板的好处是,它把“我要一个策略”拆成了 Codex 可以执行的工程任务。 8. AI 不会替你解决的部分 Codex 能帮你写代码、调试、改结构、检查常见错误,但它不会替你判断一个策略是否真的值得实盘。 你仍然需要自己回答几个问题: 策略逻辑是否有经济含义? 收益是否来自少数极端样本? 参数是否过拟合? 回撤是否符合你的承受能力? 交易频率是否会被成本吃掉? 数据频率和执行频率是否匹配? 换句话说,AI 可以降低技术门槛,但不能取消研究责任。 结语 普通人做量化,过去最难的是入门链条太长:数据、代码、回测、调试,每一步都可能让人放弃。 AlphaFeed + Codex 提供了一条更短的路径:AlphaFeed 负责把市场数据变成清晰可用的 Python 接口,Codex 负责把你的研究想法快速转成可运行代码。你要做的,是提出问题、检查逻辑、理解结果,并持续迭代。 这并不会让量化变成“一键赚钱”。但它会让量化学习从“先学半年再动手”,变成“今天就能跑出第一条净值曲线”。 相关链接: AlphaFeed 官网:AlphaFeed