Python量化实战:如何用 80 行代码写一个“多头排列+均线金叉”全自动选股器?
炒股或者做量化最痛苦的事情之一莫过于每天收盘后要在交易软件里一张张翻看 K 线图去寻找形态好、有爆发潜力的标的。今天我们用 Python 配合专业的量化接口 QuantDash写一个**“多头排列 均线金叉”**的自动选股脚本。每天收盘后只需一键运行它就会自动扫描我们关心的多市场股票池筛选出均线形态良好的潜力股并生成一个干净的表格。我们要筛选的股票需要同时满足以下两个形态特征均线多头排列MA5 MA10 MA20 MA60。这代表短中长期资金趋势一致向上是最经典的安全持仓形态。MA5/MA10 金叉临界5日均线上穿或贴近10日均线代表短期内有再次放量启动的迹象。我们需要安装 pandas、numpy以及轻量、无限制的多市场行情接口 quantdash-python-sdk[1]。pip install pandas numpy quantdash话不多说直接上可以跑通的完整代码。在运行前请先确保获取了 QuantDash 的 API Key可以去 quantdash.net 免费获取[2]。import pandas as pd import numpy as np from quantdash import QuantDash from tqdm import tqdm # 1. 初始化 QuantDash 客户端 # 自动读取环境变量 QUANTDASH_API_KEY也可以直接传参 qd QuantDash(api_key你的_QUANTDASH_API_KEY) # 2. 定义我们要监控的自选股池支持跨 A股、港股、美股统一命名后缀 STOCK_POOL [ 600519.SH, 002594.SZ, 000858.SZ, 601318.SH, # A股 00700.HK, 03690.HK, 09988.HK, # 港股 AAPL.US, TSLA.US, NVDA.US, MSFT.US # 美股 ] def scan_bullish_stocks(): selected_list [] print(f正在扫描股票池共计 {len(STOCK_POOL)} 只标的...) for symbol in tqdm(STOCK_POOL): try: # 3. 使用 QuantDash 一键获取历史前复权 K 线 (前复权避免除权导致的指标失真) df qd.stock.get_kline( symbolsymbol, start_date2025-12-01, # 取半年左右的数据 end_date2026-07-15, adjustforward # forward 代表前复权 ) if df is empty or len(df) 60: continue # 按照日期升序排序 df df.sort_values(bytrade_date).reset_index(dropTrue) # 4. 计算均线指标 df[MA5] df[close].rolling(5).mean() df[MA10] df[close].rolling(10).mean() df[MA20] df[close].rolling(20).mean() df[MA60] df[close].rolling(60).mean() # 取最新一天的价格与均线值 last_row df.iloc[-1] prev_row df.iloc[-2] # 5. 形态逻辑判断 # 均线多头排列 is_bullish last_row[MA5] last_row[MA10] last_row[MA20] last_row[MA60] # MA5 向上穿过 MA10或者今天 MA5 与 MA10 差值非常贴近 (金叉共振) is_golden_cross (prev_row[MA5] prev_row[MA10]) and (last_row[MA5] last_row[MA10]) near_cross abs(last_row[MA5] - last_row[MA10]) / last_row[close] 0.005 # 差值在0.5%以内 if is_bullish and (is_golden_cross or near_cross): selected_list.append({ 标的代码: symbol, 最新收盘价: round(last_row[close], 2), MA5: round(last_row[MA5], 2), MA10: round(last_row[MA10], 2), 形态备注: MA5/MA10金叉 if is_golden_cross else 均线多头贴合 }) except Exception as e: print(f获取 {symbol} 数据失败: {e}) # 6. 整理输出 if selected_list: result_df pd.DataFrame(selected_list) print(\n 今日扫描完成筛选出符合形态的潜力股如下) print(result_df.to_string(indexFalse)) else: print(\n 今日扫描完成股票池中暂无符合形态的标的。) if __name__ __main__: scan_bullish_stocks()做多市场资产配置的小白最头疼的两点是标的代码规范不统一在别的地方贵州茅台叫 600519.SH腾讯控股叫 00700特斯拉叫 TSLA。拼表或者循环时极易错乱。QuantDash 统一了国际通用的 {代码}.{交易所后缀} 标准如 00700.HK、TSLA.US一个循环全搞定[3]。前复权必不可少如果不做复权分红除权时 K 线会断崖式下跌均线指标全部失真[3]。在 QuantDash 里你只需要传一个 adjustforward服务端就会自动返回校准好的前复权数据[3]。有了这个脚本你可以把全市场的绩优股都丢进 STOCK_POOL每天收盘后跑一次省下的人肉看盘时间可以多看几本经典的量化交易书相关链接 QuantDash 官方QuantDashPython SDK 快速开始快速开始 - QuantDash