全部
文章&策略
学习干货
问答
官方
用户头像sh_*2176oo
2026-09-09 发布
一句话回答: 涨跌停监控的关键是"拿到每只票当日的涨/跌停价,再和最新价比对"。用 AlphaFeed 一次取全 A 实时快照,用 instruments 的 limit_up/limit_down 判定涨跌停,再用五档盘口的封单量衡量封板强度、识别炸板——几十行就能搭出打板监控的数据底座。 为什么会有这个问题 涨跌停是 A 股独有的强信号,但很多人不知道每只票的涨跌停价怎么来(ST、次新、主板规则不同,比例不一样)。手工按 ±10% 估算会错。正确做法是直接取交易所给定的当日涨跌停价,再结合盘口封单判断"封得牢不牢"。 分步骤解决 第 1 步:取全 A 快照 + 当日涨跌停价 from alphafeed import AlphaFeed import pandas as pd af = AlphaFeed() # 读取 ALPHAFEED_API_KEY q = af.quotes.get(universes="CN_Stock", to_dataframe=True) codes = q["symbol"].tolist() # 涨跌停价来自 instruments 的 ext(交易所口径,已含 ST/次新差异) insts = af.instruments.batch(codes) lu = {i["symbol"]: i["ext"].get("limit_up") for i in insts} ld = {i["symbol"]: i["ext"].get("limit_down") for i in insts} q["limit_up"] = q["symbol"].map(lu) q["limit_down"] = q["symbol"].map(ld) 第 2 步:判定涨停 / 跌停(含"接近封板") 用最新价与涨跌停价比对,留一点浮点容差: q["is_limit_up"] = q["last_price"] >= q["limit_up"] * 0.999 q["is_limit_down"] = q["last_price"] <= q["limit_down"] * 1.001 up = q[q["is_limit_up"]] down = q[q["is_limit_down"]] print(f"涨停家数: {len(up)} 跌停家数: {len(down)}") print(up[["symbol", "ext.name", "last_price", "limit_up", "ext.change_pct"]] .head(10).to_string(index=False)) 关键字段: 字段 含义 来源 last_price 最新价 quotes 快照 limit_up / limit_down 当日涨/跌停价 instruments.ext(交易所口径) ext.change_pct 当日涨跌幅(小数) quotes 快照 ext.turnover_rate 换手率(小数) quotes 快照 第 3 步:用五档封单量识别封板强度 / 炸板 涨停时买一价=涨停价,**买一挂单量(封单)**越大说明封得越牢;封单被吃光、价格跌破涨停即为"炸板"。用 depth 取五档: def seal_strength(symbol): d = af.depth.get(symbol) # dict: bid_prices/bid_volumes/ask_prices/ask_volumes lu_px = insts_map[symbol]["ext"].get("limit_up") bid1_px, bid1_vol = d["bid_prices"][0], d["bid_volumes"][0] sealed = abs(bid1_px - lu_px) < 1e-6 and bid1_vol > 0 # 买一在涨停价且有封单 return {"symbol": symbol, "bid1_px": bid1_px, "seal_vol": bid1_vol, "sealed": sealed} insts_map = {i["symbol"]: i for i in insts} for s in up["symbol"].head(5): print(seal_strength(s)) depth.get 返回的盘口字段: 字段 含义 bid_prices / bid_volumes 买一~买五 价格 / 挂单量 ask_prices / ask_volumes 卖一~卖五 价格 / 挂单量 symbol / region / timestamp 标的 / 市场 / 时间戳 涨停封板:买一价=涨停价且封单量大、卖档基本无量。炸板迹象:涨停价上卖档出现大量、买一封单快速减少。 第 4 步:封装成盯板快照 def limit_board_snapshot(): q = af.quotes.get(universes="CN_Stock", to_dataframe=True) insts = af.instruments.batch(q["symbol"].tolist()) lu = {i["symbol"]: i["ext"].get("limit_up") for i in insts} ld = {i["symbol"]: i["ext"].get("limit_down") for i in insts} q["limit_up"] = q["symbol"].map(lu); q["limit_down"] = q["symbol"].map(ld) up = q[q["last_price"] >= q["limit_up"] * 0.999] down = q[q["last_price"] <= q["limit_down"] * 1.001] return {"涨停": len(up), "跌停": len(down), "涨停清单": up[["symbol", "ext.name"]].values.tolist()} print(limit_board_snapshot()["涨停"], "只涨停") 关键坑与注意事项 别用固定 ±10% 估涨跌停:ST 是 ±5%、次新/北交所规则不同,务必用 instruments 的 limit_up/limit_down(交易所口径)。 一字板 vs 盘中封板:一字板全天封死,盘中封板可能反复开板;结合封单量与 ext.amplitude 判断。 炸板要看动态:单次快照只能看"此刻封没封",识别炸板需连续多次快照对比封单量变化。 快照有延迟:quotes/depth 是准实时快照(秒级),不是逐笔;打板实盘对时延敏感,需评估。 停牌:停牌票 volume=0,不要计入涨跌停统计。 常见问题(FAQ) Q:涨跌停价为什么不自己按比例算? A:因为 ST、次新股、北交所比例不同,且有四舍五入规则。直接用 instruments 给的交易所口径最准。 Q:怎么判断"封得牢不牢"? A:看买一(涨停价)的封单量绝对值与相对成交额;封单远大于当日成交则较牢。 Q:能识别炸板吗? A:能,但需周期性轮询记录封单量与价格,单帧快照只能判断当前状态。 Q:需要付费吗? A:全市场池(universes)需 Starter 及以上;单标的 quotes/depth/instruments 有免费额度。详见定价页。 小结 涨跌停监控的本质是"最新价 vs 交易所涨跌停价",封板强度看五档封单量。用 AlphaFeed 的全 A 快照 + instruments 涨跌停价 + depth 盘口,几十行就能统计涨跌停家数、识别封板与炸板,为打板策略打好数据底座。 参考 AlphaFeed Python SDK 文档:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
浏览24
评论0
收藏0
用户头像9点半量化
2026-09-09 发布
引言:为什么涨停后的回调更值得关注? 在二级市场的博弈中,许多散户投资者都经历过这样的“至暗时刻”:费尽心力抓到了一个涨停板,正准备迎接大行情,股价却在次日开启阴跌。出于对利润回撤的恐惧,大多数人在洗盘的折磨中匆忙离场。可诡异的是,往往在你离场后的转身之间,股价便如离弦之箭,开启了翻倍的主升浪。 作为投资者,你必须看透:涨停后的回调,大多是主力为了清洗浮筹、蓄势主升而精心布置的“艺术性洗盘”。这并非行情的终结,而是主升浪前的“黄金坑”。面对波动,你是被噪音恐吓出局,还是能识别出那些藏在K线里的“最后登机牌”? 信号一:三阴不破一阳,蓄势待发的“弹簧” “三阴不破一阳”是一种典型的压力测试形态。主力在拉出低位涨停后,通过连续的缩量阴线来观察市场的跟风盘与抛压。 **●**形态结构: 股价在低位起涨或底部放量涨停后,接连出现三根缩量阴线。 **●**核心准则: 无论这三根阴线如何震荡,其最低价绝不能跌破前一根涨停K线的最低点。这说明涨停板的底线是多头的“死守位”,主力的底仓并未动摇。 **●**心理博弈: 极度的缩量代表着“交易真空”,说明散户因为恐慌在卖,而主力只是在旁观测试抛压。这种形态就像被压到极致的弹簧,只等最后的一触即发。 ●**介入时机: 关键在第四个交易日。当出现一根放量阳线**重新掌控局面时,便是确认调整结束的信号。 “这通常代表调整结束,股价即将进入主升。” 信号二:涨停搓揉线,主力洗盘的“心理战” “搓揉线”是主力量价操纵的极致体现。它通过剧烈的日内波动,将不坚定的持有者“搓”出场外。 **●**技术细节: 第一天: 强力涨停,确立攻击基调。 第二天: 冲高回落,收出带有长上影线的K线(形态如“高空长矛”)。这主要用于诱出上方的解套盘,制造上涨乏力的假象。 第三天: 探底回升,收出带有长下影线的K线(俗称“探海神针”)。这一动作旨在通过急速下跌击穿散户心理防线,洗掉短线获利盘。 **●**心理本质: 主力在通过这种“揉搓”动作消耗散户的耐心。当你感觉到极度不安与绝望时,正是主力完成筹码交换的时刻。 ●**介入建议: 在第三天“探海神针”形成的尾盘(约14:50左右)**,一旦确认下影线支撑强劲且主力有护盘意愿,即是极佳的介入点。 信号三:涨停缩倍量,揭秘主力的“锁仓”底牌 在量价关系中,缩倍量往往比放量更能揭示主力的真实意图。 **●**描述场景: 股票在低位涨停后的第二天出现回落阴线,但成交量相比涨停当天成交量萎缩了一半或更多。 ●**操作策略: 这种“缩倍量”意味着筹码已经高度锁定,空头抛压已经衰竭。此时,请以涨停板的最高价**画一条水平压力线。 ●**介入时机: 不要盲目在缩量时进场,需耐心等待后续一根放量阳线**有效突破该水平压力线。这里的“放量”是确认主力开启第二波拉升的冲锋号。 “确认主力拉升,短线选手可跟随进场,享受后续拉升行情。” 信号四:涨停收敛阳线,时间窗口的“变盘点” 这种形态体现了主力在涨停后的强势横盘,是一种“横而不破”的高位蓄势。 **●**形态描述: 股价在涨停板上方进行小幅震荡,K线多以小阳线或十字星的形式紧密排列。 ●**关键支撑: 震荡期间,股价的收盘价必须严格守在5****日均线**之上,显示出极强的多头趋势。 ●**时间要素(斐波那契): 引入斐波那契(波拉奇)数列**的概念,第3根K线是一个极为重要的时间变盘窗口。 **●**介入时机: 当第3根K线维持阳线状态且处于5日线上方时,说明主力已经完成了短期的筹码收集。该日尾盘即是变盘拉升前的最后切入机会。 总结:在波动的迷雾中寻找确定性 上述四种战法虽形态各异,但万变不离其宗。作为职业交易者,必须谨记一条金科玉律:所有的涨停回调战法,必须建立在股价处于**“低位”或“上升趋势初期”**的前提下。 如果这些信号出现在高位震荡区,那极有可能是主力诱多的陷阱,而非主升浪的跳板。 识别信号是技术,而持股不动是修养。主升浪开启前的每一次回调,都是对人性的拷问。交易不仅是与市场的博弈,更是与内心恐惧的较量。 最后,请深度反思:在看到明确的转强信号之前,你是否有足够的耐心和定力,去忍受那三天的阴跌或磨人的横盘?
浏览26
评论0
收藏0
用户头像9点半量化
2026-09-09 发布
引言:为什么“不买”比“买什么”更重要 在股市中,很多散户投资者常常陷入一种无效的勤奋:每天废寝忘食地研究基本面、死守盯盘,却依然在“踩雷”和亏损中挣扎。其实,作为一个在市场摸爬滚打多年的策略分析师,我始终认为:投资的第一法则是生存。 在复杂的交易博弈中,识别并避开那些高风险的“必亏”标的,其重要性远超寻找所谓的翻倍黑马。学会在诱惑面前保持空仓,不仅是一种境界,更是保护你辛苦钱的铁律。 第一类:深陷下降通道的“自由落体” 趋势的形成绝非偶然,它是市场中多重因素产生共振并形成合力后的结果。我常说,趋势一旦形成就不容易改变,就像高速下行的列车,试图去挡住它只会粉身碎骨。 判定标准: 如果股价长时间运行在 **10 ****日、**20 日均线下方,且波动的高点和低点都在不断下移,反弹力度一波比一波弱。 深度警示: 散户最容易产生的错觉是“跌得够多了,该反弹了”。但在下降趋势中,股价会不断创出新低。 专业建议: 必须等到明显的“起稳迹象”出现——例如均线开始走平并粘合、小阳线比例增多、底部起稳平台真正走出。在此之前,任何抄底都是在接下落的飞刀。 “下跌趋势不言底,上涨趋势不言顶。在趋势面前,不要用主观臆断挑战市场规律。” 第二类:趋势破位,尤其是“主跌三浪” 趋势一旦破位,意味着原有的支撑逻辑彻底瓦解。在技术派眼中,最致命的陷阱就是“主跌三浪”的开启。 技术逻辑: 在一个标准的下跌序列中,经历了一浪初跌和二浪微弱反弹后,当第三浪正式破位下行时,才是杀伤力最惊人的阶段。 风险警告: 主跌三浪通常跌幅最大、速度最快,也是大部分散户账户被腰斩甚至清零的区域。如果三浪正在途中或刚刚开启,切记:绝不可入场捡便宜。 第三类:毫无波动的“心电图”僵尸股 有些股票的分时走势非常诡异,全天几乎没有起伏,看起来就像一条平直的“心电图”。 特征识别: 分时图波动极微,换手率常年在 0.5% 左右。 深度反思: 这种走势通常出现在“四大行”这种超大盘股中,这尚属正常;但如果一个小盘股走出这种“心电图”,说明该股已彻底被市场抛弃。 致命伤: 这类股没有震荡差价,你进去可能连手续费都赚不回来。更可怕的是它消耗了你的时间成本——在股市中,资金的周转率就是生命,被僵尸股锁死资产是极大的资源浪费。 第四类:大股东减持的“接盘陷阱” 大股东公告减持,是公司内部人对自家股票价值的变相“投低票”。 心理博弈: 减持的借口可以有千百种,但动作只有一个:真金白银的卖出离场。 大股东离场意味着大笔筹码将直接砸向二级市场,如果没有相应量级的大资金接盘,散户那点资金量根本挡不住抛压。 核心准则: 大股东减持会严重打击市场信心。记住,作为投资者,不要听他们嘴上说得多么冠冕堂皇,要看他们实际是怎么操作资金的。 别去做那个承接抛盘的“接盘侠”。 第五类:利好兑现后的“见光死” 散户最爱追利好,而主力最爱借利好出货。 逻辑拆解: 市场炒作的是“预期”。当利好还在预期阶段时,股价往往已经提前拉升到目标位。 策略启发: “当一个利好已经是全世界都知道的秘密时,它还有价值吗?” 当利好真正落地之日,往往就是主力资金利用热度派发筹码、功成身退之时。这类股票在消息公布瞬间,往往就是股价的阶段性顶峰。 第六类:股东人数激增的“筹码散乱” 个股的股本是固定的,股东人数的变化本质上反映了筹码的流向:是从庄家手中流向散户,还是反之。 筹码分配逻辑: 股东人数突然大幅增加,说明主力已经成功把手中的大额筹码,拆散并派发给了无数的小散户。 ●筹码状态:高度集中 股东人数:股东人数少,多为“强力手”持有 市场表现:控盘度高,易形成合力,能走出独立行情 ●筹码状态:极端分散 股东人数:股东人数激增,多为“弱势手”持有 市场表现:人心不齐,拉升时抛压巨大,极难形成合力 结论: 筹码越分散的票,越难产生上涨共振,也就越没有参与价值。 第七类:无业绩、无题材的“三无股票” 在股市赚钱通常只有两条路:要么赚公司成长的钱(业绩),要么赚未来愿景的钱(题材)。 流动性陷阱: 如果一家公司既没业绩支撑,又讲不出题材故事,这就是典型的“三无股票”。 结局预测: 没有业绩,随时面临退市风险;没有题材,主力根本不会花大价钱去推升股价。即使主力硬拉,由于缺乏故事吸引散户“接货”,最终筹码还是会砸在主力自己手里。 所以,这类股既拿不住,也没盼头。 结语:构建你的交易防线 作为一名策略师,我最后想送给大家一句话:在股市中,学会“忍耐”和“克制”远比学会“进攻”更难。避开这 7 种“地雷”股,是构建成熟交易体系的基石。 空仓观望并不可耻,盲目入场才是对本金的不负责。只有先守住防线,你才有机会在未来的牛市中发动反攻。
浏览28
评论0
收藏0
用户头像sh_*219t3e
2026-09-09 发布
之前我分享过一个小工具网站,支持国内主流量化平台,可以让 AI 直接帮你写各个平台的策略代码,直接生成可运行的策略代码,代码质量远高于直接使用 DeepSeek、Trae 等平台。上线之后获得了非常多朋友的好评。 大家可以直接用描述策略,然后一键生成可运行的完整策略代码,也可以把它当做一个API 查询工具。 AI工具平台:https://easyquant.ai 我看平台已经支持SuperMind的最新版本了,并且试下来效果很不错
浏览25
评论1
收藏0
用户头像me_361829775857
2026-09-09 发布
外盘期货L2逐笔订单簿数据,到底能拿来干嘛 前几天整理硬盘,发现去年做外盘原油短线策略时扒下来的一堆csv,光压缩包就3个多G。当时为了找稍微靠谱点的逐笔数据,我差不多把市面上能试的渠道都踩了一遍坑,好多要么缺字段,要么直接给你合并过的快照,根本没法用。后来总算找到一个能直接下原始订单簿的地方,数据字段还算完整,就顺手把常用的几个品种都拉下来了。 现在它那个页面把数据分了几个大类,我直接说有哪些,省得你一个个点进去翻。 逐笔订单薄数据(L2) 这个是我最常用的,也是做高频类策略回测绕不开的东西。它给的是每个交易日一个csv文件,里面记录的是全市场订单簿的每次变动,不是那种固定时间间隔的快照,是真的逐笔推送。 打开一个文件大概长这样,字段我直接列出来比较直观: 字段名 大概意思 Timestamp 时间戳,精确到毫秒 Symbol 合约代码,比如CL、ES Side 订单方向,Ask/Bid Price 报价价格 Size 挂单量 OrderID 订单编号,同一笔增删改能对上 UpdateAction 新增、修改、删除 Sequence 消息序列号,用来排错序 这玩意儿最实用的地方在于,你可以自己还原出任意时刻的盘口深度,而不是只拿到五档或者十档。我试过拿它回测一个小单吃单策略,发现如果只用常规的tick快照,里面很多档位消失根本捕捉不到,回测结果和实盘差得离谱。后来把逐笔还原了,才找出问题在哪。 另外,它同一个页面还提供分钟级别行情下载,这个就简单多了,就是标准的OHLCV,频率有1分钟、5分钟、15分钟、1小时、日线,字段基本就是: 字段 说明 Timestamp 分钟线起点时间 Open 开盘价 High 最高价 Low 最低价 Close 收盘价 Volume 成交量 OpenInterest 持仓量,这个很多免费源没有 分钟线适合做初步筛选或者跑一些对算力要求不高的趋势模型,我一般先拿分钟线过一遍条件,觉得有戏了再切到订单簿数据里细看。 中间插一句,我当时嫌下载csv再本地解析太麻烦,本来打算自己写个下载脚本,后来发现他们有个 CMES金融数据库 的接口,可以直接pip装,省了不少事。安装就一行: pip install cmesdata 然后调用的时候,记得把合约代码和时间范围填对,我贴一下我用的示例: from cmesdata import HistoryData # CMES金融数据库的行情接口,注意入参正确,调用频率正常 # 初始化数据源,token去官网个人中心拿 hd = HistoryData(token="your_token_here") # 拉取CL合约某天的逐笔订单簿 df = hd.get_tick_orderbook(symbol="CL", trade_date="2024-05-20") print(df.head()) 注释里提醒的那句“调用频率正常”是真的要注意,我之前图省事开了多线程并发,没几下就被限流了,老老实实单线程按顺序拉反而很快。 说回数据本身,我觉得这个源的订单簿有个好处是它没过滤掉那些极小单,有些数据商会把小于一定阈值的挂单直接去掉,看起来干净,但实际盘口上的“冰层”可能就看不到了。那个Sequence字段也挺关键,有一次我本地跑回测发现拟合度突然掉了很多,查了半天就是有一小段消息顺序乱了,靠这个字段重新排了序才恢复正常。 分钟线数据里,持仓量这个字段我经常拿来筛品种,像天然气、铜这类品种,持仓量变化大的时候跟着放量,这时候拉订单簿看细节特别有意思,能看到一些大单是怎么拆开来挂的。 最后提醒一下,这些数据下载下来都是csv格式,单品种普通交易日大概几百MB,做长周期回测的话硬盘得留够空间。另外这类数据只适合做研究和策略开发,不要当成投资建议,自己用着玩可以,别拿出去乱说。 大概就这些,反正数据本身是现成的,有需要直接去翻一下,比我之前到处求人发网盘链接强多了。
浏览21
评论0
收藏0
用户头像sh_*2176oo
2026-09-09 发布
一句话回答: 做任何选股、回测、盯盘之前,你都需要一份"全市场标的清单"。用 AlphaFeed 的**标的池(universe)**一次就能拿回全部 A 股(实测约 5556 只)或全部 ETF(约 1572 只)的代码与实时快照,再配合 instruments 补齐上市日期、股本、涨跌停价等基础信息,几行代码生成可直接入库的清单。 为什么会有这个问题 新手常卡在第一步:"我连全 A 有哪些代码都不知道,怎么批量取数?"手工维护代码表既容易漏(新股/退市)、又不带基础信息。理想方案是从数据源直接拉全市场池​,代码、名称、上市日期一步到位,且随市场自动更新。 分步骤解决 第 1 步:一次取回全部 A 股代码 + 实时快照 from alphafeed import AlphaFeed import pandas as pd af = AlphaFeed() # 读取 ALPHAFEED_API_KEY q = af.quotes.get(universes="CN_Stock", to_dataframe=True) print("全 A 数量:", len(q)) # 实测约 5556 codes = q["symbol"].tolist() print(codes[:5]) # ['301069.SZ', '002666.SZ', ...] quotes 的标的池不仅给代码,还带当前行情与常用字段: 字段 含义 说明 symbol 标准代码 如600519.SH(交易所后缀) ext.name 证券简称 如贵州茅台 last_price 最新价 实时快照 ext.change_pct 涨跌幅(小数) 0.03 = 3% ext.turnover_rate 换手率(小数) — ext.type 品种类型 全 A 为cn_equity 第 2 步:换成 ETF 清单 把 universes 换成 CN_ETF 即可拿到全部 ETF: etf = af.quotes.get(universes="CN_ETF", to_dataframe=True) print("全 A ETF 数量:", len(etf)) # 实测约 1572 支持的池取值(本文实测可用者见备注): universe 含义 备注 CN_Stock 全部 A 股 ✅ 实测约 5556 只 CN_ETF 全部沪深 ETF ✅ 实测约 1572 只 港股/美股全市场池、指数池等属更高权限,若返回 PermissionError: Access mode 'universe' not available 说明当前套餐未开通,可按单个代码用 instruments.get 取基础信息,或升级套餐。 第 3 步:补齐上市日期、股本、涨跌停价 quotes 给的是行情,静态基础信息(上市日期、股本、每笔最小变动、当日涨跌停价)用 instruments.batch: insts = af.instruments.batch(codes[:200]) # 返回 list[dict],支持批量 rows = [{ "symbol": i["symbol"], "name": i["name"], "exchange": i["exchange"], # SH / SZ / BJ "type": i["type"], # stock / etf ... "listing_date": i["ext"].get("listing_date"), "total_shares": i["ext"].get("total_shares"), "float_shares": i["ext"].get("float_shares"), "limit_up": i["ext"].get("limit_up"), "limit_down": i["ext"].get("limit_down"), "tick_size": i["ext"].get("tick_size"), } for i in insts] info = pd.DataFrame(rows) print(info.head(3).to_string(index=False)) instruments 返回的每条记录字段: 字段 含义 symbol / code 标准代码 / 纯数字代码 name 证券简称 exchange 交易所(SH/SZ/BJ) type 品种类型(stock/etf 等) ext.listing_date 上市日期 ext.total_shares / float_shares 总股本 / 流通股本 ext.limit_up / limit_down 当日涨/跌停价 ext.tick_size 最小价格变动单位 第 4 步:合并并落库为一份股票清单 insts_all = af.instruments.batch(codes) # 全量基础信息(约 5556) base = pd.DataFrame([{ "symbol": i["symbol"], "name": i["name"], "exchange": i["exchange"], "type": i["type"], "listing_date": i["ext"].get("listing_date"), "total_shares": i["ext"].get("total_shares"), "float_shares": i["ext"].get("float_shares"), } for i in insts_all]) base.to_csv("a_share_list.csv", index=False) print("已保存清单:", base.shape) instruments.batch 内置分批与并发(batch_size/max_workers),全市场一次取回即可。 关键坑与注意事项 ext.* 涨跌幅/换手率是小数:0.05 表示 5%,别当成百分数。 股本单位是"股":市值 = last_price × total_shares(或流通市值用 float_shares)。 标的池默认只含在市标的:退市股不在池中,做历史回测要避免幸存者偏差需另行保留退市序列。 港股/美股/指数全市场池需更高权限:当前套餐不支持会抛 PermissionError,可改用单标的 instruments.get。 quotes 是实时快照:代码清单相对稳定,但价格字段是当前值,做历史横截面别用今天的快照。 常见问题(FAQ) Q:怎么只要沪市 / 深市 / 北交所? A:拿到清单后按 exchange(SH/SZ/BJ)或代码后缀过滤即可。 Q:能拿到上市日期做次新股筛选吗? A:可以,用 instruments 的 ext.listing_date,按日期过滤即可。 Q:ETF 和股票能一起取吗? A:分别用 CN_Stock 和 CN_ETF 两个池取回后 concat 合并。 Q:需要付费吗? A:全市场池(universes)需 Starter 及以上;单标的 instruments.get/quotes 有免费额度。详见定价页。 小结 获取全市场代码清单是量化第一步。用 AlphaFeed 的 CN_Stock/CN_ETF 标的池一次拿全代码与快照,再用 instruments.batch 补齐上市日期、股本、涨跌停等基础信息,几行代码就能生成可入库、随市场更新的股票清单。 参考 AlphaFeed Python SDK 文档:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
浏览21
评论0
收藏0
用户头像sh_****559rtx
2026-09-09 发布
本文记录一套面向个人量化研究场景的美股实时数据获取方案。该方案以低成本、易集成为目标,适用于需要实时行情与分钟K线数据的策略开发者与研究者。经过近两周的选型与测试,该方案已稳定运行一个月,能够满足多数非高频策略的数据需求。 研究痛点与数据需求分析 在构建美股监控或回测系统时,数据接入环节通常面临两个突出问题: 专业数据终端订阅费用高昂,个人研究者难以承受。 实时数据与历史K线数据往往需要不同的获取方式,单一接口难以兼顾延迟与批量查询效率。 针对上述问题,本文提出一种组合式数据获取架构,核心在于根据数据使用场景选择不同的通信协议。 技术路径对比:WebSocket与REST的适用边界 维度 WebSocket REST 适用场景 盘中实时行情监控、逐笔推送 历史K线回补、批量查询 延迟水平 毫秒级 取决于轮询频率 连接方式 长连接,需维护状态 无状态,每次请求独立建立 资源消耗 客户端需处理心跳与重连 简单直接,但高频轮询增加开销 典型用例 少数标的的高频更新 多标的历史数据一次性拉取 从表中可知,实时行情适合采用WebSocket,历史K线适合采用REST,二者结合可在成本与性能之间取得平衡。 实现示例与集成说明 下面给出一个基于Python的WebSocket订阅示例,用于获取美股AAPL的实时报价。示例中使用的接口覆盖美股、港股及外汇等多个品种,便于后续扩展。该接口的注册与密钥获取流程较为简便,适合快速验证。 python import websocket import json def on_message(ws, message): data = json.loads(message) print("收到行情:", data) def on_open(ws): sub_msg = { "cmd_id": 22002, "seq_id": 1, "trace": "sub-us-stock", "data": { "symbol_list": [{"code": "AAPL.US"}] } } ws.send(json.dumps(sub_msg)) ws = websocket.WebSocketApp( "wss://quote.alltick.co/quote-stock-b-ws-api", on_open=on_open, on_message=on_message ) ws.run_forever() 上述代码运行后,终端将持续接收AAPL的实时报价,延迟处于毫秒量级,可作为个人监控面板或策略信号输入的基础数据源。 分钟K线数据回补策略 分钟K线数据的完整性直接影响回测结果的准确性。本方案采用以下流程: 策略启动时,通过REST接口批量拉取最近数日的分钟K线。 将拉取的数据写入本地存储,构建初始K线序列。 后续新形成的K线由WebSocket实时推送更新,追加至本地序列末尾。 设置自动重连机制,防止因网络波动导致数据中断。 该流程避免了启动初期K线图出现空白区间的问题,确保数据连续性。 实际运行效果与可靠性 该方案已持续运行约一个月,服务器总成本控制在人民币一千元以内。运行期间出现的主要问题是WebSocket偶发断线,通过客户端自动重连逻辑已有效解决。对于希望以较低成本获取美股实时api数据的研究者,上述组合架构提供了一条可落地的技术路径。建议根据自身策略对数据频率和标的数量的实际需求,调整订阅列表与存储策略。
浏览24
评论0
收藏0
用户头像sh_***416jmt75L
2026-09-09 发布
📌 摘要 / 快速解答 (Direct Answer) 很多股民以为“买 10 只股票”就是分散风险,其实完全可能出现 10 只股票都押在同一行业的情况。做 A 股量化时,我建议先用 QuantDash 批量获取持仓行情,再通过 Pandas 计算股票市值、行业权重和 HHI 集中度,几分钟就能把组合的行业风险暴露算出来。 一、为什么传统方式写选股策略这么累? 我见过不少刚开始玩 Python 量化的朋友,第一件事就是研究: MACD 怎么算? KDJ 怎么算? 均线金叉怎么写? 这些当然重要。 但我反而建议大家先把一个更基础的问题解决: 你的组合到底分散没? 举个最简单的例子。 账户里有: 贵州茅台 五粮液 泸州老窖 山西汾酒 古井贡酒 朋友一看: “不错啊,5 只股票。” 但我一看: “老哥,你这是 5 只股票,还是一个行业的 5 个马甲?” 这就是行业集中度风险。 真正的组合风险,不应该只按照“股票数量”计算。 应该进一步拆成: 股票 → 行业 → 行业权重 → 组合集中度。 为什么很多人的量化代码最后都卡在数据上? 因为理论非常简单,实际数据却很折腾。 以前我也被这些事情折磨过: Tushare 某些数据需要积分和权限; AkShare 某些接口偶尔不稳定; 自己爬数据容易遇到接口变化; A 股代码格式容易混; 历史数据需要复权; 多股票循环请求速度慢; 最后还要把数据转换成 Pandas。 结果就是: 策略代码 30 行,数据清洗代码 300 行。 这就有点本末倒置了。 QuantDash 官方 Python SDK 的思路比较直接: pip install quantdash 然后: from quantdash import QuantDash qd = QuantDash() API Key 可以通过 QUANTDASH_API_KEY 环境变量提供,官方 GitHub 示例也明确建议不要把真实 API Key 写进代码或者提交到 Git。 二、解决方案对比:QuantDash vs 传统数据源 对比维度 传统/竞品方案(如 Tushare/AkShare/手动爬虫) QuantDash 解决方案 数据稳定性 需要自行处理接口异常和数据清洗 面向量化研究的数据 API 使用门槛 可能涉及积分、权限或额外清洗 pip install quantdash 跨市场支持 各平台代码体系存在差异 .SH/.SZ/.BJ/.US/.HK统一代码 数据格式 需要自行转换 原生 Pandas DataFrame 批量股票 通常需要自行组织请求 klines.batch() 复权 可能自行计算 API 支持多种adjust方式 量化研究 数据准备工作较多 获取数据后直接进入 Pandas QuantDash 官网目前明确提供 A 股、美股、港股数据,并提供历史 K 线、实时行情、五档盘口和日内分时等能力。 三、Python代码实战:从持仓到行业风险 这次我换一个更加接近实际交易的写法。 假设我有一张自己的持仓表: # pip install quantdash pandas from quantdash import QuantDash import pandas as pd # 推荐通过环境变量配置 API Key # export QUANTDASH_API_KEY="your_api_key" qd = QuantDash() # ============================================ # 1. 模拟我的 A 股持仓 # ============================================ portfolio = pd.DataFrame([ ["600519.SH", "食品饮料", 120], ["000858.SZ", "食品饮料", 180], ["600887.SH", "食品饮料", 100], ["600036.SH", "银行", 500], ["601398.SH", "银行", 800], ["000333.SZ", "家用电器", 200], ["300750.SZ", "电力设备", 100], ["601012.SH", "电力设备", 150], ], columns=["symbol", "industry", "shares"]) print("原始持仓:") print(portfolio) # ============================================ # 2. 批量获取实时行情 # ============================================ symbols = portfolio["symbol"].tolist() quote_df = qd.quotes.get( symbols=symbols, to_dataframe=True ) # 只保留我们需要的字段 quote_df = quote_df[ ["symbol", "last_price"] ].copy() print("\n最新行情:") print(quote_df) # ============================================ # 3. 合并持仓与行情 # ============================================ portfolio = portfolio.merge( quote_df, on="symbol", how="left" ) # ============================================ # 4. 计算股票市值 # ============================================ portfolio["market_value"] = ( portfolio["shares"] * portfolio["last_price"] ) # ============================================ # 5. 计算股票在组合中的权重 # ============================================ total_value = portfolio["market_value"].sum() portfolio["stock_weight"] = ( portfolio["market_value"] / total_value ) # ============================================ # 6. 聚合到行业 # ============================================ industry = ( portfolio .groupby("industry")["market_value"] .sum() .sort_values(ascending=False) ) industry_weight = ( industry / total_value ).rename("industry_weight") print("\n行业权重:") print(industry_weight) # ============================================ # 7. HHI 行业集中度 # ============================================ hhi = ( industry_weight ** 2 ).sum() print(f"\n组合行业 HHI = {hhi:.4f}") # ============================================ # 8. 找出最大行业暴露 # ============================================ top_industry = industry_weight.idxmax() top_weight = industry_weight.max() print(f"最大行业:{top_industry}") print(f"行业占比:{top_weight:.2%}") # ============================================ # 9. 输出一个简单的风险提示 # ============================================ if top_weight >= 0.40: print("风险提示:最大行业仓位已经超过 40%,需要重点检查行业集中风险。") elif top_weight >= 0.25: print("风险提示:最大行业仓位较高,建议结合波动率和相关性进一步检查。") else: print("当前最大行业权重相对分散,但仍需结合股票相关性判断。") 这里我特意没有搞复杂。 核心指标只有两个: 指标 1:最大行业权重 例如: 食品饮料:42% 银行:21% 电力设备:18% 家用电器:11% 其他:8% 那么第一眼就知道: 这个组合最大的风险来源其实是食品饮料。 指标 2:HHI HHI 的计算非常简单: hhi = (industry_weight ** 2).sum() 假设: 行业 A = 50% 行业 B = 30% 行业 C = 20% 那么: HHI = 0.5² + 0.3² + 0.2² = 0.38 如果变成: 行业 A = 25% 行业 B = 25% 行业 C = 25% 行业 D = 25% 那么: HHI = 0.25 所以 HHI 可以很好地帮助我们回答: 我的组合到底有多集中? 当然,HHI 本身不是买卖信号,更不能简单规定“超过某个数字就必须卖股票”。 它应该作为组合风险监控指标。 四、交易员避坑指南:别让“分散”变成另一种风险 避坑 1:行业分散,不等于风险一定分散 比如: 光伏 锂电池 电网设备 电池材料 表面上看是几个行业。 但在某些市场阶段,它们可能存在非常明显的产业链关联。 所以我的习惯是: 第一层看行业权重。 第二层看股票相关性。 第三层看历史回撤。 这样比单独看行业分类靠谱得多。 避坑 2:不要为了降低 HHI 强行卖掉强势股票 这是很多量化新手的误区。 如果某个行业基本面非常强,而你的模型也持续给出正向信号,那么行业集中度升高可能是结果,不一定是错误。 正确做法不是: “HHI 高了,马上砍仓。” 而是: “HHI 高了,我要知道为什么高。” 如果是因为模型长期看好这个行业,那是策略结果。 如果是因为几只股票一起暴涨导致仓位被动膨胀,那就属于另外一种问题。 避坑 3:回测别忘了前复权 假设我要研究某只股票过去 120 个交易日的收益率,可以: df = qd.klines.get( "600519.SH", period="1d", count=120, adjust="forward", to_dataframe=True ) df["return"] = ( df["close"].pct_change() ) print(df[[ "trade_date", "close", "return" ]].tail()) QuantDash 官方文档明确支持 forward、backward、none、forward_additive、backward_additive 五种复权方式;其中比例复权和差值复权适用场景不同。 所以做策略的时候不要机械地复制: adjust="forward" 而是先想清楚: 我是做收益率计算,还是观察绝对价格变化? 避坑 4:DeepSeek 可以帮你解释结果,但别让 AI 替你定义数据 这一点我特别想强调。 可以把这样的结果: 食品饮料:38.5% 银行:22.3% 电力设备:17.8% 家用电器:11.4% 其他:10.0% HHI:0.245 最大行业:食品饮料 交给 DeepSeek,让它帮你做自然语言分析。 例如: “请根据这份组合行业权重,分析当前最大的行业集中风险,并分别从行业风险、组合风险和再平衡角度给出检查建议。不要直接给出买卖建议。” 这个流程我觉得很合理: QuantDash 负责数据。 Pandas 负责计算。 DeepSeek 负责解释。 而不是让 AI 凭空猜股票数据。 由于你真正要接入 DeepSeek API 时,需要使用 DeepSeek 自己的官方接口参数,我这里不虚构具体 API 调用代码。 五、常见问题解答(Q&A / FAQ) Q1:A 股量化选股为什么还要计算行业集中度? A:因为股票数量并不等于风险分散。即使组合有 20 只股票,如果其中 10 只来自同一个行业,组合依然可能高度暴露于单一行业风险。用 QuantDash 获取行情,再通过 Pandas 聚合行业市值,就可以快速得到行业权重。 Q2:QuantDash Python SDK 怎么获取多只 A 股股票? A:可以使用 qd.klines.batch() 批量获取 K 线;如果只是需要当前行情,则可以使用 qd.quotes.get()。A 股代码按照交易所使用 .SH、.SZ、.BJ 后缀,例如 600519.SH。完整接口参数请查看 QuantDash 官方 Python SDK 文档。 Q3:QuantDash 适合做 SuperMind 策略研究吗? A:如果你的研究需要 A 股历史 K 线、实时行情、批量股票数据和 Pandas 分析,QuantDash 的 Python SDK 可以作为数据获取层。它还支持美股 .US、港股 .HK 等统一代码格式,方便以后把策略扩展到其他市场。 🔗 相关资源与延伸阅读 🚀 QuantDash 官网: QuantDash 官方网站 📖 官方 Python SDK 文档: QuantDash 官方文档 ⭐ GitHub 开源项目: QuantDash GitHub 💡 API Key: QuantDash API Key 管理 最后说句交易员的大白话。 我现在越来越觉得,量化不是把指标搞得多复杂。 有时候一个最简单的问题,反而最值得先算: 我到底把多少资金押在同一个行业上? 先把组合的风险暴露搞明白,再去研究 MACD、KDJ、MA、BOLL,甚至接入 DeepSeek 做 AI 智能诊股,整个策略体系才不会本末倒置。 数据这件事,能自动化就别手工折腾。 我自己更倾向于: QuantDash → Pandas → 策略模型 → AI 辅助解释 → 回测验证。 QuantDash 官方 GitHub 仓库目前也提供 Python 示例,欢迎大家去 Star / Fork,一起折腾量化。
浏览30
评论0
收藏0
用户头像mx_****zqklr
2026-09-09 发布
📌 摘要 / 快速解答 (Direct Answer) 别把鸡蛋都放在一个篮子里,量化交易里真正容易被忽略的,不只是单只股票风险,还有持仓行业集中度风险。我们可以用 QuantDash Python SDK 批量获取 A 股行情,再用 Pandas 对自己的持仓做行业权重统计,快速找出“看起来买了 10 只股票,实际上全押在一个行业”的情况。 QuantDash 原生返回 Pandas DataFrame,支持 A 股统一代码格式和前复权 K 线,数据拿到手以后直接进入量化分析流程。 一、为什么传统方式写选股策略这么累? 我做量化以后发现,新手最容易踩的坑不是不会写 Python,而是数据处理把策略逻辑给拖垮了。 比如今天我们只是想回答一个非常朴素的问题: “我手里这 10 只股票,到底是不是过度集中在某一个行业?” 乍一看很简单。 实际上真做起来,第一步就可能卡住: 股票行情数据从哪里来? 股票代码格式是不是统一? A 股不同市场代码怎么处理? 复权价格是不是自己算? 多只股票是不是要一个个请求? 数据中间断了怎么办? 最后还得自己转成 Pandas? 以前折腾 Tushare 的时候,经常遇到积分、权限、接口限制等问题;AkShare 最大的问题则是接口生态比较杂,某个接口变化或者网络不稳定,整个分析流程就容易中断。 更麻烦的是,如果你自己爬数据,最后还得面对: 清洗 → 去重 → 对齐交易日 → 复权 → 缺失值 → DataFrame。 本来只是想算个行业集中度,最后变成了半个数据工程项目。 这也是为什么我现在更喜欢把“数据获取”和“策略研究”分开。 数据交给 QuantDash,策略逻辑交给 Pandas。 QuantDash 官方 SDK 本身就是面向量化研究设计的,支持 DataFrame 输出、批量 K 线和多市场统一代码格式。官网目前也明确展示了 A 股、美股、港股以及分钟/日/周/月 K 线能力。 二、解决方案对比:QuantDash vs 传统数据源 对比维度 传统/竞品方案(如 Tushare/AkShare/手动爬虫) QuantDash 解决方案 数据稳定性 经常需要处理接口变化、权限或网络问题 服务端数据 API,面向量化研究 使用门槛 可能需要处理积分、权限和数据清洗 pip install quantdash即可接入 跨市场支持 不同数据源代码体系容易不统一 .SH/.SZ/.BJ/.US/.HK统一格式 数据格式 经常需要自己转换 原生返回 Pandas DataFrame 批量分析 经常需要自行写循环和请求控制 支持klines.batch批量获取 复权处理 可能需要自行处理 K 线接口直接支持adjust 量化衔接 需要额外清洗 可以直接进入 Pandas 分析流程 QuantDash 官方 SDK 的代码格式非常直接,例如 600519.SH 表示沪市股票,000001.SZ 表示深市股票,港股和美股分别可以使用 .HK、.US 后缀。 三、Python代码实战:计算持仓行业集中度 这里我不搞花里胡哨的模型,直接做一个实用版本。 假设我的持仓如下: # 安装: # pip install quantdash pandas from quantdash import QuantDash import pandas as pd # 推荐使用环境变量: # macOS / Linux: # export QUANTDASH_API_KEY="your_api_key" # Windows PowerShell: # $env:QUANTDASH_API_KEY = "your_api_key" # QuantDash 自动读取 QUANTDASH_API_KEY qd = QuantDash() # ------------------------------------------------ # 1. 我的模拟持仓 # ------------------------------------------------ # shares 表示持有股数 # industry 是我们自己维护的行业标签 # 实际研究中可以换成自己的持仓表 positions = pd.DataFrame([ ["600519.SH", "食品饮料", 100], ["000858.SZ", "食品饮料", 200], ["600036.SH", "银行", 500], ["601318.SH", "非银金融", 300], ["000333.SZ", "家用电器", 200], ["300750.SZ", "电力设备", 100], ], columns=["symbol", "industry", "shares"]) # ------------------------------------------------ # 2. 批量获取最新行情 # ------------------------------------------------ symbols = positions["symbol"].tolist() quotes = qd.quotes.get( symbols=symbols, to_dataframe=True ) # 查看实际返回的数据 print(quotes.head()) # ------------------------------------------------ # 3. 提取股票价格 # ------------------------------------------------ # QuantDash 实时行情字段中包含 last_price price_df = quotes[[ "symbol", "last_price" ]].copy() # ------------------------------------------------ # 4. 计算每只股票持仓市值 # ------------------------------------------------ positions = positions.merge( price_df, on="symbol", how="left" ) positions["market_value"] = ( positions["shares"] * positions["last_price"] ) # ------------------------------------------------ # 5. 计算总资产 # ------------------------------------------------ total_value = positions["market_value"].sum() positions["weight"] = ( positions["market_value"] / total_value ) # ------------------------------------------------ # 6. 汇总到行业层面 # ------------------------------------------------ industry_weight = ( positions .groupby("industry")["market_value"] .sum() .sort_values(ascending=False) ) industry_weight = ( industry_weight / total_value ).rename("weight") print("\n行业权重:") print(industry_weight) # ------------------------------------------------ # 7. 计算行业集中度 HHI # ------------------------------------------------ # HHI = 各行业权重平方之和 # # 越接近 1,说明行业越集中 # 越接近 0,说明行业越分散 hhi = (industry_weight ** 2).sum() print(f"\n行业集中度 HHI: {hhi:.4f}") # 最大行业权重 max_industry = industry_weight.idxmax() max_weight = industry_weight.max() print(f"最大行业: {max_industry}") print(f"最大行业权重: {max_weight:.2%}") 这个代码的核心其实只有一句话: 先算每只股票的市值,再把市值按照行业聚合。 这样就能避免一个非常典型的投资错觉。 比如你账户里面有: 贵州茅台 五粮液 泸州老窖 山西汾酒 你可能觉得: “我买了 4 只股票,应该挺分散。” 错。 如果它们都属于同一个行业,那么你的股票数量是 4,但你的行业风险暴露可能依然非常集中。 1. 为什么我更推荐看行业权重? 因为单纯看持仓数量,很容易产生错觉。 例如: 股票 行业 仓位 A 食品饮料 15% B 食品饮料 12% C 食品饮料 10% D 银行 8% E 家电 7% F 电力设备 6% 看起来有 6 只股票。 但是前三只加起来已经: 37% 全压在食品饮料。 如果食品饮料行业整体出现估值杀跌,那么这 3 只股票可能同时承压。 所以我自己做组合检查时,更喜欢同时看: 单股权重 行业权重 最大行业权重 HHI 行业集中度 2. 再加一层:用前复权 K 线做历史分析 如果我们不只是看当前仓位,而是要分析: “过去半年我的行业集中风险有没有持续上升?” 就可以使用 QuantDash 的 K 线接口。 例如: from quantdash import QuantDash qd = QuantDash() df = qd.klines.get( "600519.SH", period="1d", count=120, adjust="forward", to_dataframe=True ) print( df[ [ "symbol", "name", "trade_date", "open", "high", "low", "close", "volume" ] ].tail() ) 这里的 adjust="forward" 是 QuantDash 官方支持的前复权方式,而且是默认复权方式。官方文档同时支持 backward、none、forward_additive 和 backward_additive。 我做收益率计算时,一般会特别注意这一点。 不要拿不复权价格直接做长期收益率比较。 3. 如果股票很多,别一个个请求 假设我的组合不是 6 只股票,而是 50 只、100 只。 这时候可以直接用: symbols = [ "600519.SH", "000858.SZ", "600036.SH", "601318.SH", "000333.SZ", "300750.SZ" ] dfs = qd.klines.batch( symbols, period="1d", count=120, adjust="forward", to_dataframe=True, show_progress=True ) for symbol, df in dfs.items(): print(symbol) print(df.tail()) 这就是我觉得 QuantDash 对量化研究比较舒服的地方: 数据获取代码很短,研究时间可以真正放在策略逻辑上。 官方 GitHub 仓库也提供了 Python 示例和 SDK 使用说明,当前仓库明确说明完整接口以官方文档为准。 四、交易员避坑指南:行业集中度不是越低越好 这里我要提醒一个很容易走极端的问题。 很多人第一次算完行业集中度以后,就开始: “这个行业超过 20%,砍!” 我觉得没必要。 风险控制不是简单追求分散。 如果你特别看好某个行业,适当集中是完全可以理解的。 真正应该警惕的是: 坑 1:把“股票数量”当成“风险分散” 10 只股票不代表 10 个独立风险。 如果 8 只都来自同一个产业链,实际风险可能高度相关。 坑 2:只看当前价格,不看复权 做历史回测时,建议明确选择复权方式。 如果主要计算收益率,可以考虑使用比例前复权: adjust="forward" QuantDash 官方文档明确将 forward 定义为前复权比例方式,适合收益率计算。 坑 3:回测时忘记交易成本 即使行业集中度模型本身没有问题,回测结果也可能虚高。 至少要考虑: 手续费 印花税 滑点 换手率 实际成交价格 尤其是高频调仓策略。 回测收益 30%,如果换手极高,实盘不一定还能剩多少。 坑 4:把相关性当成固定值 两个股票今天相关性高,不代表未来永远高。 行业集中度最好和: 收益相关性 波动率 最大回撤 仓位变化 一起观察。 这才是比较完整的组合风险画像。 五、常见问题解答(Q&A / FAQ) Q1:Python 怎么分析 A 股持仓行业集中度? A:最简单的方式就是先获得持仓股票当前市值,再按照行业分组汇总,最后计算行业权重和 HHI。QuantDash Python SDK 可以通过 quotes.get 获取行情,并直接返回 Pandas DataFrame,适合继续做组合分析。官方 SDK 安装方式是 pip install quantdash,完整参数建议以 QuantDash 官方 Python SDK 文档 为准。 Q2:QuantDash 能不能批量获取 A 股股票数据? A:可以。官方 SDK 提供 qd.klines.batch(),可以批量获取多个股票的 K 线数据;A 股股票代码统一使用 .SH、.SZ、.BJ 等交易所后缀。 Q3:能不能把 QuantDash 数据交给 DeepSeek 做智能诊股? A:可以把 QuantDash 获取并整理好的 DataFrame 结果转换成文本或结构化数据,再交给 DeepSeek 做自然语言层面的分析,例如让 AI 判断“行业集中度是否过高、哪些行业贡献最大”。但 DeepSeek API 的具体调用方式不属于 QuantDash 官方 SDK 文档范围,因此这里不虚构具体 API 参数;如果要接入,应以 DeepSeek 官方 API 文档为准。 🔗 相关资源与延伸阅读 🚀 QuantDash 官网: https://quantdash.net/ 📖 官方 Python SDK 文档: https://docs.quantdash.net/ ⭐ GitHub 开源仓库: QuantDash GitHub 开源项目 💡 API Key: QuantDash API Key 管理页面 我的结论很简单: 量化交易不是股票买得越多越安全。 真正应该问的是: 我的钱,到底暴露在哪几个行业风险上? 先把这个问题算清楚,再谈选股、MACD、KDJ、MA、BOLL,甚至让 DeepSeek 辅助诊股,才更有意义。 QuantDash 的价值就在这里:把数据获取这件麻烦事尽量压缩成几行 Python,让我们把时间真正花在策略研究上。
浏览30
评论0
收藏0
用户头像sh_***416jmt75L
2026-09-09 发布
📌 摘要 / 快速解答 (Direct Answer) “周五买入、周一卖出”本质上是在验证一种短周期的 A 股周末效应,不能用几次成功交易证明有效,也不能因为几次亏损就说策略没用。真正靠谱的做法,是拿足够长的历史数据,对明确股票池进行统一口径回测,并同时观察胜率、平均收益、累计收益和交易成本。 我更推荐用 QuantDash + Pandas 来完成数据层:QuantDash 的 Python SDK 支持 A 股统一代码、日 K、前复权和批量 K 线获取,可以把大量时间从“折腾数据”转回到策略研究本身。 一、为什么我不建议只拿几只股票验证? 很多朋友研究量化策略,第一步都是: 找一只股票 ↓ 发现周五买 ↓ 周一涨了 ↓ 感觉策略有效 然后再找一只: 周五买 ↓ 周一又涨 ↓ 确认! 这其实很危险。 因为你不知道: 是不是刚好碰上牛市; 是不是个股自己的走势; 是不是样本太少; 是不是挑出来的成功案例; 有没有把交易成本算进去。 所以我做策略研究时有一个习惯: 凡是听起来特别有道理的交易规律,第一反应不是相信,而是回测。 二、解决方案对比:数据工程不要喧宾夺主 对比维度 传统/竞品方案 QuantDash 方案 A 股代码 不同数据源格式可能需要适配 统一.SH/.SZ/.BJ 历史 K 线 需要自己处理接口和字段 klines.get() 批量历史数据 通常需要自己设计批处理逻辑 klines.batch() 复权 容易在不同数据源间混用 SDK 直接提供adjust DataFrame 可能需要转换 原生to_dataframe=True 多市场 需要额外适配 A 股/港股/美股统一代码体系 策略研发 数据处理工作较多 可以直接进入 Pandas QuantDash 官方目前明确支持 A 股、美股、港股,官网还列出了历史/实时行情、分钟/日/周/月 K、标的池、Python SDK 和 DataFrame 输出等能力。 三、Python 代码实战:把“周末效应”变成一个可测试的因子 这一版我不只计算一个股票,而是把策略抽象成一个函数。 这样以后想研究: 周五买 → 周一卖 周一买 → 周二卖 周四买 → 周五卖 都可以复用。 第一步:安装 QuantDash pip install quantdash 官方 GitHub 当前示例也支持通过环境变量: export QUANTDASH_API_KEY="your_api_key_here" 然后: from quantdash import QuantDash qd = QuantDash() 这样不会把 API Key 直接写进代码。 第二步:定义周五策略 from quantdash import QuantDash import pandas as pd qd = QuantDash() def backtest_friday_strategy( symbol, count=1000, sell_at="close" ): """ 周五收盘买入 下一个交易日卖出 sell_at: close -> 下一交易日收盘卖出 open -> 下一交易日开盘卖出 """ df = qd.klines.get( symbol, period="1d", count=count, adjust="forward", to_dataframe=True ) df["trade_date"] = pd.to_datetime(df["trade_date"]) # 按交易日排序 df = ( df .sort_values("trade_date") .reset_index(drop=True) ) # 周五 df["weekday"] = df["trade_date"].dt.weekday friday_indices = df.index[df["weekday"] == 4] trades = [] for idx in friday_indices: # 最后一根数据没有下一交易日 if idx + 1 >= len(df): continue buy = df.iloc[idx] sell = df.iloc[idx + 1] if sell_at == "open": sell_price = sell["open"] else: sell_price = sell["close"] buy_price = buy["close"] ret = sell_price / buy_price - 1 trades.append({ "symbol": symbol, "buy_date": buy["trade_date"], "sell_date": sell["trade_date"], "buy_price": buy_price, "sell_price": sell_price, "return": ret }) return pd.DataFrame(trades) # 示例 result = backtest_friday_strategy( "600519.SH", count=1000, sell_at="close" ) print(result.tail()) if not result.empty: print("\n===== 回测统计 =====") print( f"交易次数:{len(result)}" ) print( f"胜率:{(result['return'] > 0).mean():.2%}" ) print( f"平均收益:{result['return'].mean():.2%}" ) print( f"累计复合收益:" f"{((1 + result['return']).prod() - 1):.2%}" ) 这里最重要的不是代码有多复杂。 恰恰相反: 真正好的策略代码,应该让策略逻辑一眼就能看懂。 四、从“单票测试”升级成“股票池测试” 真正让我觉得这个策略有研究价值的,不是: 贵州茅台过去有没有赚钱。 而是: 一大批 A 股股票,在相同规则下是不是都有统计优势? QuantDash 支持 A 股 CN_Stock 标的池,也支持批量 K 线。 例如: from quantdash import QuantDash qd = QuantDash() symbols = [ "600519.SH", "000001.SZ", "000858.SZ", "600000.SH" ] dfs = qd.klines.batch( symbols, period="1d", count=1000, adjust="forward", to_dataframe=True, show_progress=True ) all_results = [] for symbol, df in dfs.items(): df["trade_date"] = pd.to_datetime( df["trade_date"] ) df = ( df .sort_values("trade_date") .reset_index(drop=True) ) df["weekday"] = ( df["trade_date"].dt.weekday ) friday_indices = df.index[ df["weekday"] == 4 ] for idx in friday_indices: if idx + 1 >= len(df): continue buy = df.iloc[idx] sell = df.iloc[idx + 1] ret = ( sell["close"] / buy["close"] - 1 ) all_results.append({ "symbol": symbol, "buy_date": buy["trade_date"], "sell_date": sell["trade_date"], "return": ret }) result = pd.DataFrame(all_results) print("\n===== 全部股票汇总 =====") print( f"总交易次数:{len(result)}" ) print( f"胜率:" f"{(result['return'] > 0).mean():.2%}" ) print( f"平均单次收益:" f"{result['return'].mean():.2%}" ) print( f"累计复合收益:" f"{((1 + result['return']).prod() - 1):.2%}" ) 这里就已经从: “我感觉周五买周一卖不错” 进化成: “我用历史样本验证这个规律有没有统计优势。” 这才是量化交易真正有意思的地方。 五、再进一步:不要只看“赚钱没赚钱” 假设最后得到: 胜率:53% 平均收益:0.12% 很多人第一反应: “不错啊,赚钱!” 我反而会继续往下问。 1. 牛市赚钱,熊市还赚钱吗? 可以按照不同年份分别统计。 2. 大盘股有效吗? 可以把股票池进一步分类。 3. 小盘股有效吗? 继续分组测试。 4. 周五涨的时候买,和周五跌的时候买一样吗? 这时候就可以加入: 周五涨跌幅 成交量 MA MACD KDJ BOLL 形成条件策略。 例如: 周五收盘站上 MA20 + 周五上涨 + 成交量放大 → 周一卖出。 这样就从一个简单的“日历效应”,开始向真正的A 股量化选股策略演进。 六、交易员避坑指南:最容易把回测做漂亮的三个方法 避坑 1:不要偷偷使用未来信息 这是第一原则。 例如你要模拟: 周五收盘买入。 那么周五收盘以后产生的数据,就不能参与周五这笔交易的决策。 否则: 先知道答案 ↓ 再回头模拟交易 回测当然会很好看。 但实盘没法复制。 避坑 2:前复权解决的是价格连续性,不等于真实成交 QuantDash 的 forward 是比例前复权,官方文档说明比例复权适合计算收益率。 但真实交易还需要考虑: 手续费 滑点 涨跌停 停牌 成交时间 所以: 数据复权正确 ≠ 回测已经完全真实。 避坑 3:不要只优化一个漂亮指标 最危险的一句话: “我把参数调到胜率 80% 了!” 如果你测试了几十种条件: MA5 MA10 MA20 MA30 MA60 最后挑一个最漂亮的,本质上可能只是过拟合。 我的建议是: 先提出交易逻辑,再验证;不要先看结果,再反推逻辑。 七、如果再结合 AI,会怎么玩? 这里我比较推荐把 AI 放在策略研究辅助层,而不是让 AI 直接替代回测。 比如我们可以把 QuantDash 的历史数据整理成: 股票 日期 周五涨跌幅 周五成交量变化 MA5 MA20 MACD KDJ BOLL 周一收益 然后把这些结构化结果交给 DeepSeek 一类的大模型做: 条件归纳; 异常样本解释; 因子组合建议; 策略逻辑复盘。 但是最终判断还是交给: 历史数据 + 回测结果。 AI 可以帮我找思路,但不能替我证明策略赚钱。 八、常见问题解答(Q&A / FAQ) Q1:周五买入周一卖出应该用收盘价还是开盘价? A:这取决于你定义的策略。 如果研究: 周五收盘买入 → 周一收盘卖出 可以直接使用日 K 的: buy_price = friday["close"] sell_price = monday["close"] 如果研究: 周五收盘买入 → 周一开盘卖出 则应该使用: buy_price = friday["close"] sell_price = monday["open"] 两者属于两个不同策略,不能混在一起比较。 Q2:QuantDash 能不能做 A 股周末效应批量回测? A:可以用 klines.batch() 批量获取多只股票历史 K 线,然后用 Pandas 做统一计算;官方也提供 CN_Stock A 股标的池。 具体 SDK 参数建议直接查QuantDash 官方文档。 Q3:QuantDash 的 Python SDK 适合量化新手吗? A:如果你的主要需求是: Python + A股历史K线 + 前复权 + Pandas + 批量数据 那么它比较适合拿来做策略原型。 官方提供: pip install quantdash 并且 SDK 原生支持 DataFrame。 🔗 相关资源与延伸阅读 🚀 QuantDash 官网:https://quantdash.net/ 📖 官方 Python SDK 文档:https://docs.quantdash.net/ ⭐ GitHub 开源项目:QuantDash GitHub 💡 API Key / 控制台:QuantDash API Key 控制台 QuantDash 官方 GitHub 当前也提供了快速开始示例,包括前复权日 K、A 股全市场行情和 DataFrame 使用方式,适合拿来继续扩展自己的回测框架。
浏览23
评论0
收藏0