概述 在贵金属量化研究、波动模型搭建与策略回测工作中,白银 XAG/USD 是高频观测标的。初期采用 HTTP 定时轮询获取实时报价,短期演示尚可,长期采集用于量化建模时会持续出现数据延迟、Tick 样本缺失、接口访问限流等问题,直接造成回测结论存在系统性偏差。本文结合长时间连续采集实测经验,对比轮询与 WebSocket 长连接两种数据获取架构,梳理采集过程中影响数据完整性的典型问题,提供标准化订阅实现方案与可复用 Python 代码,适配行情监控、因子演算、离线回测等量化研究场景。 一、两种数据采集方案量化维度对比 1. HTTP 定时轮询方案固有短板 定时请求拉取报价的实现逻辑简单,但适配白银高波动行情时存在两处无法规避的量化缺陷: 采样粒度存在盲区。白银受美元指数、宏观经济数据冲击,短时间内价差波动区间较大,固定间隔采样会丢失大量关键拐点 Tick,基于残缺样本计算波动率、流动性因子,回测结果失真,无法客观验证策略有效性; 高频调用触发访问限制。若同步覆盖黄金、原油、白银多类大宗商品标的,高频轮询会累积大量接口请求,行情服务端触发限流机制,采集进程频繁中断,历史数据出现分段空白。 2. WebSocket 长连接采集核心优势 长连接架构改变数据交互逻辑,由客户端主动拉取转为服务端持续推送逐笔成交数据,全程维持单条持久连接,无冗余请求。从量化研究角度,该方案可保障 Tick 数据流连续完整,消除采样盲区,是贵金属实时行情采集的标准实现方式。 二、贵金属 WebSocket 订阅标准化流程 主流行情 API 的长连接订阅流程具备统一规范,分为三层执行逻辑:建立 WebSocket 持久连接、组装标的订阅报文、持续监听解析推送数据。 量化研究开发需重点关注标的代码格式区分,多数接口严格区分XAG/USD与XAGUSD两种标识,格式错误会出现订阅无返回、无报错提示的隐性故障;推送数据分为 trade 逐笔成交、tick 盘口深度两类,常规因子计算、策略回测选用 trade 类型数据即可满足需求。 三、长期采集易引发回测失真的三类底层问题 经过多轮 7×24 小时不间断压力采集测试,总结三类极易破坏数据集完整性的技术问题,也是量化研究中高频踩坑点: 重大宏观数据发布时段连接无自动恢复逻辑。非农、利率决议等行情波动放大阶段,服务端 Tick 推送频次陡增,若无断线重连封装,长连接直接中断,采集数据集出现大片空白区间,回测样本缺失; 缺失心跳保活机制。单次下发订阅指令无法维持长连接活性,闲置一段时间后服务端主动断开通道,程序进程正常运行,但不再接收新行情数据; 标的代码格式混用。随意切换带斜杠XAG/USD与无分隔符XAGUSD,订阅指令失效,调试排查成本较高。 以上问题未做处理会导致数据集存在系统性缺陷,基于该数据训练模型、回测策略,得出的结论不具备参考价值。 四、Python 标准化采集实现 开展贵金属量化实验与数据采集工作时,选用 AllTick API 作为行情数据源,其 WebSocket 报文结构标准化,无复杂鉴权逻辑,便于快速搭建采集脚本,适配本地研究与离线回测数据预处理流程。 整体实现逻辑:初始化 WebSocket 客户端,连接建立完成后下发白银标的订阅指令,配置消息解析、异常捕获、连接关闭回调函数,持续输出逐笔成交数据。 import websocket import json # 解析实时推送Tick数据 def on_message(ws, msg): data = json.loads(msg) ticker = data.get("symbol") deal_price = data.get("price") trade_vol = data.get("volume") print(f"标的:{ticker} 实时价格:{deal_price} 单笔成交量:{trade_vol}") # 连接建立后发送订阅指令 def on_open(ws): sub_payload = json.dumps({ "action": "subscribe", "symbol": "XAGUSD", "type": "trade", "id": 1 }) ws.send(sub_payload) # 捕获连接异常信息 def on_error(ws, err): print("长连接发生异常:", err) # 监听连接关闭事件 def on_close(ws, code, info): print("WebSocket连接已中断") if __name__ == "__main__": ws_client = websocket.WebSocketApp( url="wss://api.alltick.co/ws", on_open=on_open, on_message=on_message, on_error=on_error, on_close=on_close ) ws_client.run_forever() 脚本运行后可持续获取 XAGUSD 秒级逐笔成交数据,无需重复发起接口请求,保障行情数据流连续性,为量化回测提供完整原始 Tick 样本。 五、适配长期量化研究的进阶优化方案 基础脚本仅实现基础数据接收,针对 7×24 小时无人值守采集、高精度回测数据集构建,可补充三层优化逻辑,提升数据可靠性: 异步消息队列缓冲。独立队列缓存实时 Tick,通过多线程分离数据接收、入库、指标计算流程,高波动行情下避免主线程阻塞造成数据丢失; 心跳报文 + 自动重连封装。定时下发心跳维持通道活性,检测连接断开后自动重建通道并重新订阅标的,实现无人值守稳定采集; 时间戳连续性校验。通过时间戳序列判断数据缺口,自动记录缺失时段,便于后续补充历史行情,修复完整回测数据集。 白银品种流动性充足、短期脉冲行情频发,完善上述优化逻辑后,采集数据集的完整性与稳定性显著提升,可作为量化模型训练、多因子回测的可靠底层数据来源。 六、方案适用场景总结 短期演示、简易指标测算:HTTP 轮询开发成本低,可临时使用; 量化策略回测、长期行情监测、因子模型开发:必须采用 WebSocket 长连接方案,保障 Tick 数据无缺失、低延迟。 多数研究者将实时行情 API 等同于单次查询接口,而贵金属实时 API 本质是持续性数据流通道。稳定、完整的 Tick 数据是量化模型与回测体系的底层基础,掌握标准化长连接采集逻辑,是大宗商品量化研究的基础技术能力。 亲测最好用的AI编写量化策略工具,可以让 AI 直接写各个平台的策略代码,直接生成可运行的策略代码,代码质量远高于直接使用 DeepSeek、Trae 等平台。 大家可以直接用描述策略,然后一键生成可运行的完整策略代码,也可以把它当做一个API 查询工具。 最新消息,已经支持SuperMind等主流量化平台啦,并且实盘亲测过了,很适合小白用户,上线之后获得了非常多朋友的好评。 **🚀️ AI工具平台:https://iris.findtruman.io/ai/tool/ai-quantitative-trading/** 1.开源项目 XTick行情API提供了全面、准确、稳定的行情数据,帮助开发者和研究者构建创新的交易和分析工具,满足金融行业的需求,进行深入的市场分析和模型验证。 项目网址:http://www.xtick.top/ GitHub地址 https://github.com/xticktop/xtick API接口文档 API接口分为订阅数据、行情数据、财务数据三个部分。行情数据支持盘中实时更新。 除了订阅接口是Websocket API,其余接口为Http API接口且均支持GET和POST方法,下面以GET请求示例。 订阅数据接口 在GitHub上,已实现Java版本和Python版本的订阅代码,请先下载代码直接调用。 暂时无法在飞书文档外展示此内容 订阅数据按照证券交易所订阅推送,包括上交所、深交所、北交所、港交所(只支持部分股票)。 数据为实时推送,发数据非常快,客户端接受到数据后,最好做异步处理,将接受数据和数据处理分开,避免接受数据阻塞。 订阅方法: 订阅数据:订阅为Websocket API,请在Github上下载开源项目,参考XTickWebSocketClient.java中已实现的订阅功能。 入参1:authCodes 枚举取值如下: tick.SZ - 订阅深交所A股的tick数据。 tick.SH - 订阅上交所A股的tick数据。 tick.BJ - 订阅北交所A股的tick数据。 tick.HK - 订阅港交所港股的tick数据。 time.SZ - 订阅深交所A股的k线数据,包括time、1m。 time.SH - 订阅上交所A股的k线数据,包括time、1m。 time.BJ - 订阅北交所A股的k线数据,包括time、1m。 time.HK - 订阅港交所港股的k线数据,包括time、1m。 入参2:token 登录XTick网站,注册获取 取消订阅:http://api.xtick.top/doc/unsubscribe?token=043fbdcba7f3f3ab332ffff123456789 入参:token 登录XTick网站,注册获取 行情数据接口 请求方法: 请求地址:http://api.xtick.top/doc/market?type=1&code=000001&period=tick&fq=none&startDate=2025-03-25&endDate=2025-03-25&token=043fbdcba7f3f3ab332ffff123456789 备注:行情数据支持交易日内盘内实时更新。 入参1:type 股票类别 沪深京A股type=1,港股type=3; **入参2**:**code** 股票代码 比如平安银行为000001 **入参3**:**period** 用于表示要获取的周期,枚举取值如下: tick - 分笔数据 1m - 1分钟线 5m - 5分钟线 15m - 15分钟线 30m - 30分钟线 1h - 1小时线 1d - 日线 1w - 周线 1mon - 月线 1q - 季度线 1hy - 半年线 1y - 年线 参数4:fq 除权方式,用于K线数据复权计算,对tick等其他周期数据无效,枚举取值如下: none 不复权 front 前复权 back 后复权 front_ratio 等比前复权 back_ratio 等比后复权 参数5:时间范围,用于指定数据请求范围,表示的范围是[<b>startDate</b> ,<span> </span><b>endDate</b>]区间(包含前后边界)。 特别说明:period为tick类型,则单次请求时间跨度最大为一天,即startDate和endDate日期需设置为同一天。 period为分钟类型(包括1m、5m、15m、30m、1h),则单次请求时间跨度最大为一月,即**endDate - startDate不超过30天。** startDate - 起始时间,日期格式:2025-03-25 endDate- 结束时间,日期格式:2025-03-25 入参6:token 登录XTick网站,注册获取 财务数据接口 请求方法: 请求地址:http://api.xtick.top/doc/financial?type=1&code=000001&report=Pershareindex&startDate=2020-03-25&endDate=2025-03-25&token=043fbdcba7f3f3ab332ffff123456789 入参1:type 股票类别 沪深京A股type=1,港股type=3; **入参2**:**code** 股票代码 比如平安银行为000001 **入参3**:**report** 用于表示要获取的财务报表,枚举取值如下: Balance - 资产负债表 Income - 利润表 CashFlow - 现金流量表 Capital - 股本表 Holdernum - 股东数 Top10holder - 十大股东 Top10flowholder - 十大流通股东 Pershareindex - 每股指标 **参数4:**时间范围,用于指定数据请求范围,表示的范围是[<b>startDate</b> ,<span> </span><b>endDate</b>]区间(包含前后边界)。 startDate - 起始时间,日期格式:2025-03-25 endDate- 结束时间,日期格式:2025-03-25 入参5:token 登录XTick网站,注册获取
复利娃2026-06-22 发布 前阵子在做一个小工具,想让自己搭的AI助手能看懂行情、分析市场。一开始想得很简单——不就是调个API嘛,把数据喂给AI就行了。 结果真动手才发现坑不少。 先得找数据源,覆盖要全(A股、美股、外汇、指数、期货、基金我都得看),然后写代码拉K线、算指标,再设计一套Prompt让AI理解这些数字。折腾了两周,数据倒是能取到了,但AI的回答总是很僵硬,像在念报表,没有那种“分析感”。 后来跟一个做量化的朋友聊,他说:你为什么不试试那种AI原生就带数据能力的工具? 于是我就找到了今天想聊的这个东西。 一个让我从“取数据”变成“问数据”的工具 iTick的AI金融数据分析智能体,名字听起来挺长的,但用起来其实很简单——它就是一个能直接回答金融市场问题的AI。 我先是试了网页版,上手比我想象中快。不需要注册什么复杂的企业账号,打开页面直接就能对话。 我问了第一个问题:“最近黄金为什么涨?” 如果是以前,我得自己打开交易软件看K线、翻新闻查地缘事件、再看看美元指数的走势,最后自己拼凑出一个判断。但这次,它直接给了一段结构清晰的分析:美元走弱、地缘避险情绪升温、技术面突破关键位,三点讲得清清楚楚,还把相关的数据出处附在后面。 我当时的感觉是:这东西确实能省时间。 但我最关心的还不是网页版好不好用,而是——这东西能不能接进我自己的系统里? MCP Server:比我想象中简单太多的对接方式 研究了一圈,发现它还真提供了对接方式,而且跟我以前想的完全不一样。 以前我的做法是:我写代码取数据 → 我清洗计算 → 我把结果塞给AI → AI回答。相当于我是中间商,每一层都要自己搭。 iTick的做法是:它提供一个MCP Server。MCP是Anthropic推出的一个标准协议,简单理解就是让AI应用能统一调用外部工具的“万能插座”。iTick的MCP Server就是把这个插座另一头插在了他们覆盖全球的金融数据库上。 怎么理解呢?就像给AI装了一个“行情插件”,它自己会去查K线、算指标、看资金流向,我只需要像聊天一样问它问题就行。 配置过程比我想象中简单很多。在Cursor的设置里加一段JSON配置,填上API Key,就搞定了。不用写复杂的调用代码,不用处理数据格式转换,AI自己会通过MCP协议去取需要的数据。 { "mcpServers": { "itick": { "command": "itick-mcp", "env": { "ITICK_TOKEN": "your_token" } } } } 就这么多。我本来准备花一下午搞对接,结果十分钟就配好了。 实际用了几天,说说我的真实感受 配置好之后,我正式开始在日常投研中用这个AI助手。以下是我真实测试过的几个场景: 复盘效率提升最明显 以前每天晚上要把主要市场过一遍,美股、A股、外汇、黄金,开好几个网页来回切。现在直接问AI“今天全球市场有哪些异动”,它自己就去调数据、做对比,然后告诉我哪些品种波动大、可能有什么原因。以前复盘大概要40分钟,现在20分钟能看完主要市场的关键变化。 技术分析不再是“看图说话” 我让它“用MACD和RSI看一下英伟达现在的状态”,它返回的不光是数值,还有结合价格走势的解读。比如它告诉我“虽然RSI进入超买区,但MACD金叉形态还在,短期动能未见明显衰减”。这种把多个指标串起来综合判断的能力,自己写代码很难做到这么自然。 资金流向追踪省了不少事 问它“最近一周北向资金主要流入哪些板块”,它直接给出板块排名和资金体量,还顺带提了一句“流入前三的板块近期政策面均有催化”。这种把数据和基本面关联起来的分析,确实比我手动翻数据终端更高效。 当然它也不是万能的。有些深度基本面数据(财报细节、行业调研)目前还覆盖不到,另外所有分析都基于历史数据和公开信息,不能预测未来。 但作为一个“数据检索+初步分析”的助手,它已经帮我省下了大量手动查找和交叉比对的时间。 谁适合用这套方案? 我觉得最适合这几类人: 量化研究人员:以前做因子研究得先写一堆代码拉数据、算指标。现在可以直接在AI对话里做数据探索,先让AI跑一轮,发现有价值的线索再深入写代码验证。 投研交易团队:晨会前让AI跑一遍全球市场夜盘发生了什么,输出一份结构化的分析摘要,团队讨论的时候就不用从零开始看数据了。 想给应用加金融功能的开发者:不用自己从头搭数据基建,一个MCP Server就搞定。想做个智能投顾小工具,或者给自己的交易系统加个AI分析层,门槛低很多。 个人投资者:如果你每天需要跟踪多个市场、做跨资产分析,或者只是不想在信息海洋里迷失方向,这个工具能帮你更快理解“市场在发生什么”以及“为什么发生”。 最后说几句实在话 工具只是辅助,投资决策最终还得靠自己的判断。但这个工具确实能帮你更快地看清市场在发生什么,剩下的就是你自己做决策了。 如果你也在纠结怎么给AI接入金融数据,不妨试试这个思路。 想先体验一下的话,网页版可以直接试用,不用一上来就谈接入。觉得分析质量符合预期,再去研究API对接也不迟。 智能体试用页面:itick.org/products/ai-financial-agent 技术对接文档:docs.itick.org 请大家不要客气,任何意见建议可以在这里评论提出。 被采纳后我们将奖励1G研究环境内存 3个月。 调用微信推送报错 发送消息通知失败: HTTPConnectionPool(host='wxpusher.zjiecode.com', port=80): Max retries exceeded with url: /api/send/message (Caused by ConnectTimeoutError(urllib3.connection.httpconnection, 'Connection to wxpusher.zjiecode.com timed out. (connect timeout=6)')) 通过webhook调用钉钉推送也失败, 是supermind内部网络问题? 大盘到底强不强?用 Python 做一个市场温度计 很多人判断市场强弱,习惯看指数:上证指数涨了,觉得行情不错;创业板跌了,觉得市场很差。 但指数有一个问题:它是少数权重股共同影响的结果。指数上涨,不代表大多数股票都在涨;指数下跌,也不代表没有结构性机会。 更好的办法是看市场广度,也就是回答几个更细的问题: 全市场有多少股票上涨? 有多少股票涨幅超过 3%? 有多少股票跌幅超过 3%? 多少股票站上 20 日均线? 成交额集中在少数股票,还是扩散到更多标的? 这篇文章用 AlphaFeed 写一个“市场温度计”:拉取全市场实时行情,再结合历史 K 线计算广度指标,输出一个简单但很有用的市场状态报告。 1. 为什么只看指数不够 假设某一天沪深 300 涨了 1%,你可能会觉得市场很强。 但真实情况可能有三种: 情况 市场含义 大多数股票上涨,指数也上涨 普涨,赚钱效应较好 少数权重股上涨,很多小票下跌 指数强,个股弱 指数小涨,但涨停家数很多 结构性行情活跃 如果只看指数,这三种情况会被混在一起。 所以做交易和研究时,我更喜欢看“市场内部结构”:上涨家数、下跌家数、强势股比例、弱势股比例、均线以上比例、成交额分布。 这些指标不神秘,Python 几十行代码就能算出来。关键是你需要一个能方便拿到全市场行情的数据源。 2. 用 AlphaFeed 获取全市场实时行情 安装: pip install alphafeed pandas 初始化: from alphafeed import AlphaFeed af = AlphaFeed(api_key="your-api-key") 也可以用环境变量: export ALPHAFEED_API_KEY="your-api-key" 然后代码里直接: from alphafeed import AlphaFeed af = AlphaFeed() 获取全部 A 股实时行情: import pandas as pd from alphafeed import AlphaFeed af = AlphaFeed() quotes = af.quotes.get(universes=["CN_Stock"], to_dataframe=True) print(len(quotes)) print(quotes[["symbol", "last_price", "prev_close", "volume", "amount", "ext.name", "ext.change_pct"]].head()) AlphaFeed 支持的标的池包括: 标的池 含义 CN_Stock A 股 CN_ETF ETF US_Stock 美股 HK_Stock 港股 这意味着你可以用同样的方法做 A 股市场温度计、ETF 市场温度计、美股观察面板或港股观察面板。 3. 计算最基础的市场广度 先计算上涨、下跌、平盘数量: def calc_basic_breadth(quotes): df = quotes.copy() change_pct = df["ext.change_pct"] total = len(df) up = int((change_pct > 0).sum()) down = int((change_pct < 0).sum()) flat = total - up - down return { "total": total, "up": up, "down": down, "flat": flat, "up_ratio": up / total if total else 0, "down_ratio": down / total if total else 0, } 打印结果: breadth = calc_basic_breadth(quotes) print(f"全市场标的数: {breadth['total']}") print(f"上涨家数: {breadth['up']} ({breadth['up_ratio']:.1%})") print(f"下跌家数: {breadth['down']} ({breadth['down_ratio']:.1%})") print(f"平盘家数: {breadth['flat']}") 这个指标很简单,但已经比只看指数多了一层信息。 比如指数涨 0.5%,但上涨家数只有 25%,那说明行情可能只是权重股在撑指数。反过来,指数跌 0.3%,但上涨家数超过 60%,说明市场内部可能并不弱。 4. 计算强势股和弱势股比例 再定义几个阈值: def calc_strength_distribution(quotes): df = quotes.copy() change_pct = df["ext.change_pct"] return { "rise_gt_3pct": int((change_pct >= 0.03).sum()), "rise_gt_5pct": int((change_pct >= 0.05).sum()), "fall_gt_3pct": int((change_pct <= -0.03).sum()), "fall_gt_5pct": int((change_pct <= -0.05).sum()), } 这些指标可以粗略判断赚钱效应: 指标 含义 涨幅超 3% 家数 主动进攻力量 涨幅超 5% 家数 强势股扩散程度 跌幅超 3% 家数 风险释放范围 跌幅超 5% 家数 恐慌程度 很多时候,大盘指数涨跌不大,但强势股数量会提前变化。市场温度计的价值就在这里:它不是预测明天,而是更客观地描述今天。 5. 找出成交额最高的股票 成交额代表市场注意力。我们可以看资金主要集中在哪里: top_amount = quotes.sort_values("amount", ascending=False).head(20) print( top_amount[[ "symbol", "ext.name", "last_price", "ext.change_pct", "amount", ]] ) 如果每天成交额前 20 名都是少数权重股,说明市场可能偏指数行情;如果成交额扩散到很多中小市值股票,说明市场活跃度可能更高。 当然,AlphaFeed 这里只提供行情数据,不替你判断行业主题。你可以把成交额榜导出后,再结合自己的行业分类或观察列表做进一步分析。 6. 加入 20 日均线以上比例 实时行情能告诉我们今天涨跌,但判断趋势还需要历史 K 线。 我们可以抽取成交额较高的一批股票,计算有多少站上 20 日均线: active_symbols = ( quotes.sort_values("amount", ascending=False) .head(300)["symbol"] .tolist() ) dfs = af.klines.batch( active_symbols, period="1d", count=60, adjust="forward", to_dataframe=True, show_progress=True, ) 计算比例: def calc_above_ma20_ratio(dfs): total = 0 above = 0 for symbol, df in dfs.items(): df = df.sort_values("trade_date").copy() if len(df) < 20: continue ma20 = df["close"].rolling(20).mean().iloc[-1] close = df["close"].iloc[-1] if pd.isna(ma20): continue total += 1 if close > ma20: above += 1 return above / total if total else 0 使用: above_ma20_ratio = calc_above_ma20_ratio(dfs) print(f"活跃股票中站上20日线比例: {above_ma20_ratio:.1%}") 这个指标很适合做市场温度判断: 20 日线以上比例 粗略状态 70% 以上 市场较热 50% - 70% 偏强或震荡偏强 30% - 50% 震荡偏弱 30% 以下 市场较冷 阈值只是经验,不要机械使用。不同市场、不同时期都需要校准。 7. 输出一份市场温度报告 把上面的部分合起来: import pandas as pd from datetime import datetime from alphafeed import AlphaFeed def calc_basic_breadth(quotes): change_pct = quotes["ext.change_pct"] total = len(quotes) up = int((change_pct > 0).sum()) down = int((change_pct < 0).sum()) flat = total - up - down return total, up, down, flat def calc_strength_distribution(quotes): change_pct = quotes["ext.change_pct"] return { "rise_gt_3pct": int((change_pct >= 0.03).sum()), "rise_gt_5pct": int((change_pct >= 0.05).sum()), "fall_gt_3pct": int((change_pct <= -0.03).sum()), "fall_gt_5pct": int((change_pct <= -0.05).sum()), } def calc_above_ma20_ratio(dfs): total = 0 above = 0 for _, df in dfs.items(): df = df.sort_values("trade_date").copy() if len(df) < 20: continue ma20 = df["close"].rolling(20).mean().iloc[-1] close = df["close"].iloc[-1] if pd.isna(ma20): continue total += 1 above += int(close > ma20) return above / total if total else 0 def market_temperature_label(up_ratio, above_ma20_ratio, weak_count): if up_ratio >= 0.65 and above_ma20_ratio >= 0.6: return "偏热" if up_ratio >= 0.5 and above_ma20_ratio >= 0.45: return "偏强" if up_ratio <= 0.35 or weak_count > 500: return "偏冷" return "震荡" def build_market_report(universe="CN_Stock"): af = AlphaFeed() quotes = af.quotes.get(universes=[universe], to_dataframe=True) quotes = quotes.dropna(subset=["ext.change_pct", "amount"]) total, up, down, flat = calc_basic_breadth(quotes) dist = calc_strength_distribution(quotes) active_symbols = ( quotes.sort_values("amount", ascending=False) .head(300)["symbol"] .tolist() ) dfs = af.klines.batch( active_symbols, period="1d", count=60, adjust="forward", to_dataframe=True, show_progress=True, ) above_ma20_ratio = calc_above_ma20_ratio(dfs) up_ratio = up / total if total else 0 label = market_temperature_label( up_ratio, above_ma20_ratio, dist["fall_gt_3pct"], ) top_amount = quotes.sort_values("amount", ascending=False).head(10) lines = [] lines.append(f"# 市场温度计 {datetime.now():%Y-%m-%d %H:%M}") lines.append("") lines.append(f"- 标的池:{universe}") lines.append(f"- 市场状态:{label}") lines.append(f"- 上涨家数:{up} / {total} ({up_ratio:.1%})") lines.append(f"- 下跌家数:{down} / {total} ({down / total:.1%})") lines.append(f"- 平盘家数:{flat}") lines.append(f"- 涨幅超过 3%:{dist['rise_gt_3pct']}") lines.append(f"- 涨幅超过 5%:{dist['rise_gt_5pct']}") lines.append(f"- 跌幅超过 3%:{dist['fall_gt_3pct']}") lines.append(f"- 跌幅超过 5%:{dist['fall_gt_5pct']}") lines.append(f"- 活跃股票站上 20 日线比例:{above_ma20_ratio:.1%}") lines.append("") lines.append("## 成交额 Top 10") lines.append("") lines.append(top_amount[["symbol", "ext.name", "last_price", "ext.change_pct", "amount"]].to_markdown(index=False)) lines.append("") lines.append("数据来源:AlphaFeed (https://alphafeed.org/)") return "\n".join(lines) if __name__ == "__main__": report = build_market_report("CN_Stock") print(report) with open("market-temperature.md", "w", encoding="utf-8") as f: f.write(report) 如果需要 to_markdown,安装: pip install tabulate 8. 这个报告怎么读 你可以每天收盘后生成一次报告,然后观察几个核心变化: 指标 观察重点 上涨家数比例 市场赚钱效应是否扩散 跌幅超过 3% 家数 风险释放是否扩大 活跃股站上 20 日线比例 趋势是否健康 成交额 Top 10 资金是否集中在少数权重股 市场状态标签 给自己一个快速摘要 不要把它当成买卖信号。它更像天气预报里的温度和湿度:告诉你环境如何,但不会替你决定今天穿哪件衣服。 交易决策仍然要结合你的策略、仓位、风险承受能力和交易计划。 9. 扩展到 ETF、美股、港股 如果你想看 ETF 市场: report = build_market_report("CN_ETF") 如果你想看美股: report = build_market_report("US_Stock") 如果你想看港股: report = build_market_report("HK_Stock") 跨市场统一接口的好处在这里会非常明显。你的市场温度计逻辑不用重写,只要换一个标的池 ID,就可以观察不同市场。 当然,不同市场的交易制度、涨跌幅分布、成交结构都不一样,所以阈值不要照搬。比如 A 股和美股的单日波动结构不同,涨幅超过 3% 在不同市场里的含义也不同。 10. 可以继续做成一个 Dashboard 这篇文章输出的是 Markdown 报告。如果你想更进一步,可以做成网页看板: 用 Streamlit 显示市场温度; 用 Plotly 画上涨/下跌比例柱状图; 每 5 分钟刷新一次实时行情; 保存每日市场温度到 CSV; 画出市场温度历史曲线; 给极端冷/热状态加提醒。 你甚至可以让 AI 编程工具帮你改: 请基于这个 AlphaFeed 市场温度计脚本,帮我改成 Streamlit Dashboard: 1. 页面顶部显示市场状态标签; 2. 显示上涨/下跌/平盘数量; 3. 显示涨幅超过 3%、跌幅超过 3% 的数量; 4. 显示成交额 Top 20 表格; 5. 支持在侧边栏选择 CN_Stock、CN_ETF、US_Stock、HK_Stock。 这种需求非常适合 AlphaFeed + AI 编程:AlphaFeed 提供结构化数据,AI 帮你快速搭界面,你把注意力放在指标设计和结果解释上。 11. 为什么这是一个适合普通人的量化工具 很多人一听量化,就觉得一定要机器学习、深度学习、高频交易。其实不是。 对大多数个人投资者和研究者来说,更实用的量化工具往往是: 自动整理市场信息; 用固定规则减少主观情绪; 长期记录市场状态; 用数据验证自己的感觉; 在风险变大时及时降温。 市场温度计就是这样的工具。它不复杂,但每天都能用。 当你觉得“今天市场好像很强”时,可以看上涨家数比例;当你觉得“指数没跌多少,但账户很难受”时,可以看跌幅超过 3% 的家数;当你觉得“是不是该加仓”时,可以先看活跃股票站上 20 日线的比例。 它不能替你赚钱,但能帮你少一点拍脑袋。 结语 判断市场强弱,不应该只盯着指数涨跌。指数是结果,市场广度才更接近交易者真实体感。 用 AlphaFeed,你可以用几行 Python 拿到全市场实时行情,再结合历史 K 线计算自己的市场温度指标。这个过程没有玄学,也不需要复杂模型,核心就是把“感觉”变成“可重复观察的数据”。 如果你正在搭建自己的量化工作流,可以从这个市场温度计开始:每天生成一份报告,持续记录,慢慢你会对市场状态有更稳定的判断。 参考文献: AlphaFeed 官网:https://alphafeed.org/ AlphaFeed 文档:https://docs.alphafeed.org/ CMES金融数据库能下载哪些期货数据?一次讲清楚 昨晚跑策略回测,又差点把内存撑爆了。复盘了一下,问题出在数据源上。之前图省事,用的数据要么字段不全,要么不是标准清洗过的,自己处理起来费时费力还容易出错。 后来开始用CMES金融数据库,主要是因为它数据分类比较清楚,下载也方便。今天就把我研究过的、它上面能获取的几大类数据整理一下,给同样做量化或者需要数据的朋友参考。内容比较干,可以先收藏。 商品期货 & 金融期货 这个是最基础的,做期货策略肯定绕不开。数据主要包括日线、分钟线这些。 日线数据:就是每天一根K线,有日期、开盘价、最高价、最低价、收盘价、成交量、持仓量这些经典字段。适合做中长线策略的初步回测,或者宏观分析。 分钟线数据:频率更高,比如1分钟、5分钟、15分钟线。字段和日线差不多,但时间粒度更细。做日内或者中短线策略,这个数据基本是必需品。我刚开始的时候,傻傻分不清分钟线和Tick,用Tick数据去做日频回测,那效率简直了,跑一个策略等半天。 Level 2 行情数据(五档订单簿) 这东西数据量就上来了,也是让我又爱又恨的部分。爱的是信息量足,恨的是真的占地方。 它记录的是市场上实时的买卖委托订单,通常展示买卖各五个价位的挂单情况。核心字段包括: 时间戳:精确到毫秒,这是做高频或微观结构分析的基础。 最新价、成交量:这个和普通行情一样。 买一价到买五价,买一量到买五量:就是当前市场上最想买的五个价格和对应的挂单数量。 卖一价到卖五价,卖一量到卖五量:同理,最想卖的五个档位。 总买委托量、总卖委托量:有时候看这个能感受一下多空力量的对比。 以前我只看K线,后来发现Level 2里的信息量完全不同。比如,你可以观察委托队列的动态变化,有时候买一挂了个巨量单子,价格却上不去,可能那是个“假墙”,是拆单拆出来的。为了验证一些盘口规律,我调取了CMES金融数据库中过去三年的主力合约五档数据进行回测,发现结合委托信息,确实能过滤掉不少市场噪音。 Tick数据(一档) 如果说分钟线是总结报告,那Tick数据就是现场直播。市场每发生一笔成交,或者报价有变动,它就记录一条。数据频率极高,是研究市场微观结构、做高频交易策略的底层材料。 主要字段通常包括: 时间戳:同样精确到毫秒或更高。 最新价 成交量 成交额 买一价、买一量 卖一价、卖一量 Tick数据是硬盘杀手,新手真的不建议一上来就碰,数据清洗和存储都是大工程。我之前用自己爬的Raw Tick数据,光是处理异常值和合并合约就搞到怀疑人生。 更高频的数据(如逐笔委托/成交) 这个在CMES上好像也有,属于更深的Level。比如每一笔委托的到达、每一笔成交的明细。数据量是Tick的N倍,对存储和算力要求极高,一般是专业机构玩得多。个人研究者用五档数据其实已经能挖不少东西了。 不同数据的简单对比 用文字描述可能更直观一些: Tick数据:像个碎碎念的监控器,市场动一下它就记一笔,信息最原始,数据量最大,存储和处理成本高。 分钟/小时数据:像个定时的记录员,每隔固定时间给你汇报一次市场概况,数据量适中,适合大多数技术分析和中短线回测。 日/周/月数据:像最终的日报、周报、月报,高度概括,数据量小,适合长期趋势分析、基本面量化入门。 怎么获取和使用? 他们网站提供了下载界面,可以根据品种、日期、数据类型筛选。对于需要编程获取的情况,他们好像也提供了API接口,用Python就能调。我之前试过,挺方便的。 这里放一个他们API文档里示例的代码片段(具体参数以最新文档为准): # 示例:使用cmesdata库获取数据 # 注意:使用前需要pip安装,并确保拥有有效的访问权限和正确的参数 import cmesdata as cd # 初始化客户端,需要替换为你的实际token client = cd.Client(api_token='your_api_token_here') # 尝试获取某商品期货的分钟线数据 # CMES金融数据库的行情接口,注意入参正确,调用频率正常。 try: data = client.get_data( symbol='RB9999', # 合约代码,例如螺纹钢主力 data_type='1min', # 数据类型:1分钟线 start_date='2023-01-01', end_date='2023-01-10' ) print(data.head()) except Exception as e: print(f"获取数据失败: {e}") 数据是量化研究的基石,但找到干净、规整、字段统一的数据源真的能省下大把时间。我一开始也到处找免费数据拼凑,结果在数据清洗和校验上花的功夫比研究策略还多。后来还是转向了CMES金融数据库这类提供标准化清洗数据的地方,虽然需要一些积分或者成本,但数据质量有保障,不用自己处理除权除息、合约换月这些破事,省下的时间可以多琢磨几个策略逻辑。 当然,数据只是工具,关键还是看你的研究思路。不建议一开始就追求最高频的数据,从日线、分钟线入手,把策略逻辑跑通,再逐步用到更细粒度的数据,可能会更稳妥。 大概就这些吧,手都打酸了。如果大家对这些数据的具体字段还有疑问,或者知道怎么高效压缩存储Tick数据。