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(
symbol=symbol,
start_date="2025-12-01", # 取半年左右的数据
end_date="2026-07-15",
adjust="forward" # forward 代表前复权
)
if df is empty or len(df) < 60:
continue
# 按照日期升序排序
df = df.sort_values(by="trade_date").reset_index(drop=True)
# 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(index=False))
else:
print("\n😴 今日扫描完成,股票池中暂无符合形态的标的。")
if __name__ == "__main__":
scan_bullish_stocks()
做多市场资产配置的小白最头疼的两点是:
-
标的代码规范不统一:在别的地方,贵州茅台叫 600519.SH,腾讯控股叫 00700,特斯拉叫 TSLA。拼表或者循环时极易错乱。QuantDash 统一了国际通用的 {代码}.{交易所后缀} 标准(如 00700.HK、TSLA.US),一个循环全搞定[3]。
-
前复权必不可少:如果不做复权,分红除权时 K 线会断崖式下跌,均线指标全部失真[3]。在 QuantDash 里,你只需要传一个 adjust="forward",服务端就会自动返回校准好的前复权数据[3]。
有了这个脚本,你可以把全市场的绩优股都丢进 STOCK_POOL,每天收盘后跑一次,省下的人肉看盘时间,可以多看几本经典的量化交易书!
相关链接 :
-
QuantDash 官方:QuantDash
-
Python SDK 快速开始:快速开始 - QuantDash
更多推荐



所有评论(0)