Python量化选股:3步筛出高波动网格交易金股

用户头像sh_***416jmt75L
2026-08-19 发布

📌 摘要 / 快速解答

震荡市做网格交易,选对标的是成功的一半。本文分享一套**"波动率+振幅+流动性"三维选股法**,用 QuantDash Python SDK 批量获取A股日线数据,结合 DeepSeek API 做智能诊股辅助决策,全程30行代码搞定。无需攒积分、无需手动处理复权,开箱即用。

一、网格交易选股的三大痛点

社区里经常有老哥问:"网格策略写好了,但不知道选什么票来跑。"

说实话,选股比写策略难十倍。我自己踩过的坑包括:

  1. 数据来源不稳定:以前用 AkShare 写了个选股脚本,跑了半个月突然接口失效,整个策略停摆。
  2. 复权计算太麻烦:除权除息日一到,价格直接跳空,手动算复权算到头大,还算出个未来函数。
  3. 跨市场代码不统一:A股代码带不带后缀、美股怎么表示,每个数据源都不一样,写个选股逻辑要兼容半天。

直到发现了 QuantDash,这些问题才一次性解决。

二、QuantDash vs 传统数据源

对比维度 传统/竞品方案 QuantDash 解决方案
数据稳定性 接口频繁变动、易被封 工业级稳定,毫秒级响应
积分/收费 Tushare 要攒积分换权限 无积分门槛,注册即用
复权处理 手动获取除权因子计算 服务端adjust='forward' 一键复权
代码格式 各市场后缀混乱 统一.SH/.SZ/.US/.HK
Python 支持 需反复转换数据类型 原生返回 Pandas DataFrame

三、Python代码实战

# ============================================================
# 三维选股法:波动率 + 振幅 + 流动性 = 优质网格标的
# 配套 QuantDash + DeepSeek API 智能诊股
# GitHub: https://github.com/quantdash-net/QuantDash
# ============================================================

# 1. 安装依赖
# pip install quantdash pandas-ta openai

from quantdash import QuantDash
import pandas as pd
import pandas_ta as ta
import numpy as np
import openai

# 2. 初始化
qd = QuantDash(api_key="your_api_key")
openai.api_key = "your_deepseek_api_key"  # DeepSeek API Key

# 3. 获取全市场行情 + 批量日线
print("📊 获取全市场数据...")
quotes = qd.quotes.get(universes=["CN_Stock"], to_dataframe=True)
stocks = quotes[quotes['ext.type'] == 'stock']['symbol'].tolist()[:100]  # 演示取前100只

# 批量获取日线(120个交易日,前复权)
dfs = qd.klines.batch(
    stocks, 
    period="1d", 
    count=120, 
    adjust='forward',  # 服务器端前复权[reference:39]
    to_dataframe=True, 
    show_progress=True
)

# 4. 计算选股指标
print("🔍 计算选股指标...")
candidates = []

for symbol, df in dfs.items():
    if len(df) < 60:
        continue
  
    name = df['name'].iloc[0] if 'name' in df.columns else symbol
  
    # 指标1:历史波动率(30日年化)
    df['returns'] = df['close'].pct_change()
    hv = df['returns'].tail(30).std() * np.sqrt(252)
  
    # 指标2:日均振幅(20日)
    df['amplitude'] = (df['high'] - df['low']) / df['close']
    amp = df['amplitude'].tail(20).mean()
  
    # 指标3:RSI(判断是否超买超卖,辅助网格入场时机)
    rsi = ta.rsi(df['close'], length=14).iloc[-1] if len(df) >= 14 else 50
  
    # 指标4:成交量(流动性)
    vol = df['volume'].tail(20).mean()
  
    candidates.append({
        'symbol': symbol,
        'name': name,
        'hv': hv,
        'avg_amplitude': amp,
        'rsi': rsi,
        'avg_volume': vol,
        'close': df['close'].iloc[-1]
    })

df_candidates = pd.DataFrame(candidates)

