复利娃2026-10-28 发布 想咨询一下这个量化实验室是出了什么故障ma?花钱也不能用了 一、量化实验室是什么? 量化实验室是SuperMind量化平台最新推出的AI功能,它不是再给你一堆冷冰冰的工具,而是用AI Agent把你的投研想法变成现实——无论是复杂的因子研究,还是策略的代码生成与回测,统统交给它。 继续加码:特惠延续!每周体验额度翻2倍!(原50 Credits/周,限时升级至100 Credits/周)。活动截止至 2026-07-12 23:59:59,快来试试AI如何重塑你的量化研究! 1.1 因子研究 支持从研究想法、已有公式或研报逻辑出发,Agent自动生成因子表达式并回测验证。适合把“我想研究某个市场规律”这类想法,快速变成可以检验的数据结果。 1.2 策略代码生成 用自然语言描述策略逻辑,Agent自动生成可执行源码并回测: 支持Python策略和公式策略两种类型 Python策略适合选股、多因子、择时、风控、资金管理等复杂逻辑 公式策略适合单标的择时、技术指标、期货或股票的轻量策略 生成策略源码后自动执行回测,结果文件里能看到指标、交易记录和策略表现 支持多轮对话,哪里不满意就直接说,Agent继续改代码、重新跑结果 二、支持的策略类型 量化实验室支持两种策略类型:Python策略和公式策略。两者定位不同,各有适用场景。 2.1 Python策略 Python策略自由度更高,适合把一套完整交易框架写出来: 多股票选股:支持从指数成分股、行业板块或全A股票池中筛选股票 多因子模型:打分排名、因子回归、因子中性化 复杂风控:动态止损、移动止盈、仓位控制、个股持仓上限 灵活调仓:日、周、月任意频率,支持条件触发 完整回测:生成策略源码后直接执行回测,沉淀结果报告 2.2 公式策略 公式策略基于同花顺指标公式语法,更适合单标的、技术指标型策略: 单标的回测:主要针对单只股票、指数或期货合约 技术指标:MACD、KDJ、布林带等经典指标 交易信号:金叉死叉、突破、超买超卖、ATR波动突破 期货策略:日内交易、趋势跟踪、止损止盈规则 2.3 两者对比 能力 Python策略 公式策略 选股范围 全市场动态股票 提前指定单只标的 择时逻辑 任意复杂 指标信号、突破信号等 风控体系 动态止损、移动止盈、仓位管理 简单止盈止损 资金管理 等权、市值加权、风险平价 简单资金调整 因子研究 多因子打分、排名、回归 不支持 编程语法 Python 同花顺公式 回测结果文件 strategy_backtest_*.md funcat_backtest_*.md 适用场景 A股选股、多因子策略 股票/期货单标的择时 2.4 如何选择? 想做A股选股、多因子策略 → 选Python策略 想做股票/期货日内、单标的技术指标择时 → 选公式策略 不确定 → 选Python策略,通用性更强 三、使用方法 3.1 整体流程 进入量化实验室 → 选择Agent → 描述策略 → AI生成代码 → 自动回测 → 查看结果 → 多轮优化 3.2 第一步:进入量化实验室 打开 同花顺SuperMind量化平台 注册登录(同花顺账号通用) 点击上方导航栏「我的研究」-「量化实验室」 3.3 第二步:选择Agent 根据你的需求选择合适的Agent: Agent 适用场景 量化助手 生成Python策略或公式策略,并执行回测(最常用) 因子研究Agent 从研究想法出发,生成因子 因子复现Agent 把公式/伪代码翻译成可执行表达式 生成策略代码时,直接选择「量化助手」即可。在使用时,最好在描述中明确说“生成Python策略”或“生成公式策略”,否则Agent可能会理解错方向。 3.4 第三步:描述你的策略 用大白话把策略逻辑讲清楚,关键是这几个要素: 要素 说明 示例 买什么 股票池 "沪深300成分股"、"全A股剔除ST" 什么时候买 开仓条件 "金叉买入"、"突破20日高点" 什么时候卖 平仓条件 "死叉卖出"、"亏损5%止损" 怎么分钱 资金管理 "等权重"、"按因子加权" 回测区间 起止时间 "2023年到2024年" 回测频率 运行频率 "日频"、"5分钟频率" 基准指数 对比基准 "沪深300"、"中证500" 描述示例: 写一个Python策略: - 股票池:沪深300成分股 - 买入:5日均线上穿20日均线,次日开盘买 - 卖出:5日均线下穿20日均线,次日开盘卖 - 资金:每笔买入5万 - 回测:2023-2024年,初始资金1000万,日频 公式策略可以这么说: 生成一个公式策略: - 标的:300033.SZ - 信号:收盘价上穿20日均线买入,下穿20日均线卖出 - 风控:亏损5%止损,盈利后从最高点回撤3%止盈 - 回测:2023-2025年,日频 3.5 第四步:查看回测结果 AI生成代码并执行回测后,策略源码和回测结果会保存到文件中: Python策略:strategy_backtest_*.md 公式策略:funcat_backtest_*.md 报告通常包含: 核心指标:总收益率、年化收益率、最大回撤、夏普比率、胜率、盈亏比、交易次数 净值曲线:策略收益 vs 基准收益 3.6 第五步:多轮优化 不满意?直接告诉AI怎么改: # 加个过滤条件 在刚才基础上,加个成交量过滤,金叉时成交量要大于5日均量的1.5倍 # 优化风控 再加个动态止损:从最高点回撤5%止损,同时3%移动止盈 # 调整参数 把MACD参数改成(8,17,9),回测时间延长到2024年 每一轮AI都会自动修改代码、重新回测、出新报告。反复调整,直到满意为止。 当然,AI生成的代码也需要用户自己甄别。它能大幅降低从想法到回测的门槛,但重要参数、交易假设和异常结果仍然建议自己再检查一遍。 3.7 剩余额度查看与充值 我们为每位用户提供了一定的免费体验额度,如有更大的使用需求,也可以订阅付费套餐。 四、实战案例 案例1:双均线公式策略 策略思路:最经典的趋势跟踪策略。收盘价上穿20日均线买入,下穿20日均线卖出,再加上止损止盈。这个案例适合用公式策略快速上手。 你怎么说: 生成一个公式策略: 1. 回测标的: - 标的:同花顺 - 频率:日频 - 回测区间:2023-01-01 至 2025-01-01 2. 开仓条件: - 计算20日收盘价均线MA20 - 当收盘价从下方上穿MA20时买入 3. 平仓条件: - 当收盘价从上方下穿MA20时卖出 - 买入后亏损达到5%时止损 - 买入后盈利创新高,再从最高点回撤3%时止盈 案例2:动量选股+止损策略 策略思路:选近期涨得好的股票(动量效应),但排除涨太多的(避免追高),加上硬性止损保护。 你怎么说: 生成一个Python选股策略: 1. 选股条件: - 股票池:中证500成分股 - 剔除ST股、停牌股、上市不足120日的股票 - 过去20日收益率排名前20%(动量强) - 过去5日平均换手率大于3%(确保流动性) - 排除过去20日涨幅超过30%的股票(避免追高) 2. 开仓条件: - 每周一开盘时,根据上述条件筛选出目标股票池 - 买入所有符合条件的股票,以开盘价执行 3. 平仓条件: - 每周一调仓时,不在新目标池中的股票全部卖出 - 个股亏损达到8%,无论是否到调仓日,立即止损卖出 - 个股盈利达到20%止盈 4. 资金分配: - 初始资金100万 - 持仓上限20只股票 - 采用等权重分配:总资金/持仓股票数 = 每只股票的分配金额 - 如果筛选出的股票超过20只,按动量排名取前20只 - 买入时按100股整数倍取整 5. 回测参数: - 回测区间:2022-01-01 至 2024-12-31 - 基准指数:中证500 - 初始资金:100万 - 回测频率:分钟 案例3:资金流向+波动率复合策略 策略思路:跟着主力资金走,但要选波动适中的股票(资金流入说明有人看好,波动适中说明走势稳健)。 你怎么说: 设计一个Python策略: 1. 选股条件: - 股票池:全A股(剔除ST股、停牌股、上市不足120日的次新股) - 因子1 - 资金流向:过去5日主力资金净流入(大单+特大单买入 - 大单+特大单卖出)/ 总成交额 > 0 - 因子2 - 波动率:过去20日收益率的年化波动率,要求处于全市场中位数±1个标准差之间 - 两个条件同时满足才入选 2. 开仓条件: - 每两周的第一个交易日开盘时执行选股 - 买入所有符合条件的股票 3. 平仓条件: - 每两周调仓时,不在新目标池中的股票全部卖出 - 个股亏损达到10%,立即止损 - 个股持有超过30个交易日仍未盈利,考虑卖出(避免长期套牢) 4. 资金分配: - 初始资金100万 - 持仓上限15只股票 - 采用等权重分配:可用资金/新买入股票数 - 卖出股票释放的资金,在下一个调仓日再分配 - 保留5%的现金作为缓冲,避免频繁满仓操作 5. 调仓频率: - 每两周调仓一次(即每10个交易日) 6. 回测参数: - 回测区间:2023-01-01 至 2024-12-31 - 基准指数:中证800 - 初始资金:100万 - 回测频率:分钟 案例4:多因子打分排名策略 策略思路:综合多个维度给股票打分,选出综合表现最好的。类似基金公司的量化选股模型。 你怎么说: 创建一个多因子Python策略: 1. 选股条件: - 股票池:沪深300成分股 - 剔除ST股、停牌股 - 三个因子,各自权重: - PE_TTM(市盈率,越低越好):权重30% - ROE(净资产收益率,越高越好):权重40% - 过去60日收益率(动量,越高越好):权重30% - 对每个因子进行标准化打分(0-100分) - 加权计算综合得分 = PE得分×30% + ROE得分×40% + 动量得分×30% - 选择综合得分排名前20的股票 2. 开仓条件: - 每月第一个交易日开盘时执行选股 - 买入综合得分前20名的股票 3. 平仓条件: - 每月调仓时,不在新目标池中的股票全部卖出 - 个股亏损达到15%,立即止损 - 如果某只股票连续两个月综合得分跌出前30名,下个月强制卖出 4. 资金分配: - 初始资金100万 - 固定持仓20只股票 - 采用等权重分配:总资金/20 = 每只股票5万元 - 调仓时,先卖出需要清仓的股票,再买入新股票 - 买入顺序按综合得分从高到低,确保高分股票优先获得资金 - 如果资金不足,优先买入得分最高的股票 5. 调仓频率: - 每月第一个交易日调仓 6. 回测参数: - 回测区间:2022-01-01 至 2024-12-31 - 基准指数:沪深300 - 初始资金:100万 - 回测频率:日频 五、常见问题 Q:AI生成的代码一定正确吗? A:不一定。AI能显著提高从想法到回测的速度,但生成代码、回测参数和交易假设仍然需要自己甄别,尤其是用于真实交易前。 Q:生成的代码有bug怎么办? A:直接告诉AI“回测报错了,错误信息是xxx”,它会根据报错继续修改代码并重新回测。 Q:生成后还能继续改吗? A:可以。比如“加一个成交量过滤”“把止损从8%改成5%”“回测区间延长到2025年”,都可以在同一个会话里继续说。 Q:策略能导出到本地吗? A:可以。Python策略会沉淀Python源码和 strategy_backtest_*.md 报告,公式策略会沉淀公式策略结果和 funcat_backtest_*.md 报告。 Q:可以免费使用吗? A:我们为每位用户每周提供了50 Credits的体验额度,可以满足多个策略代码生成任务。2026-07-12 23:59:59前体验额度限时2倍! 六、总结 传统方式 量化实验室方式 学Python语法 → 学量化框架 → 写代码 → 调试 → 回测 说策略想法 → 生成Python/公式策略 → 自动回测 → 看报告 耗时:几天到几周 耗时:几分钟 不管你是量化新手想入门,还是老手想快速验证想法,SuperMind量化实验室都值得一试。尤其是策略代码生成这一步,它把“我有个策略想法”和“我看到了回测结果”之间的距离,压到了几分钟。 【重磅更新】 支持生成和执行通用代码 除策略代码外,量化实验室目前也支持生成通用python代码并执行,例如可以做数据处理、分析、可视化输出等。 与量化平台其他功能进行交互 supermind-cli 是Agent与SuperMind 量化平台进行交互的skill,可以让用户快速完成策略管理、回测与自选板块管理等。 管理个人策略仓库 将AI 生成的策略同步至云端仓库,或拉取其他策略的代码。推送后可以在“我的策略”-“策略研究”中看到这个策略。 示例:“把刚才写好的双均线策略推送到策略仓库里,命名为神奇均线”、“帮我看看云端现在有哪些策略” 异步回测 推送完成后可以发起异步回测任务。回测完成之后可在“我的策略”-“策略研究”-“回测列表”中查看回测详情。 示例:“用过去两年的数据跑一下这个策略的回测,初始资金500W” 维护自选板块 新增、更新或查询自选板块,添加后同花顺行情客户端可见。 示例:“帮我把这几只白酒股加到自选板块里”、“查一下我现在的自选板块都有哪些股票” 相关链接: AI Lab帮助文档 API文档 因子研究指南 回测引擎说明
白胖二2026-10-28 发布 各位大神: 如何获得往日的个股成交明细? 当前只能在客户端的成交明细界面,手动右键导出,能否有批量获取的办法? 谢谢! 导言:散户如何打破机构的“信息与技术壁垒”? 在股市里,为什么普通散户总是频频沦为被收割的“韭菜”? 顶尖机构炒股,靠的是海量的数据分析、专业的量化算法,以及背后一整支高薪聘请的专业投研团队。 相比之下,普通散户请不起顶级分析师,买不起高昂的算法模型,平时看盘只能依赖几条简单的指标线,甚至完全靠“凭感觉”去买卖。这种在信息、技术和专业度上的天壤之别,本质上就是在凭运气给机构**“送钱”****。** 不过,随着人工智能技术的爆发,这种不平等正在被彻底打破!这套豆包AI选股指令,我和团队亲测有效,谁用谁会有收获。只要你掌握了对豆包AI的系统化“调教”方法,精通5组关键提示词(Prompt),就能免费拥有一个不输职业交易员的专属金牌投研团队。 请时刻牢记那句硬道理:“投资是认知的变现,不是赌博。” 摆脱盲目猜想,学会用客观数据和严密逻辑装备自己,才是散户逆风翻盘的唯一解。 实操干货:豆包AI“五步选股法”全流程拆解 想要让豆包AI真正为你所用,关键在于构建一套严密的投研闭环。以下连续的五个步骤,包含了从全网大范围筛选到最终拉网式风控的全过程。 第一步:全网扫描,筛选潜力标的 【核心目的】:快速大面积扫描全网标的,将资质差的“杂毛股”直接挡在门外。 【逻辑拆解】:指挥豆包AI按照“价值因子”(如低估值、高股息)与“质量因子”(如ROE表现良好、现金流充沛)设定基础门槛,对全网股票进行大范围初筛,过滤掉缺乏基本支撑的垃圾股,锁定候选股票池。 【豆包AI****指令模板】: “请作为资深量化研究员,按照‘价值因子’(如合理的市盈率/市净率、估值安全垫)和‘质量因子’(如净资产收益率ROE > 12%、经营性现金流充沛)对全网A股进行大范围扫描筛选。请剔除存在退市风险、财务异常或实控人合规问题的标的,初步筛选出10只最具潜力的候选股票,并列出核心推荐理由。” 💡 博主实战贴士:如果AI给出的列表偏多,可以追问一句:“请按近三年的平均ROE由高到低重新排序,仅保留前5只。” 第二步:深挖基本面,确认财务与经营可靠性 【核心目的】:扎实完成“保命”防坑,剔除财务造假或经营恶化的隐患标的。 【逻辑拆解】:指挥豆包AI对初选标的进行深度基本面“体检”,重点核查其历年财报数据与实际经营状况,确认公司的业务逻辑是否顺畅,为投资建立坚实的安全垫。 【豆包AI****指令模板】: “请对我初选的标的 [股票名称/代码] 进行深度基本面诊断:重点分析其近三年的财报数据(包括营业收入增速、净利润质量、资产负债率、自由现金流状况)以及主营业务的经营可靠性,判断其基本面是否扎实,并列出该股是否存在财务造假或经营恶化的隐患。” 第三步:研判资金情绪,看穿机构真实意图 【核心目的】:精准洞察资金动向与盘面情绪,看穿机构是在“洗盘”还是“诱多出货”,避免追高被套或被甩下车。 【逻辑拆解】:指令豆包AI结合当下的市场情绪、盘面实时数据、换手率以及成交量能等维度进行综合研判,让客观数据说话,准确识别聪明资金的真实意图。 【豆包AI****指令模板】: “请结合 [股票名称/代码] 最近5个交易日的盘面数据,综合分析其资金换手率、成交量能变动以及主力资金净流入情况。请用数据说话,研判当前市场情绪,并帮我分析主力资金究竟是在‘洗盘震仓’还是在‘诱多出货’?” 第四步:评估成长空间,锁定细分领域龙头(高价值核心) 【核心目的】:深度挖掘具备爆发力和持续成长潜力的细分龙头(这组指令价值极高,是整套体系的核心)。 【逻辑拆解】:要求豆包AI评估公司在细分领域内的竞争壁垒、市场成长空间及未来发展的长期潜力。职业投资必须恪守一条铁律:没有成长空间的公司,再便宜也不能碰! 【豆包AI****指令模板】: “请评估 [股票名称/代码] 在其细分领域的行业地位与核心竞争优势(如专利、渠道、品牌壁垒)。结合该细分行业未来3-5年的市场空间与增长驱动力,深度分析该公司的长期成长潜力,判断其是否具备成为高成长细分龙头的能力。” 第五步:全方位风控,先算风险再算利润 【核心目的】:树立职业交易员的风控思维,下注前拉网式排查潜在风险,防范重大亏损。 【逻辑拆解】:职业选手和管大资金的人选股票,最基本的操守就是**“先算风险,再算利润”。让豆包AI对股票开展全方位的风险诊断,严格排查经营风险、行业风险、估值风险和市场波动风险**四大维度。 【豆包AI****指令模板】: “请作为首席风控官,对 [股票名称/代码] 进行一次拉网式的全方位风险评估。请重点排查以下四个维度:1. 经营风险(如客户集中度过高、供应链风险);2. 行业风险(如政策监管变动、技术被替代风险);3. 估值风险(如历史估值分位数、短期溢价过高);4. 市场波动风险(如大盘系统性风险、Beta系数)。最后请给出整体风险等级评估及风控应对建议。” 总结与散户避坑心法 通过以上5组指令,我们就搭建起了一套严密的投研闭环:全网初筛(剔除杂毛) -> 深度基本面(保命防坑) -> 资金情绪面(看穿意图) -> 成长空间评估(锁定龙头) -> 全方位风控(风险优先)。有了这套AI赋能的标准化流程,散户也能拥有媲美顶级机构的投研执行力。 散户避坑三条核心心法: ●职业风控优先:时刻保持职业选手的思维习惯。大资金操盘的第一准则是“先算风险,再算利润”,风控做不好,赚再多钱也只是暂时的“纸上富贵”。 ●坚决远离无成长标的:股价便宜绝不是买入的理由,时刻记住“没有成长空间的公司,再便宜也不能碰”,必须把资金聚焦在有潜力的细分龙头身上。 ●**用数据认知替代主观情绪:炒股绝非博彩,“投资是认知的变现,不是赌博”**。善用豆包AI等科技工具将盘面量能、换手率和基本面转化为客观的数据认知,才能在市场中稳健前行。 引言:在复杂市场中寻找确定性 面对当前震荡加剧、多变复杂的股市环境,不少散户朋友频频踩坑——追涨遭遇高位洗盘,一卖又逢低位反弹,看盘毫无头绪,甚至陷入了对交易方向的强烈迷茫。在主力资金花样百出的“假突破”与“骗线”面前,散户该如何看清盘面真实意图,建立不慌张的交易心态? 答案在于回归市场最基础、最真实的语言——成交量。价格可以靠少量资金捏造,但真金白银堆出来的成交量绝无法伪造。资深投资者“老”将自己多年的实战研究与复盘经验,精炼成了通俗易懂的看盘口诀。哪怕没有任何深厚的财务背景,只要看懂量柱消长背后的博弈逻辑,就能轻松看清市场主线,建立属于自己的确定性交易体系。 核心干货:成交量六大看盘口诀全解析 在运用口诀前,首先要明确看盘界面中放量与缩量的基本判断标准: **●**放量:当前(右侧)成交量柱高于前一周期(左侧)成交量柱,代表资金交易活跃、多空分歧增大。 ●缩量:前一周期(左侧)成交量柱高于当前(右侧)成交量柱,代表市场交投清淡、资金观望情绪浓厚。 深度剖析:口诀背后的筹码博弈逻辑 **●**放量上涨,必然回调 博弈逻辑:短线获利盘集中兑现,主力换手频繁。当上涨伴随着成交量剧烈放大时,往往意味着追高情绪过热,市场筹码开始松动。由于短期多头能量消耗过快,股价后续必然需要通过洗盘回调来消化获利盘、重新凝聚共识。 **●**放量下跌,必然反弹 博弈逻辑:恐慌盘集中砸盘离场,低位承接资金介入。下跌途中的爆量,说明场内不坚定筹码在割肉出局,同时场外抄底资金在低位剧烈接盘。一旦恐慌抛压被快速吸收,市场极易触发超跌反弹行情。 **●**缩量上涨,继续上涨 博弈逻辑:主力控盘度极高,筹码高度锁定。股价持续走高而成交量并未放大,说明场内抛压极轻,主力无需消耗大量资金即可推升股价。这表明上涨趋势健康且尚未见顶,后市将延续升势。 **●**缩量下跌,还会下跌 博弈逻辑:买盘严重匮乏,市场缺乏流动性承接。“无量阴跌”往往最伤散户,这代表主力并未在此处筑底建仓,跟风资金不敢入场,阴跌探底过程远未结束,切忌盲目抄底。 **●**放量不涨,头部已现 博弈逻辑:主力高位派发筹码,多空分歧达到极值。在相对高位出现惊人成交量,股价却涨幅微弱甚至收出长上影线,这是典型的“天量滞涨”。说明主力正趁着散户追高疯狂出货,是明确的见顶信号。 **●**缩量不跌,底部再次确认 博弈逻辑:抛盘彻底衰竭,地量见地价。股价跌势终止,成交量持续萎缩至极点,表明市场上想卖的人已经卖光,空头力量完全耗尽。这种“无量平盘/微涨”标志着主力筑底完成,底部区域得到明确确认。 实战指南:跟紧“老”的日常研究与复盘逻辑 掌握了量价口诀,还需要配合系统的日常跟踪,才能把看盘规律内化为交易本能。“老”为大家规划了清晰的学习路径: 1.研读每日第一条视频·****看盘心法(谈心法): “老”每天都会把最新研究的市场方向与逻辑,融入到第一条视频的“看盘心法(谈心法)”中。内容深入浅出,哪怕只有小学文化,看完也能对当天的盘面脉络与操作方向一目了然。 **2.**参与周末直播深度复盘: 每到周末,“老”会通过直播复盘带大家全面梳理整周的量价结构、主力资金流向以及筹码分布演变,厘清下一阶段的应对策略。 **3.**验证实战硬核实力: 股市投资靠的是真本事,只需连续关注并跟踪“老”的研究逻辑几天,就能直观切身地感受到这套看盘心法的实用性与硬实力。 “投资的道路漫长而艰难。老陪着大家并肩作战。” 结语与祝愿:九月逆风翻盘,互动集福 股市虽然不可预测,但资金的痕迹有迹可循。只要看懂成交量,就能在迷茫的行情中找准航向。 本文核心要点提炼: **1.**掌握量价辨析:准确识别“放量”(右高于左)与“缩量”(左高于右),深刻理解六大口诀背后的筹码锁仓、主力派发与抛盘竭尽等博弈逻辑。 **2.**坚持日常复盘:每日锁定第一条视频的“看盘心法(谈心法)”,周末配合直播复盘,做到心中有数、顺势而为。 3.保持坚定心态:面对漫长且艰难的投资道路,不被短期波动动摇,跟紧专业逻辑,实现理性交易。 从白嫖破产到实盘基建,一文讲透Tushare、AKShare、yfinance、Polygon、TickDB的真实能力边界 信息最后核实:2026年2月11日 开篇:2026年,数据源不再是“免费午餐” 两年前,圈子里流行一句话:“数据源?requests.get一把梭,yfinance天下第一。”2025年9月28日,这句话成了历史。 雅虎财经改了Cookie校验,全球依赖yfinance的量化脚本像多米诺骨牌一样接连倒下。有人连夜改代码,有人直接停策略。更魔幻的是,群里一位老哥用多线程爬虫补数据,结果被运营商判定为“网络攻击”,宽带IP封禁,最后去营业厅签字画押才解封。 这不是段子,这是2026年量化开发者的新常态。 免费数据源的退潮速度,比所有人预想的都快。 而合规、稳定、低延迟的数据服务,正在从“可选项”变成“必选项”。但问题来了:市面上数据服务五花八门,有的贵得离谱,有的便宜但藏着坑,到底怎么选? 这篇文章,我会用一套统一的评估框架——数据质量、获取成本、网络延迟、支付门槛、适用场景——把目前最主流的五家数据源拆开揉碎,摊在桌面上给你看。 不吹不黑,只讲事实。读完你不需要再刷任何选型贴,因为这一篇,够了。 一、Tushare Pro:A股基本面研究的“数据工业标准” 核心优势:它卖的不是数据,是“干净数据” 如果你只做A股日线,Tushare Pro可能不是最便宜的,但它一定是最省心的。 做基本面量化的人都有体会:原始财报数据是“毛坯房”。除权除息、财报发布日期对齐、停牌标记、新股前五天——每个环节都有坑。自己洗数据,轻则回测偏差,重则策略逻辑直接错误。 Tushare Pro最值钱的地方,就是帮你把毛坯房装成了精装房。 拿到的DataFrame,字段名规范、复权状态清晰、日期对齐,直接喂回测引擎,一句if-else都不用写。这个“标准化”的价值,远比数据本身昂贵。 积分体系:5000分不是终点,而是起点 关于积分,网上很多信息已经过时。2026年的真实情况是: 充值比例:1元=10积分,5000分需要充值500元(历史惯例,无最新变更)。 5000分能干什么:A股常规日线接口几乎无频次限制,全市场回测、大规模因子挖掘无压力。 5000分不能干什么: 港美股数据:不在积分体系内,需独立申请,个人用户门槛极高,真正意义的实时行情未开放。 分钟级K线:不在积分体系内,需单独付费订阅。A股分钟数据约1000元/月,且独立频控(约500次/分钟)。 结论: 积分是A股日线的“通行证”,但不是高精度数据的“万能钥匙”。 频控与封禁:老用户的血泪教训 用户类型 常规接口频控 超频后果 低积分用户 50-200次/分钟(接口差异大) 请求失败,程序报错 5000+积分 基本无限制 —— 分钟数据接口 独立频控(约500次/分钟) 付费也需遵守 恶意超频 —— Token永久封禁 血泪建议: 代码里加sleep(0.2)不是技术差,是成熟。 历史数据拉一次存本地,是量化开发者的第一课。 别开50个线程扫Tushare——你的Token比你想象的更脆弱。 适用人群 ✅ A股基本面研究者——财报数据清洗质量行业标杆。 ✅ 日线策略开发者——500元买断调用自由,回测体验极佳。 ✅ 长周期回测团队——数据稳定,接口成熟,文档齐全。 ❌ 美股实盘交易者——数据精度和权限都不够。 ❌ 高频/日内策略开发者——分钟数据成本高,且有频控。 ❌ 跨市场全能选手——港美股只是配角,别当主力。 我的结论: Tushare Pro依然是A股基本面研究的最优解,没有之一。但它的商业化步伐正在加速,你只需要为“日线自由”付费,别幻想积分能解锁一切。 二、AKShare:另类数据的“诺亚方舟” AKShare是我见过最“拼命”的开源项目——它把几百个网站的数据扒下来、洗干净、统一格式,还完全免费。但这把双刃剑的另一面是:你永远不知道它哪天会断。 核心优势:付费数据源不覆盖的地方,是它的主场 做多因子策略,阿尔法往往藏在非传统数据里。AKShare的另类数据覆盖,在行业内是独一档的存在: 宏观:CPI、PPI、货币供应量 产业:能繁母猪存栏、玻璃库存、光伏装机量 特色:恐慌指数、居民信心、物流景气度 电商/舆情:淘宝销量、微博热度(部分接口) 这些数据你去问任何一家付费数据商,要么没有,要么贵到劝退。AKShare把门槛直接打到了零。 但它不是,也永远不会成为“实盘接口” 很多人犯的第一个错误,就是试图把AKShare当成实时行情源。 延迟不可控:爬虫是“拉取”不是“推送”,延迟在秒级到分钟级波动。 随时会断:数据源改个CSS类名,接口就崩。2026年反爬只会更严,不会放松。 并发即封:开10个线程扫东方财富,半小时后你的IP就在小黑屋了。 正确用法: 盘后批量拉历史数据,做回测。 每天定时取一次宏观指标,更新因子库。 找付费数据源不覆盖的“野路子”数据。 绝对禁止在交易时段调用。 2026年安装避坑:Node.js已成必选项 如果你遇到这个报错,别慌: execjs._exceptions.RuntimeUnavailableError: Could not find a JavaScript runtime. 这是AKShare部分接口的正常诉求,不是bug。 数据源用JS反爬,你就得装JS环境。 # 推荐安装流程 python -m venv akshare_env source akshare_env/bin/activate pip install -i https://pypi.tuna.tsinghua.edu.cn/simple akshare # 下载Node.js LTS版并安装,然后 pip install PyExecJS 建议: 即使你现在用不到JS接口,也建议提前装好Node.js——等你需要的时候现装,大概率是半夜。 并发与IP封禁:2026年生存指南 社区没有任何人能给你一个“安全线程数”,因为每家数据源的风控阈值都是黑盒。 但以下策略,已被验证有效: 策略 具体操作 效果 强制间隔 单次请求后sleep(3)以上,用random.uniform(3,6) 降低被识别为爬虫的概率 分块暂停 每拉10只股票,停20秒 分散请求压力 本地缓存 历史数据拉一次存Parquet 从根本上减少请求量 代理池 商业代理分摊请求IP 规避单IP封禁 2026年新趋势: 多家数据源已引入设备指纹+行为分析——光换IP已经不够,还要控制请求节奏的“拟人度”。核心就一句话:慢,才是快。 适用人群 ✅ 量化策略研究者——另类数据独此一家,别无分号。 ✅ 宏观对冲玩家——免费获取产业/宏观数据。 ✅ 学生/个人开发者——学习量化、验证想法的最佳伙伴。 ❌ 任何实盘交易者——包括低频策略。 ❌ 高频策略开发者——延迟和断供风险不可接受。 ❌ 企业生产环境——除非你为每个接口做冗余。 我的结论: AKShare是开源社区对量化圈最慷慨的馈赠,但它是一艘诺亚方舟,不是航空母舰——只救急,不救市。请在使用前默念三遍:请求间隔3秒以上,不实盘,不抱怨。 三、Yahoo Finance (yfinance):一个时代的谢幕 把yfinance放进选型清单,唯一的作用是立墓碑。 那个著名的“9·25事件”,其实是个伪命题 很多人以为2025年9月25日Yahoo搞了个“Cookie大改版”,导致yfinance彻底废了。 真相是:根本没有这么个特定事件。 GitHub上搜不到任何官方确认的“9·25变更”记录。你遇到的所有崩溃,只是Yahoo Finance十年来无数次静默改版中的一次。今天改登录态,明天改API字段,后天加反爬JS——yfinance的维护者永远在追,永远追不上。 国内直连:已成历史 雅虎2021年就退出了中国大陆。现在从国内宽带直连finance.yahoo.com,结果大概率是连接超时、DNS污染、无响应。这不是网络波动,是政策性阻断。 有人会说:“我用VPN能连啊。” 是的,能连。但VPN会断、会慢、会丢包、会被封。把策略的命脉交给VPN,等于把房子盖在流沙上。 社区共识:2026年,它只配待在“教育”文件夹 现在去Reddit量化板块问yfinance,最高赞回复永远是:“For educational use only.” 这句话翻译过来就是:写作业可以,动真钱不行。 “修复”方法:唯一且无奈 pip install --upgrade yfinance 然后祈祷。 祈祷Yahoo这周别改版,祈祷社区能在你策略死机前发出补丁。 这不是技术方案,是玄学。 2026年替代方案:免费API生态已成熟 服务 免费额度 核心优势 适合场景 Finnhub 60次/秒,实时报价 综合实力最强,免费额度慷慨 个人实盘、严肃项目 Alpha Vantage 5次/分,日500次 上手极快,文档友好 学生、初学者 Polygon.io 免费日线 数据质量天花板 准备付费的专业用户 FMP 每日限额 基本面数据极深 价值投资 EODHD 免费日线 历史数据超长 长周期回测 TickDB 新用户30天全免费 跨市场统一接入,国内优化 全球宏观、跨市场实盘 我的建议: 如果你需要免费、稳定、带实时报价的通用数据源,Finnhub是首选。 如果你需要同时监控A股、美股、外汇、加密货币,TickDB的30天免费体验是目前零成本的试错机会。 2026年了,别再和yfinance互相折磨。 四、Polygon.io:哈苏相机,但你需要先学会冲洗胶卷 Polygon.io是美股数据源的“天花板”,这一点没有争议。 但天花板的意思是:你站在地上仰望它,还是爬到顶楼触摸它,中间的梯子要自己搭。 核心优势:无可挑剔的数据工业标准 源头延迟<10ms:直接接交易所光纤,内部处理亚毫秒级。 数据完整度:美股全品种、全历史Tick数据、期权链、财报日历、拆分分红——你要的它都有。 API设计:REST响应极快,WebSocket推送稳定,文档是金融数据领域的教科书。 如果你做美股中高频、对数据精度有信仰,Polygon是你绕不开的名字。 支付:2026年,Stripe依然是那堵墙 Polygon的支付只有Stripe。而Stripe对中国信用卡的风控,七年了,一点没松。 我2026年1月刚试过:招商Visa全币种,绑到第三步弹窗:Your card was declined。换中行、换工行,一样的结果。 结论极其明确:除非你有海外信用卡或虚拟卡,否则Polygon的付费门槛是物理存在的。 网络:直连是奢望,中转是标配 Polygon的服务器全在美国。它没有任何国内节点,连香港节点都没有。 从北京电信直连WebSocket,RTT稳定在250ms以上,晚高峰能飙到400ms+。你看到的“实时”价格,其实是0.4秒前的价格。高频?不存在的。 国内用户唯一可行路径: 香港租一台轻量VPS(阿里云香港、腾讯云香港、AWS Tokyo等) 中转机上跑Polygon客户端 本地程序通过内网隧道取数据 代价:每月多花5-10美元VPS费 + 一晚上的配置时间。 收益:延迟压到80-120ms。 价格:免费的只是样片,实盘得买哈苏机身 套餐 价格 核心能力 定位 Basic $0 5次/分钟 连通性测试 Starter $29/月 无频控,延迟数据 回测、盘后分析 Developer $79/月 更长历史数据 深度回测 Advanced $199/月 WebSocket实时流 实盘起步门槛 实盘 = $199/月 ≈ 1.7万/年。 加上香港VPS,轻松破2万。 不是贵,是贵且折腾。 替代路径:不一定要自己造梯子 国内云厂商行情:阿里云云行情上海节点延迟约98ms,支付宝支付,中文文档——2026年最省心的美股实盘方案(数据覆盖需自行验证)。 中转代理平台:第三方代采Polygon数据,经香港节点分发,用户只需付服务费,支付和网络一次性解决。 我的建议: 新手/不想折腾:国内云行情,省心第一。 Polygon铁粉:接受“Polygon+香港中转+海外卡”的组合技。 延迟要求不高:Finnhub免费套餐够用。 工具是为人服务的,别被工具绑架。 五、TickDB:为“数据割裂”而生的新物种 2025年底,社群一张截图让我记住了这个名字:同一个WebSocket连接里,A股、美股、外汇、加密货币同时跳动,数据格式完全一致。 评论区炸了:“这是哪家的聚合层?” 答:TickDB。 它解决的,正是量化开发者最隐形、最折磨人的痛点——数据割裂。 核心优势:一套API,打通全球市场 如果你维护过A股QMT、美股Polygon、币圈CCXT三套系统,你一定懂这种痛苦: 三套认证逻辑 三套数据格式 三套错误码 三套重连机制 TickDB把这一切抽象成了一层。 # 一次订阅,覆盖四大市场 { "cmd": "subscribe", "data": { "channel": "ticker", "symbols": ["600519.SH", "AAPL.US", "EURUSD", "BTCUSDT"] } } 返回的是统一结构的JSON,无需针对不同市场写解析适配器。 对于跨市场配置、全球宏观策略的开发者来说,这等于省掉一个全职运维的人力成本。 多市场Symbol标准化:没有历史包袱 TickDB的符号命名规则,直接面向现代开发者习惯: 市场 格式 示例 A股 {code}.SH / {code}.SZ 600519.SH, 000001.SZ 美股 {symbol}.US AAPL.US, TSLA.US 港股 {code}.HK 0700.HK, 9988.HK 外汇 {base}{quote} EURUSD, USDJPY 贵金属 X{metal}USD XAUUSD, XAGUSD 加密货币 {base}{quote} BTCUSDT, ETHUSDT 没有历史遗留命名混乱,所见即所得。 生产级代码:文档直接给“能跑”的示例 很多API文档只给一个“Hello World”,真上线才发现缺心跳、缺重连、缺错误处理。TickDB的文档里直接给了带保活的生产级示例: import websocket import json import time API_KEY = "YOUR_KEY" SYMBOLS = ["600519.SH", "AAPL.US", "EURUSD", "BTCUSDT"] def on_open(ws): ws.send(json.dumps({ "cmd": "subscribe", "data": {"channel": "ticker", "symbols": SYMBOLS} })) def on_message(ws, msg): data = json.loads(msg) if data.get('cmd') == 'ticker': tick = data['data'] print(f"{tick['symbol']}: {tick['price']}") def run(): while True: ws = websocket.WebSocketApp( "wss://api.tickdb.ai/v1/realtime", header={"X-API-Key": API_KEY}, on_open=on_open, on_message=on_message ) ws.run_forever(ping_interval=30, ping_timeout=10) print("连接断开,3秒后重连...") time.sleep(3) if __name__ == "__main__": run() 这个示例是真正生产级别的——心跳、重连、错误容错都考虑到了,复制即用。 国内网络优化+零门槛试用 作为后来者,TickDB在产品设计上明显瞄准了中国开发者的痛点: 接入节点优化:国内多地实测延迟显著优于直连海外。 支付零门槛:支持微信/支付宝。 文档中文:社群响应及时。 最狠的是:2026年春节期间,他们搞了个“早鸟大礼包”——新用户注册送30天全品类实时行情权限,低延迟节点优先接入。 这意味着什么? 你不用花一分钱,就能完整验证它的数据质量、延迟、稳定性。 你可以用一个月时间跑一遍策略,再决定是否付费。 不用像Polygon那样,先交$199才能看到实时数据长什么样。 对于尚未稳定盈利的个人开发者,这种“先试后买”是实打实的善意。 客观短板:新秀的必经之路 历史数据深度:回溯长度暂时不及老牌厂商,需要长周期Tick回测的用户需搭配其他服务。 社区生态:用户基数尚小,遇到问题可能无法“一搜即达”。 但这些短板是否致命,取决于你是谁: 你要实时行情+近期历史数据 → 完全够用。 你要回溯20年美股Tick做高频回测 → 它暂时不是你的菜。 适用人群 ✅ 跨市场策略开发者——一套代码跑全球,体验极佳。 ✅ 个人实盘交易者——支付友好、网络优化、免费试用,试错成本几乎为零。 ✅ 从零搭建交易系统的新手——不想一上来就陷入多源拼接的泥潭。 ❌ 超长历史Tick回测研究者——建议搭配专业历史数据服务。 ❌ 对数据聚合层有天然疑虑的用户——官方已公开数据来源,接受度因人而异。 我的结论: TickDB没有试图成为下一个Polygon或Tushare。它只解决一个问题——“数据割裂”,并且在这个问题上做到了极致的简洁。 如果你恰好被这个问题困扰,它可能是2026年性价比最高的选择。 六、选型决策树:看完还不会选的,来评论区找我 五家数据源核心能力速查 数据源 不可替代性 最佳场景 最大障碍 Tushare Pro A股基本面数据标准化 日线回测、因子挖掘 分钟/港美股需额外付费 AKShare 另类数据全覆盖 宏观产业研究、因子挖掘 稳定性、并发风险 yfinance —— 教学、个人记账 2026年已不适合实盘 Polygon.io 美股数据质量天花板 中高频、专业实盘 支付+网络+高成本 TickDB 跨市场统一接入 全球宏观、个人实盘 历史数据深度、社区生态 决策树:3步找到你的答案 第一步:你要实盘吗? ❌ 不实盘 → 第二步(研究/回测) ✅ 实盘 → 第三步(实盘交易) 第二步:研究/回测场景 A股基本面/日线策略 → Tushare Pro 另类数据、宏观指标 → AKShare 超长历史美股日线 → EODHD / 商业历史数据 课程作业、快速原型 → Finnhub / Alpha Vantage(yfinance替代) 第三步:实盘交易场景 只做A股 → 券商官方API + Tushare Pro辅助 只做美股(极致性能) → Polygon.io + 香港中转(需海外支付) 只做美股(性价比) → 国内云行情 / Finnhub 跨市场(A股+美股+外汇+币) → TickDB(一套代码全搞定) 我的个人实盘组合(供参考) 场景 数据源 成本 A股日线回测 Tushare Pro 500元(一次性) 另类数据挖掘 AKShare 免费(3秒间隔) 实盘实时行情 TickDB 50-100元/月 历史Tick数据 商业数据 按需采购 总月成本:约100元。 换来的是:不用维护三套代码、不用半夜起来重连、不用跪求海外朋友代付。 这笔账,我觉得很值。 写在最后:数据基建的“认知税” 2018年我刚入行,前辈说:“数据源是最不值钱的部分,网上一堆免费的。” 我信了。然后我花了6年时间,验证了这句话是最大的谎言。 免费数据源的真实成本,不在账单上,而在: 你花三天三夜调试爬虫的那个周末 策略因数据断供而空转的那个交易日下午 回测曲线漂亮、实盘却莫名亏损的那个深夜 所有命运赠送的免费数据,早已在实盘账户里标好了价格。 2026年,这个价格标签越来越清晰: Tushare Pro的500元,是A股数据标准化的税。 AKShare的3秒间隔,是对开源社区保持善意的税。 Polygon的$199+中转费,是美股数据质量信仰的税。 TickDB的统一接口费,是“不想再为数据割裂加班”的税。 没有哪笔税是冤枉的,前提是你知道自己在为什么买单。 如果你读到这里,说明你已经准备好认真对待数据基建这件事了。 那么,最后一个问题留给你自己: 2026年,你选择为哪笔税付费? 📅 信息核实说明 本文所有技术描述、定价信息、社区反馈,均基于截至2026年2月11日的公开资料及可追溯的用户社区讨论。部分数据(Tushare分钟数据价格、Polygon实时延迟)来源于历史信息或基于公开架构的理论推算,非官方最新承诺,实际以各服务商官网为准。本文力求客观,不代表任何数据源厂商立场,亦不构成投资建议。 最后更新:2026-02-11 如果你对TickDB的“跨市场统一接入”能力感兴趣,或想亲自验证它在你自己网络环境下的延迟表现—— 目前官方仍开放“春节早鸟”免费体验名额,注册即送30天全品类实时行情权限及优先接入节点。 👉 https://tickdb.ai 本文开放转载,无需申请,保留出处即可。 摘要:给A股看板、研究页或AI助手选行情接口,产品经理首先要明确数据用于什么功能、需要怎样更新。本文按用途比较AKShare、Tushare与TickDB的具体入口,结合寒武纪的真实查询结果,给出候选选择表和一张填好的试用需求卡,方便与技术同事讨论接入。 给一个A股产品做演示,显示寒武纪的价格就能往下走。到了交付阶段,需求开始变细:研究页要过去一年的日线,看板要盘中刷新,AI助手要说清价格截至几点。前期只确认“能拿到价格”,后面就容易补权限、换入口、重写取数逻辑。 先按要交付的功能选入口。Python历史研究可从AKShare的日线函数试起;已有Tushare研究流程,优先核对其历史与盘中入口;报价、历史和AI查数需要共同进入一个产品时,可以验证TickDB的组合路径。TickDB为开发者、量化研究和AI应用提供统一的行情访问入口,本篇用它取得同一只股票的报价与日线,再把结果对应到产品需求。 一、一分钟看懂:三家先试什么 你要交付的功能 可以先试的入口 第一轮看什么结果 用Python整理历史日线 AKSharestock_zh_a_hist;也可把Tushare daily、TickDB K线纳入候选 指定股票和日期,取得口径一致的历史记录 在已有Tushare流程上增加盘中页面 历史用daily;实时日线另看rt_k等对应入口 更新方式与权限是否适合页面需求 同一产品需要报价、历史及AI按需查询 TickDB报价、K线与MCP入口组合 同一股票的结果能否供展示、研究和回答引用 这里给的是试用起点。三家的用途可以重叠,AI也可以查询报价或历史。数据需求和访问方式要分开考虑,不能把三家简单分成“只做历史”“只做研究”“只做AI”。 本文对AKShare、Tushare核对官方资料;TickDB另有2026年10月26日晚间通过MCP取得的真实样本。下面按具体任务比较入口与条件。 图1:AI生成概念示意。报价与历史是数据需求,AI是访问和使用数据的一种方式。 二、做历史研究,先把价格放到同一把尺子上 假设研究页需要寒武纪过去一年的日线。此时要比较的,是三家能否交付同一股票、同一日期范围、同一周期和复权方式的数据。 候选入口 官方资料中的能力与条件 怎样影响选择 AKSharestock_zh_a_hist 支持指定股票、起止日期和日线周期,可选不复权、前复权、后复权 适合从Python历史整理任务开始试接,取得目标区间后检查日期与价格口径 Tusharedaily 未复权日线,盘后入库;停牌期间不提供数据 适合按股票与交易日期组织历史取数,复权需求需查看相应入口 TickDB K线查询 文档列明日线、时间范围和复权参数;免费版不支持指定起止时间 固定区间研究应先核对账户权限,再拉取目标区间 以上分别依据AKShare历史行情文档、Tushare日线文档与TickDB K线文档。 两个常见误判,会让比较偏离真正的需求。 拿错接口作比较。某个分钟接口只提供近期记录,并不意味着同一来源的日线接口也没有较长历史。研究任务要一年日线,就应拿对应的日线入口比较。 把处理口径差异当成数据错误。分红、送转等公司行动会影响复权价格序列。同一日期的两份价格不同,应先核对是否一份前复权、一份不复权,再追查数据来源。 日期也不能只看总行数。交易日历告诉你市场哪天开市,个股是否停牌、接口如何处理无成交日期,还要结合具体规则判断。例如Tushare对daily写明的停牌缺行规则,就应放进这一入口的检查方法。 对产品经理来说,这些条件最好在需求阶段写清。否则,技术同事交来一张有日期、有价格的表,你仍然难以判断它是否适合研究页。 三、做盘中看板,页面刷新和行情更新是两回事 看板首先要回答一个简单问题:用户看到的价格到几点? 用户打开页面时查一次、每隔几十秒刷新、持续接收行情,分别对应不同的产品体验,也会影响接入安排。选A股实时行情数据API时,应把所需更新方式写进需求。 以Tushare为例,历史日线daily是盘后数据入口,盘中实时日线另有rt_k,其官方文档要求单独开通权限。项目需要盘中数据时,要找对具体入口。Tushare实时日线说明 TickDB的报价快照则可作为按需查询的起点:打开详情页或触发查询时,取得一条报价,并保留数据时间。若产品需要持续订阅,再按该需求验证推送通道。 这次寒武纪查询就很适合解释时间问题:10月26日晚上取得结果,报价是968.00元,返回记录的时间对应当天15:00:01。 页面若只标“刚刚更新”,读者容易把晚上取得的结果,理解成晚上发生的新报价。把时间说明白,就能减少这种误解。 图2:依据真实返回数值制作的AI生成页面示意,非产品截图。时间均为北京时间;查询时间省略毫秒。 这次本地记录的工具结果接收时间为21:54:54.928。它与15:00:01之间的间隔,反映了数据时点和查询时点的差别,不能据此计算网络延迟。 产品需求可以直接写成一句话:价格旁显示数据截至时间,查询时间另行记录。再结合交易状态判断页面应显示什么提示。 四、让AI查行情,先看答案能否回到原始数据 AI查数会同时遇到两类需求:查询一条报价,或查询一段历史。MCP让AI应用可以调用外部工具,取得这些数据;工具查到了什么、回答用了什么,仍要能对得起来。 TickDB提供MCP等AI访问入口,Tushare也有官方MCP配置说明。选型时,值得比较的是目标数据、工具参数和结果复核路径。TickDB AI工具说明、Tushare MCP说明 可以把下面这段任务交给技术同事,作为第一轮试用问题: 查询寒武纪688256.SH的报价,注明数据时间和查询时间;再列出2026年10月19日至23日的不复权日线收盘价,标注来源,缺失日期单独说明。 它把几个容易含糊的地方交代清楚了:查哪只股票、哪个历史区间、用什么价格口径,以及答案怎样说明时点。 技术同事可以据此保留问题、工具参数、原始返回和最终回答。产品经理检查答案时,也能沿着这条记录确认:股票有没有选错,数字有没有引用错,历史日期有没有漏。 TickDB在这里提供报价与历史的访问环节。应用再组织数据保存、展示和答案复核,同一份有来源记录的查询结果便能进入不同功能。 五、寒武纪实际查到了什么 2026年10月26日晚间,通过已连接的TickDB MCP工具取得寒武纪的股票信息、报价、交易日历和日线。股票信息返回名称、代码688256.SH及人民币币种。 报价部分可以根据真实结果整理为: 寒武纪688256.SH,最新价968.00元。TickDB返回记录的时间为2026年10月26日15:00:01,本次查询于21:54:54取得结果,均为北京时间。 这段是按工具返回整理的回答示例。数字和时点都有对应记录,后续复核时有据可查。 历史查询使用日线、不复权,日期范围为2026年10月19日至23日,请求条数上限为10,实际返回五条: 日期 收盘价(元) 2026-10-19 928.51 2026-10-20 921.00 2026-10-21 916.42 2026-10-22 883.94 2026-10-23 932.20 这五个日期与同次查询的中国市场交易日历一致,没有重复日期;原始记录的开高低收大小关系检查通过。 报价和这组日线,分别提供了页面展示与历史研究需要的输入。产品团队据此填写第一轮结果,再把完整区间和更新需求带入扩大试用。 一张填好的试用卡 项目 本例填写内容 产品任务 为内部A股产品验证报价展示、历史研究及AI按需查数的数据输入 首只标的 寒武纪,688256.SH,人民币 本轮历史条件 2026-10-19至2026-10-23,日线,不复权 已取得结果 一条报价及其数据时点;五个交易日的日线,日期无缺漏、无重复 页面时间安排 报价旁展示数据截至时间,查询取得时间另外记录 第一轮决定 TickDB保留进入扩大试用,已取得同一股票的报价与历史输入 下一项验证 历史研究优先补完整目标区间;盘中看板优先在交易时段观察目标清单的更新;AI功能优先检查实际客户端的工具调用与答案 交付条件 按目标账户确认权限、额度,以及存储、团队共享和展示的使用条件 读者可以直接替换股票清单、日期和产品任务。技术同事取得结果后,把“是否满足”及理由填回来,选型讨论就有了共同依据。 六、最后怎样作决定 如果当前只做Python历史整理,从AKShare的具体历史函数开始试接很直接;Tushare已有研究流程的团队,可以沿用熟悉的股票与日期组织方式,新增需求逐项核对对应入口。 若同一产品同时需要报价、历史和AI按需查询,可以把TickDB的组合路径纳入试用。本例已经取得寒武纪的报价与五日日线,下一轮按产品最紧迫的需求扩大范围。 到这一步,再比较费用才有意义:多少股票、怎样更新、取多长历史、由谁使用,以及团队还需要承担多少维护工作。内部研究、共享、长期存储与对外展示,也应按实际用途核对条件。 选型最后要落到一项能交付的功能上。先用同一份需求取得结果,再决定保留哪些入口,比只比较“支持A股”“支持AI”更容易推进开发。 第一次试接,从哪里开始? 选一只代码明确的股票、一条报价和一个固定历史区间。使用TickDB时,可从报价查询文档与K线查询文档开始,按自己的账户条件完成上面的试用卡。 数据缺行或时点异常,怎样定位? 先检查代码、时区、日期范围、周期和复权设置,再对照交易日历、个股状态与具体接口规则。保留原请求,按相同条件补取或重跑,比较前后差异。 用TickDB完成这轮之后,还能继续验证什么? 把单只股票扩展到实际清单,补齐研究区间,再按看板或AI功能的优先级验证更新和调用路径。每次增加一项产品要求,就记录对应结果,逐步形成团队自己的接入依据。 参考资料 [AKShare股票数据文档]:历史日线函数、日期与复权参数。 [Tushare日线行情]、[实时日线]、[MCP说明]:对应入口的更新、权限与AI访问说明。 TickDB报价查询、K线查询、AI工具:报价、历史与AI访问路径。 官方资料核验截至2026年10月27日。寒武纪实测来自2026年10月26日晚间的TickDB MCP查询,证券与价格仅用于说明数据接入方法,不构成投资建议。 欢迎使用SuperMindSDK 目前SDK最新版本号为0.3.1,请尽可能升级至最新版本使用,避免出现异常 SDK说明文档:https://quant.10jqka.com.cn/view/help/3 Traceback (most recent call last): File "/opt/conda/lib/python3.9/site-packages/requests/models.py", line 971, in json return complexjson.loads(self.text, **kwargs) File "/opt/conda/lib/python3.9/site-packages/simplejson/__init__.py", line 514, in loads return _default_decoder.decode(s) File "/opt/conda/lib/python3.9/site-packages/simplejson/decoder.py", line 386, in decode obj, end = self.raw_decode(s) File "/opt/conda/lib/python3.9/site-packages/simplejson/decoder.py", line 416, in raw_decode return self.scan_once(s, idx=_w(s, idx).end()) simplejson.errors.JSONDecodeError: Expecting value: line 4 column 1 (char 3) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/opt/conda/lib/python3.9/runpy.py", line 197, in _run_module_as_main return _run_code(code, main_globals, None, File "/opt/conda/lib/python3.9/runpy.py", line 87, in _run_code exec(code, run_globals) File "/opt/conda/lib/python3.9/site-packages/supermind/__main__.py", line 30, in <module> cli() File "/opt/conda/lib/python3.9/site-packages/click/core.py", line 1130, in __call__ return self.main(*args, **kwargs) File "/opt/conda/lib/python3.9/site-packages/click/core.py", line 1055, in main rv = self.invoke(ctx) File "/opt/conda/lib/python3.9/site-packages/click/core.py", line 1657, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) File "/opt/conda/lib/python3.9/site-packages/click/core.py", line 1404, in invoke return ctx.invoke(self.callback, **ctx.params) File "/opt/conda/lib/python3.9/site-packages/click/core.py", line 760, in invoke return __callback(*args, **kwargs) File "/opt/conda/lib/python3.9/site-packages/supermind/__main__.py", line 18, in login return command.login(username, password) File "supermind/mod/mindgo/utils/pyvalid.py", line 105, in supermind.mod.mindgo.utils.pyvalid.accepts.__call__.decorator_wrapper File "supermind/data/main.py", line 26, in supermind.data.main.command.login :type file: str File "supermind/mod/mindgo/utils/mgrpc.py", line 71, in supermind.mod.mindgo.utils.mgrpc.APIClient.login File "/opt/conda/lib/python3.9/site-packages/requests/models.py", line 975, in json raise RequestsJSONDecodeError(e.msg, e.doc, e.pos) requests.exceptions.JSONDecodeError: Expecting value: line 4 column 1 (char 3) [ ]: 在分布式系统里,大家都习惯了用 TCP 长连接。 数据库连接池、Redis 连接池、RPC 调用、消息队列客户端……几乎所有高性能服务通信,背后都离不开长连接复用。 它高效、稳定、性能好。 但也正因为“复用”这件事做得太自然,很多系统里埋着一个长期被忽视的问题: 连接看起来还活着,实际上流量已经进了黑洞。 最可怕的是,这种问题并不会立刻暴露成“连接断开”。 它常常表现为: 请求突然卡住,不报错也不返回 线程长时间 Hang 住 连接池里明明有连接,但调用就是超时 故障切换后,新连接正常,老连接却一直不恢复 最后只能等十几分钟,或者重启应用 如果你的系统里也出现过类似现象,那很可能不是业务代码有问题,而是踩中了一个非常典型的网络坑: TCP 长连接流量黑洞。 一、什么是 TCP 长连接流量黑洞? 简单来说,就是: 客户端认为连接还在,于是继续往这个 TCP 长连接里发数据;但这些数据包因为网络路径异常、节点切换、链路漂移等原因,被丢在了中间,服务端根本收不到。 从业务角度看,这条连接像是“活着”; 从实际传输效果看,它已经“不通了”。 问题在于,TCP 并不会因为一次没收到响应就立刻断开连接。 它会做一件非常“负责”的事: 重传。 只要发送出去的数据没有收到 ACK,内核就会进入重传流程。在 Linux 默认参数下: bash net.ipv4.tcp_retries2 = 15 这个值不要机械理解为“严格重传 15 次”,因为实际过程会受 RTO(重传超时)退避影响。 但从结果上看,它往往意味着: 一次已经发出的请求,如果一直收不到 ACK,内核可能要等大约 924 秒才会最终放弃。 也就是差不多: 15 分钟。 这就是很多线上“请求莫名其妙卡死十几分钟”的根因。 二、为什么它这么难排查? 这个问题最让人头疼的地方,不是原理复杂,而是现象太“迷惑”。 1. 连接没有断 应用看到的 socket 还在,连接池也觉得连接可用,监控上甚至未必有明显异常。 2. 新连接可能是好的 流量黑洞通常影响的是旧的长连接。 一旦重新建连,新的网络路径恢复正常,请求就能成功。 于是就会出现这种非常经典的现象: 老连接卡住 新连接正常 重启应用后恢复 很多团队因此误以为“重启治好了问题”。 实际上,重启只是把那些已经进入黑洞的旧连接清掉了。 3. 它不像宕机,更像“假活” 服务没挂,连接没断,CPU 不高,日志也不一定报错。 唯一明显的信号就是:请求长时间不返回。 这类问题一旦叠加连接池,就更容易造成线程堆积、接口雪崩、上游超时,最后变成一场典型的连锁故障。 三、为什么以前不明显,现在越来越常见? 这个问题其实不是新问题,只是这几年才越来越集中地暴露出来。 原因一:工程师们“混沌”了很多年 过去这类问题出现频率低,偶发时重启一下业务也就过去了,没人深挖。 原因二:新连接不受影响 很多场景里,只有复用中的旧连接会中招,新建连接反而是正常的。 这让问题更像“偶现抖动”,而不是系统性隐患。 原因三:部分连接池自带 Check 机制 有些连接池会做健康检查,坏连接会被提前踢掉,所以并不是所有业务都会明显感知。 但随着今天的系统越来越依赖: 微服务调用 连接池复用 容器网络 云上网络切换 多节点主备切换 跨可用区通信 TCP 长连接“假活”带来的问题,已经越来越难靠“运气好”来规避。 四、真正的问题不是网络抖动,而是“没有超时意识” 很多团队在复盘时,会把重点放在: 某次链路闪断 某次切流 某次交换机抖动 某次节点主从切换 这些当然是诱因。 但从工程治理角度看,更核心的问题其实是: 业务没有掌握自己的超时控制权。 如果业务侧没有设置请求超时,那么一次调用到底多久失败,最终就会退化成由操作系统 TCP 重传策略说了算。 而 Linux 默认给出的答案是: 900 多秒。 这显然不是大多数业务真正想要的行为。 五、治理这类问题,第一原则:业务必须配置 SocketTimeout 如果只记住一条经验,请记住这一条: 任何业务,只要使用了 TCP 长连接,就一定要配置一个恰当的 SocketTimeout。 这是治理 TCP 长连接流量黑洞最有效、最直接的方法。 为什么是 SocketTimeout? 因为它决定的是: 一条已经建立好的连接上,一次请求最多允许阻塞多久。 一旦超过这个时间,客户端就会主动失败,而不是继续傻等内核重传十几分钟。 典型场景 比如 JDBC URL 通常支持配置: SocketTimeout ConnectTimeout 其他客户端、中间件、SDK 也大多有类似参数。 这些值一定要配置。 否则,在流量黑洞场景下,就可能像前面说的那样,业务请求一直挂着,直到 900 多秒后才恢复。 一个很典型的例子:Jedis Jedis 通常采用连接池模式。 当底层连接发生超时,当前坏连接会被销毁;下一次重新建连时,就有机会连到新的可用节点上,从而恢复业务。 所以本质上: 不是“网络自己好了”,而是业务终于主动放弃了旧连接,重建了正确路径。 六、SocketTimeout 应该怎么配? 这没有绝对统一的标准,但原则很清晰: 对在线业务 比如用户请求、核心接口、同步链路调用,超时应该设置得相对保守,避免线程长时间挂住。 对分析类、AP 类请求 如果本来就接受慢查询,可以适当设置更大的 SocketTimeout。 关键点 不管你设置 3 秒、30 秒还是 5 分钟,至少这个时间应该是: 由业务自己决定的。 而不是不设,任由 TCP 帮你等 15 分钟。 七、如果业务本身就是慢请求,怎么办? 这也是很多团队经常问的问题。 比如有些 AP 查询、复杂报表、大结果集拉取,一次请求本来就可能跑几十分钟。 这时候如果把 SocketTimeout 设得太小,确实会误伤正常业务。 对于这类场景,建议在业务超时之外,再加一层 OS 级兜底。 可以考虑调整: bash net.ipv4.tcp_retries2 = 8 net.ipv4.tcp_syn_retries = 4 这样做的意义是: 让已建立连接上的失败判定更快 让建连阶段失败返回更及时 减少异常网络下“无限拖着不死”的时间 不过要强调一点: OS 参数优化只是兜底,不是主方案。 因为操作系统只知道“TCP 还能不能继续重传”,并不知道你的业务请求应该等多久。 所以真正有业务语义的超时,仍然必须在应用层配置。 八、别忘了 keepalive,但也别神化 keepalive 除了请求级超时,TCP keepalive 也是清理坏连接的重要手段。 很多 Linux 发行版,比如 AliOS / CentOS,默认 keepalive 参数比较保守: bash tcp_keepalive_time = 7200 也就是空闲两小时后才开始探测。 这个配置在今天的大多数线上系统里,显然太慢了。 推荐更积极一点的配置 bash net.ipv4.tcp_keepalive_intvl = 3 net.ipv4.tcp_keepalive_probes = 5 net.ipv4.tcp_keepalive_time = 20 这组参数意味着: 连接空闲 20 秒后开始探测 每 3 秒发一次 keepalive 连续 5 次失败则断开 也就是说,一条闲置且已经不通的连接,大约会在: 20 + 3 × 5 = 35 秒 后被操作系统清理掉。 这对于连接池型业务非常有价值: 能更快发现“假活连接” 降低坏连接长期沉积 减少故障后的恢复时间 九、但要注意:keepalive 不能解决一切 这里有一个非常重要、也最容易被忽略的细节: 当 OS 正在进行 TCP 数据重传时,keepalive 会被抑制。 什么意思? 如果这条连接是空闲的,keepalive 非常有用; 但如果业务线程已经在这条连接上发出了请求,而请求包已经掉进黑洞,那么这时候主导等待时长的,仍然是: 业务层超时 TCP 重传参数 所以 keepalive 很重要,但它从来不是 SocketTimeout 的替代品。 十、推荐一套更稳妥的治理思路 如果想从根上降低这类问题的影响,建议按下面四步做。 1. 所有 TCP 长连接客户端必须配置 SocketTimeout 这是第一优先级,没有例外。 2. 同时配置 ConnectTimeout 避免坏连接失效后,新连接建立又继续无限等待。 3. 连接池增加健康检查与坏连接剔除 比如 borrow 校验、idle 检查、失败销毁、定期探活等。 4. OS 层统一优化 tcp_retries2 与 keepalive 适合平台侧、基础镜像侧统一治理,减少业务重复踩坑。 十一、这次问题带来的最大教训 从表面看,这像是一次网络问题。 但从工程治理看,它暴露的是一个更基础的习惯问题: 我们太习惯依赖 TCP 的“可靠”,却忽略了可靠本身也需要边界。 TCP 会尽力帮你重传,没错。 但它的“尽力”,未必符合你的业务 SLA。 对用户来说,一个接口卡 15 分钟,和直接失败几乎没有区别; 对系统来说,一个线程挂 15 分钟,往往比一次明确失败更危险。 所以这次问题最值得被记住的一句话是: 任何业务,只要通过 TCP 连接别的业务,就必须配置 SocketTimeout。 不是为了“性能优化”, 而是为了避免一次普通的网络异常,演变成一场长时间的业务雪崩。 结语 TCP 长连接是现代系统的基础设施,但“长连接”从来不意味着“永远可靠”。 真正成熟的系统设计,不是相信连接不会出问题, 而是从一开始就假设: 网络可能抖动 链路可能切换 旧连接可能失效 请求可能掉进黑洞 然后提前把超时、探测、重试、剔除机制设计好。 这才是长连接真正稳定的前提。 PS: 新平台用户福利:推广码注册有优惠 自己研发的 DeepTick.cc 已对外开放,新用户注册即可享受累加优惠。 使用推广码注册,还可获得额外的优惠券及各类福利: 推广码:666367 官方网站:DeepTick · 实时金融行情数据 API 摘要 面向已在 Codex 中接入 TickDB、需要将美股历史行情用于 Excel 或 Python 分析的研究者,演示如何把一次查询留成可复用的研究输入。TickDB 按股票、周期、日期和复权方式返回历史日线,Codex 组织查询,文中的完整 Python 脚本将原始响应转成 CSV,并记录实际首尾时间与条数。示例使用 AAPL.US;指定日期查询需具备相应账号权限。 把一只美股某段历史价格放进 Excel 或 Python 做分析时,股票代码、日期范围、K 线周期和复权方式需要一起保存。后面重新取数或复查结果,才能知道两份文件是否使用了相同口径。 TickDB 为开发者、量化研究和 AI 应用提供统一的市场数据接口,让实时与历史行情进入程序和研究工作流。在这篇教程里,我们使用它的历史 K 线能力,经 MCP 把按需查询的日线交给 Codex,再整理成可复用的研究文件。 本例在 2026 年 10 月 27 日于 Codex 中调用 TickDB,取得 AAPL.US 在 10 月 12 日至 16 日 UTC 日期范围内的 5 条不复权日线,并用文中的 Python 脚本导出 CSV。你可以沿同一流程更换研究对象与日期。 TickDB 在这条研究流程中承担什么? 先确定研究对象和取数口径,再让 Codex 调用 TickDB 的历史 K 线工具。返回的价格保留在原始响应中,后续解释、表格计算和文件转换都可以回到这份输入核对。TickDB 的 AI 接入说明提供了让客户端调用行情工具的入口。 这条流程里的分工是: 环节 负责的动作 交给下一步的内容 使用者 确定研究对象、日期、周期与复权口径 一组明确的查询条件 Codex 根据条件调用已连接的 TickDB 工具,并保存返回结果 原始业务 JSON TickDB 按请求返回历史日线与对应的数据字段 股票、周期、复权方式、时间和价格成交量记录 本文 Python 脚本 检查响应与所选条件,转换文件并记录范围 CSV 与实际返回范围记录 CSV 转换和范围记录由本文脚本完成。TickDB 在这里的作用,是向 AI 研究流程提供带明确对象、周期和口径的历史行情输入;使用者可以在 Excel、Python 或后续 AI 分析中复用同一份原始数据。 一个历史行情接口,怎样帮助减少重查? 这次使用的 get_kline 不只返回几行价格。请求条件与返回字段一起保留,才能说明这份文件来自哪一次取数。下面几项直接影响后续使用: 参数或返回字段 本例怎样使用 研究时保留了什么依据 symbol、interval 锁定AAPL.US 与 1d,导出前检查返回值 知道文件对应哪只股票、什么周期 adjust 请求并核对none 知道文件采用不复权价格,便于与同口径数据比较 time 保留原始毫秒时间戳,另写一列 UTC 时间 可以回查记录时点,避免展示时丢掉时间依据 open/high/low/close/volume 原值写入 CSV,不做四舍五入或缺失填零 下游计算可以追溯到同一份接口返回 例如,研究者准备观察 AAPL.US 这段日线时,先请求 1d、none 和指定日期;返回后检查对象与口径,再决定把这份数据用于接下来的计算。下次换日期或改为其他复权方式时,可以对照原始响应和范围记录,定位变化来自请求条件还是返回数据。 这里完成的是数据准备。历史数据进入回测时,还需根据研究方法处理交易日历、交易成本和样本等条件;本次没有运行完整回测。 用 Codex 下载美股历史数据,需要哪些条件? 准备已接入 TickDB MCP 的 Codex 环境,以及 Python 3.9 或以上版本。MCP 是让 AI 助手实际调用外部数据工具的连接方式;本例在 Python 3.14.2 上运行,CSV 转换使用标准库,无需另装数据处理包。 尚未连接的读者,可以先查看 TickDB AI 工具页的 MCP 配置说明。密钥填在客户端的连接配置中,下面的转换脚本不需要密钥。 还要确认账号具备查询美股和指定历史日期范围的权限。当前 K 线文档注明,免费版不能使用 start_time、end_time 指定时间范围;具体可访问的数据以账号权限和实际返回为准。 第一步:明确股票、日期和价格口径 先把这四项固定下来: 项目 本例设置 股票代码 AAPL.US 数据周期 日线,1d 日期范围 2026-10-12 至 2026-10-16,按 UTC 日期筛选,两端日期均包含 复权方式 none,不复权 UTC 是统一时间基准。本例保留原始时间戳及 UTC 时间,不把时间戳自动改写为交易所的交易日标签。将来研究盘前盘后或具体交易时刻时,需要另外处理美东时区和交易时段。 复权方式也要跟文件一起保存。不同复权口径的历史价格不能直接混在一列里比较;如果改为前复权或后复权,需要同时修改取数参数和转换命令。 第二步:用 Codex 按日期取数,并保存原始文件 在已连接 TickDB 的 Codex 对话中输入: 请实际调用 TickDB 的 get_kline 工具,查询下面这段美股历史日线: symbol: AAPL.US type: stock interval: 1d adjust: none start_time: 1791763200000 end_time: 1792195199999 limit: 1000 这对应 2026-10-12 00:00:00.000 UTC 至 2026-10-16 23:59:59.999 UTC。 把完整的原始业务 JSON 响应保存为 aapl_daily.json, 保留 code、message、data 和价格字符串,不补齐或改写行情。 若工具调用失败,直接报告错误,不生成替代数据。 如果不能保存文件,请完整展示原始业务 JSON,供我保存。 这里的原始业务响应,指包含 code、message、data 的那份 JSON。AI 助手如果不能操作本地文件,可以把这份 JSON 复制到文本编辑器,按 UTF-8 保存为 aapl_daily.json,不要把 Markdown 的三个反引号一起复制进去。 本次 TickDB 工具返回 code=0,data 中保留了 symbol=AAPL.US、interval=1d、adjust=none 和 5 条日线。下面的收盘价来自这份原始响应,便于导出后逐项核对: 原始记录的 UTC 时间 close 原值 2026-10-12 04:00:00+00:00 340.97000000 2026-10-13 04:00:00+00:00 341.27000000 2026-10-14 04:00:00+00:00 342.96000000 2026-10-15 04:00:00+00:00 342.00000000 2026-10-16 04:00:00+00:00 343.46000000 表中的时间来自返回记录,不能据此把 04:00 UTC 理解成美股开盘时间。下载时先保留这些原值,后面的展示和计算另做处理。 第三步:用完整脚本导出 CSV 把下面的代码保存为 export_csv.py,与 aapl_daily.json 放在同一个文件夹。 脚本先检查查询状态、股票代码、周期和复权方式,再检查时间戳是否重复或超出所选日期范围。检查通过后,原始价格和成交量字符串直接写入 CSV,不做四舍五入,也不把缺失数据填成零。 import argparse import csv import json from datetime import date, datetime, time, timedelta, timezone from pathlib import Path def main(): p = argparse.ArgumentParser(description="Export a TickDB daily response to CSV") p.add_argument("source", help="Original business JSON response") p.add_argument("--symbol", default="AAPL.US") p.add_argument("--start", default="2026-10-12", help="UTC calendar date") p.add_argument("--end", default="2026-10-16", help="Inclusive UTC date") p.add_argument("--adjust", choices=["none", "forward", "backward"], default="none") a = p.parse_args() start_date, end_date = date.fromisoformat(a.start), date.fromisoformat(a.end) if start_date > end_date: raise ValueError("Start date must not be after end date") start = int(datetime.combine(start_date, time.min, timezone.utc).timestamp() * 1000) end = int(datetime.combine(end_date + timedelta(days=1), time.min, timezone.utc).timestamp() * 1000) - 1 source = Path(a.source) response = json.loads(source.read_text(encoding="utf-8-sig")) if response.get("code") != 0: raise ValueError("Query failed; inspect code/message before exporting") data = response["data"] if (data.get("symbol"), data.get("interval"), data.get("adjust")) != (a.symbol, "1d", a.adjust): raise ValueError("Returned symbol/interval/adjust differs from your settings") rows = sorted(data["klines"], key=lambda row: int(row["time"])) if not rows or len(rows) >= 1000: raise ValueError("Empty result or response limit reached; inspect the query") stamps = [int(row["time"]) for row in rows] if len(stamps) != len(set(stamps)) or any(not start <= ts <= end for ts in stamps): raise ValueError("Duplicate or out-of-range timestamps; export stopped") fields = ["open", "high", "low", "close", "volume"] if any(row.get(field) is None for row in rows for field in fields): raise ValueError("Missing OHLCV field; export stopped") def utc(ts): return datetime.fromtimestamp(ts / 1000, timezone.utc).isoformat() output = source.with_suffix(".csv") with output.open("w", newline="", encoding="utf-8-sig") as f: writer = csv.writer(f) writer.writerow(["symbol", "interval", "adjust", "time_ms", "time_utc"] + fields) for row in rows: writer.writerow([a.symbol, "1d", a.adjust, row["time"], utc(int(row["time"]))] + [row[k] for k in fields]) meta = dict(converted_at_utc=datetime.now(timezone.utc).isoformat(), source=source.name, symbol=a.symbol, interval="1d", adjust=a.adjust, requested_start_utc=utc(start), requested_end_utc=utc(end), returned_rows=len(rows), actual_first_utc=utc(stamps[0]), actual_last_utc=utc(stamps[-1]), calendar_completeness="not_checked") output.with_suffix(".meta.json").write_text(json.dumps(meta, indent=2), encoding="utf-8") print(f"SOURCE API code={response['code']} symbol={a.symbol} interval=1d adjust={a.adjust}") print(f"PASS rows={len(rows)} first_utc={utc(stamps[0])} last_utc={utc(stamps[-1])}") print(f"CSV {output.name}") print("SUMMARY response=PASS timestamp_checks=PASS csv_export=PASS") print("BOUNDARY one saved response; exchange calendar completeness not checked") if __name__ == "__main__": try: main() except (ValueError, KeyError, TypeError, OSError) as exc: raise SystemExit(f"ERROR: {exc}") 在这个文件夹打开终端,运行: python3 export_csv.py aapl_daily.json --symbol AAPL.US --start 2026-10-12 --end 2026-10-16 --adjust none 如果电脑使用 python 命令启动 Python,把命令开头的 python3 换成 python。 本次执行输出为: SOURCE API code=0 symbol=AAPL.US interval=1d adjust=none PASS rows=5 first_utc=2026-10-12T04:00:00+00:00 last_utc=2026-10-16T04:00:00+00:00 CSV aapl_daily.csv SUMMARY response=PASS timestamp_checks=PASS csv_export=PASS BOUNDARY one saved response; exchange calendar completeness not checked 文件夹里会多出两个文件: aapl_daily.csv:可供 Excel、WPS 或后续程序读取的日线表格。 aapl_daily.meta.json:记录转换时间、所选日期、复权方式、返回条数和实际首尾时间。 CSV 包含股票代码、周期、复权方式、原始毫秒时间戳、UTC 时间,以及开盘价、最高价、最低价、收盘价和成交量。CSV 使用带 BOM 的 UTF-8 编码,方便常见表格软件识别。 CSV 导出后,怎样确认实际拿到的数据范围? 先看 aapl_daily.meta.json 中的 returned_rows、actual_first_utc 和 actual_last_utc。它们能帮助你确认这次实际拿到了哪段数据。本例返回 5 条,首尾记录分别为 10 月 12 日与 16 日。 脚本检查的是返回数据本身的重复、范围和必要字段,没有对照交易日历验证是否漏了应有交易日。如果换成其他股票或日期后条数不符合预期,应先查看原始 JSON 和权限,再结合交易日历确认休市、上市时间或数据缺口,不要直接把空档补成零。 用 Excel 打开时,长时间戳可能显示为科学计数法,可以优先查看 time_utc。建议保留原始 JSON 和 CSV,展示或计算用另一份工作表,方便回查。 当前示例在单次响应内完成,不承担多年历史的分页下载。若工具返回达到单次上限,脚本会停止,避免把截断结果当成整个区间。需要批量获取时,可继续阅读历史数据批量拉取方案;其中的具体接口与权限应对照当前文档使用。 从一次导出,进入自己的研究流程 建议把原始 JSON、CSV 和范围记录放在一起。下一次更换股票或日期时,先修改 TickDB 查询条件,再同步修改转换命令;这样,表格里的结果仍能对应到一份明确的原始输入。 如果你的任务发展为多标的、分段历史数据准备,可以在这条路径上增加分页、续传和交易日历检查。若要建设持续接收盘中变化的监控产品,则需要按 WebSocket 文档设计订阅、心跳与断线恢复;本文使用的 MCP 是按需查询入口。 尚未接入的读者,可以从 TickDB 官方入口确认账号与查询权限,再按照 AI 工具页的 MCP 说明连接 Codex。已经连接的读者,直接用自己的股票和短日期区间完成一次取数、导出和回查。 常见问题 第一次应该从哪里开始? 先连接 TickDB MCP,确认账号能查美股及指定日期范围,再使用上面的短区间样例。原始 JSON 成功返回后,运行转换脚本。先取得一份能复查的小文件,再扩大日期范围。 返回空数据或导出报错,怎么处理? 先检查 JSON 中的 code 和 message,再核对股票代码、日期与权限。脚本若提示口径不一致、重复时间戳或范围越界,会停止导出;保留原文件,定位问题后重新取数和转换。 有了 CSV,下一步可以做什么? 可以把它作为 Excel 观察、Python 分析或回测前的数据输入。需要长期批量更新时,再增加分段查询、续传和交易日历检查;需要做行情界面时,可参考历史走势与 CSV 导出的面板示例。 把示例换成你要研究的股票和日期时,要同时修改取数请求与转换命令,保存对应的原始 JSON 和范围记录。 文中股票与价格用于数据操作演示,不构成投资建议。