
選股最怕什么漏掉。5000 多只 A 股你不可能全看一遍。大部分人只盯著自選股或者漲幅榜但真正有意義的異動——比如一只長期縮量橫盤的票突然放量 3 倍、一只連跌 7 天的票尾盤突然拉起來——往往發生在你根本沒關注的票上。解決思路很直接每天收盤后跑一遍全市場掃描把當天有“量價異動”的票自動篩出來。QuantDash的 Universe 接口可以一次拉到全部 A 股的實時行情快照配合 batch 接口拉歷史 K 線5 分鐘內就能掃完 5000 只票。1. 第一步一行代碼拿到全市場行情快照fromquantdashimportQuantDash qdQuantDash()# 全部 A 股當日行情快照all_cnqd.quotes.get(universes[CN_Stock],to_dataframeTrue)print(fA 股標的總數:{len(all_cn)})# 計算漲跌幅all_cn[change_pct](all_cn[last_price]-all_cn[prev_close])/all_cn[prev_close]2. 異動規則一當日放量成交量突增放量是最重要的異動信號之一。一只票如果平時日均成交 5000 萬今天突然做了 2 個億說明有大量資金在交易——無論是買還是賣都值得關注。但“放量”需要和歷史均量對比才有意義。光看當日成交量的絕對值沒用——茅臺日均成交 30 億算縮量一只小盤股做 3 億就算天量。importpandasaspdfromquantdashimportQuantDash qdQuantDash()all_cnqd.quotes.get(universes[CN_Stock],to_dataframeTrue)all_cn[change_pct](all_cn[last_price]-all_cn[prev_close])/all_cn[prev_close]# 過濾掉成交額太小的標的低于 5000 萬流動性不夠activeall_cn[all_cn[amount]5e7].copy()print(f活躍標的:{len(active)}只)# 拉取這些票最近 20 天的 K 線計算歷史均量symbolsactive[symbol].tolist()# batch 自動分塊并發幾百只票幾秒搞定klinesqd.klines.batch(symbols,period1d,count20,adjustforward,to_dataframeTrue,show_progressTrue,)# 計算每只票的 20 日均量avg_volumes{}forsym,kdfinklines.items():ifkdfisnotNoneandlen(kdf)10:avg_volumes[sym]kdf[volume].mean()active[avg_vol_20d]active[symbol].map(avg_volumes)activeactive.dropna(subset[avg_vol_20d])active[vol_ratio]active[volume]/active[avg_vol_20d]# 篩選放量票今日成交量 2.5 倍 20 日均量volume_surgeactive[active[vol_ratio]2.5].sort_values(vol_ratio,ascendingFalse)print(f\n 放量異動量比 2.5x:{len(volume_surge)}只 )print(volume_surge[[symbol,last_price,change_pct,vol_ratio,amount,]].head(20).to_string(indexFalse))量比 2.5 倍以上的票一般不會太多每天幾十只到上百只但里面往往藏著當天市場的“暗線”。3. 異動規則二縮量后突然放量底部放量比單天放量更有價值的是前段時間極度縮量無人關注、籌碼鎖定今天突然放量。這往往是主力試盤或啟動的信號。判斷邏輯之前 14 天成交量低迷今天成交量是前 14 天均量的 2.5 倍以上。# 縮量后突然放量bottom_vol[]forsym,kdfinklines.items():ifkdfisnotNoneandlen(kdf)15:# 前 14 天均量 vs 第 15 天今天成交量past_14_volkdf[volume].iloc[:-1].mean()today_volkdf[volume].iloc[-1]ifpast_14_vol0and(today_vol/past_14_vol)2.5:bottom_vol.append({symbol:sym,today_vol:today_vol,past_avg_vol:past_14_vol,surge_ratio:today_vol/past_14_vol,})bv_dfpd.DataFrame(bottom_vol).sort_values(surge_ratio,ascendingFalse)print(f\n 縮量后突然放量:{len(bv_df)}只 )print(bv_df.head(15).to_string(indexFalse))4. 異動規則三大漲但不是漲停有后續空間漲停的票你大概率買不到掛單排不上。更有實際意義的是那些漲了 5%–9% 但沒漲停的票——如果同時放量了說明有資金在大力買入但還沒封板后續仍有關注空間。# 篩選大漲未漲停且放量的股票active_surgeactive[(active[change_pct]0.05)(active[change_pct]0.095)(active[vol_ratio]2.0)].sort_values(change_pct,ascendingFalse)print(f\n 大漲未漲停且放量:{len(active_surge)}只 )print(active_surge[[symbol,last_price,change_pct,vol_ratio,amount]].head(15).to_string(indexFalse))5. 異動規則四連續下跌后企穩可能的底部信號市場調整時連跌幾天的票一旦出現止跌信號很可能是反彈起點。判斷邏輯過去 5 天中有 4 天以上在下跌今天收陽線且成交量放大高于前 5 天均量。# 找連跌后企穩的票reversal_candidates[]forsym,kdfinklines.items():ifkdfisnotNoneandlen(kdf)6:recent_5kdf.iloc[-6:-1]# 前 5 天todaykdf.iloc[-1]# 今天# 統計前 5 天中有幾天下跌down_dayssum(recent_5[close]recent_5[open])# 今天收陽且放量today_rebound(today[close]today[open])and(today[volume]recent_5[volume].mean())ifdown_days4andtoday_rebound:reversal_candidates.append(sym)print(f\n 連跌后企穩/放量反彈:{len(reversal_candidates)}只 )print(reversal_candidates[:15])6. 異動規則五突破近期新高突破前高是經典的順勢策略邏輯。如果價格創了近 20 日新高同時伴隨成交量放大說明突破是有效的而非假突破。# 突破 20 日新高breakout[]forsym,kdfinklines.items():ifkdfisnotNoneandlen(kdf)20:past_20_highkdf[high].iloc[:-1].max()today_closekdf[close].iloc[-1]today_volkdf[volume].iloc[-1]avg_volkdf[volume].mean()iftoday_closepast_20_highandtoday_volavg_vol*1.5:breakout.append({symbol:sym,close:today_close,past_20_high:past_20_high,vol_ratio:today_vol/avg_vol,})bo_dfpd.DataFrame(breakout).sort_values(vol_ratio,ascendingFalse)print(f\n 突破 20 日新高放量突破:{len(bo_df)}只 )print(bo_df.head(15).to_string(indexFalse))7. 完整掃描腳本整合 5 種異動把上述邏輯整合為一個完整的 Python 腳本每天收盤后直接運行即可importpandasaspdfromquantdashimportQuantDashdefscan_anomalies():qdQuantDash()print(Step 1: 獲取全市場行情快照...)all_cnqd.quotes.get(universes[CN_Stock],to_dataframeTrue)all_cn[change_pct](all_cn[last_price]-all_cn[prev_close])/all_cn[prev_close]# 過濾成交額 5000 萬的活躍標的activeall_cn[all_cn[amount]5e7].copy()symbolsactive[symbol].tolist()print(f活躍標的數量:{len(symbols)})print(Step 2: 批量拉取近 20 日 K 線...)klinesqd.klines.batch(symbols,period1d,count20,adjustforward,to_dataframeTrue,show_progressTrue,)# 計算 20 日均量avg_vols{}forsym,kdfinklines.items():ifkdfisnotNoneandlen(kdf)10:avg_vols[sym]kdf[volume].mean()active[avg_vol_20d]active[symbol].map(avg_vols)activeactive.dropna(subset[avg_vol_20d])active[vol_ratio]active[volume]/active[avg_vol_20d]# 1. 當日放量 2.5 倍surgeactive[active[vol_ratio]2.5]# 2. 大漲5%~9.5%且放量 2.0 倍big_riseactive[(active[change_pct]0.05)(active[change_pct]0.095)(active[vol_ratio]2.0)]# 3. 連跌后企穩 4. 突破 20 日新高reversals,breakouts[],[]forsym,kdfinklines.items():ifkdfisNoneorlen(kdf)20:continuerecent_5kdf.iloc[-6:-1]todaykdf.iloc[-1]# 連跌企穩down_dayssum(recent_5[close]recent_5[open])if(down_days4and(today[close]today[open])and(today[volume]recent_5[volume].mean())):reversals.append(sym)# 突破 20 日新高past_20_highkdf[high].iloc[:-1].max()iftoday[close]past_20_highandtoday[volume]kdf[volume].mean()*1.5:breakouts.append(sym)print(\n*50)print(f【掃描完成】)print(f1. 放量異動2.5x:{len(surge)}只)print(f2. 大漲未漲停5%-9%, 2x量:{len(big_rise)}只)print(f3. 連跌企穩反彈:{len(reversals)}只)print(f4. 突破 20 日新高:{len(breakouts)}只)print(*50)if__name____main__:scan_anomalies()8. 總結每日復盤的核心不是看“誰漲得最好”而是尋找“哪些標的正在發生結構性改變”。通過QuantDash的全市場快照quotes接口 高效的批量 K 線klines.batch能力你可以在幾分鐘內快速完成 A 股 5000 多只股票的量價異動篩選真正做到全市場覆蓋、不漏掉潛在機會。如需進一步了解與接入官網地址https://quantdash.net/技術文檔https://docs.quantdash.net/