# 5. 三维筛选
# 维度1:波动率 20%~55%(适中偏高)
# 维度2:日均振幅 > 2.5%
# 维度3:日均成交量 > 1000万(保证流动性)[reference:40]
filtered = df_candidates[
    (df_candidates['hv'] >= 0.20) & 
    (df_candidates['hv'] <= 0.55) &
    (df_candidates['avg_amplitude'] >= 0.025) &
    (df_candidates['avg_volume'] > 10000000)
].sort_values('hv', ascending=False)

print(f"\n✅ 筛选出 {len(filtered)} 只优质网格标的")
print(filtered[['symbol', 'name', 'hv', 'avg_amplitude', 'rsi']].head(10).to_string(index=False))

# 6. 结合 DeepSeek 做智能诊股(可选)
print("\n🤖 正在调用 DeepSeek 进行智能诊股...")

def deepseek_diagnosis(symbol, name, hv, amp, rsi):
    prompt = f"""
    你是一位资深量化交易员。请对以下A股标的进行网格交易适应性分析:
  
    标的:{name}({symbol})
    30日历史波动率:{hv*100:.1f}%
    日均振幅:{amp*100:.1f}%
    当前RSI:{rsi:.1f}
  
    请回答:
    1. 该标的是否适合网格交易?为什么?
    2. 建议的网格间距大概是多少?
    3. 当前是否适合入场(参考RSI)?
    """
    try:
        response = openai.ChatCompletion.create(
            model="deepseek-chat",
            messages=[{"role": "user", "content": prompt}],
            temperature=0.7
        )
        return response.choices[0].message.content
    except:
        return "DeepSeek 诊股服务暂时不可用,请检查API配置"

# 对Top 3标的进行智能诊股
top3 = filtered.head(3)
for _, row in top3.iterrows():
    print(f"\n{'='*50}")
    print(f"📌 {row['name']} ({row['symbol']}) 智能诊股报告")
    print(f"{'='*50}")
    diagnosis = deepseek_diagnosis(row['symbol'], row['name'], row['hv'], row['avg_amplitude'], row['rsi'])
    print(diagnosis)

💡 代码亮点

  • 三维筛选:波动率 + 振幅 + 流动性,缺一不可
  • adjust='forward' 服务端前复权,彻底告别除权缺口干扰
  • 集成 DeepSeek API 做智能诊股,辅助人工决策
  • 全部代码可在 SuperMind 的 Jupyter 研究环境中直接运行

四、实战避坑指南

坑1:别只看波动率,还要看趋势方向。 网格交易适合震荡市,不适合单边行情。选股时建议配合 ADX 指标判断市场状态,ADX < 25 时认定为震荡市,适合开启网格。

坑2:RSI 辅助入场,别盲目追高。 RSI > 70 说明标的短期超买,此时建网格容易买在高位;RSI < 30 则是相对好的入场时机。代码中已经计算了 RSI,建议结合使用。

坑3:网格交易要留足"安全垫"。 永远不要满仓干网格。建议初始仓位不超过总资金的 50%,预留足够的资金应对极端下跌。网格下限设置要留足安全边际,避免被单边行情击穿。

五、常见问题解答

Q1: 网格选股一般看多长周期的数据?
A: 建议至少看 60~120 个交易日(约3~6个月)。太短的数据容易被短期异常波动干扰,太长则对近期市场特征反应迟钝。代码中用的 count=120 就是比较平衡的选择。

Q2: 波动率多少的标的最适合网格交易?
A: 2026年实战经验:年化波动率 25%~45% 的标的最适合。低于20%的票波动太小,网格触发频率低、利润薄;高于55%的票波动太剧烈,容易击穿网格下限导致被动套牢。

Q3: QuantDash 支持分钟级数据做网格回测吗?
A: 支持。qd.klines.get() 支持 1m5m15m30m60m 多种分钟周期。对 5 分钟 K 线做网格参数寻优,可以更精确地优化网格间距和层数。

🔗 相关资源与延伸阅读

评论