首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >基于 Python + QuantDash 搭建跨市场多因子选股系统:从因子计算到动态组合构建

基于 Python + QuantDash 搭建跨市场多因子选股系统:从因子计算到动态组合构建

原创
作者头像
用户9138916
修改2026-07-13 20:23:52
修改2026-07-13 20:23:52
280
举报

在量化交易的研究中,单只标的的双均线交叉或突破策略往往容错率较低,容易受到单一市场波动的干扰。相比之下,**多因子选股系统(Multi-Factor Stock Selection System)**通过在由多只股票组成的选股池中,利用多个维度(如动量、波动率、估值等因子)对标的进行打分并动态构建投资组合,能有效降低非系统性风险,是量化机构的主流玩法。

本文将展示如何使用 Python,结合多市场统一金融 API QuantDash,从零搭建一个跨 A股与港股科技板块的轻量级多因子打分选股系统。


一、 系统设计架构

整个选股系统的执行流程分为三个标准步骤:

  1. 数据拉取(Data Fetching):通过 quantdash-python-sdk 并发拉取指定自选股池在过去一段时间内的日K线前复权数据。
  2. 特征与因子计算(Factor Computing)
    • 动量因子(Momentum Factor):过去20个交易日的累计收益率,用于捕捉强势上涨趋势。
    • 低波动因子(Volatility Factor):过去20个交易日日收益率的标准差(取负值,代表波动率越低得分越高,符合低波动溢价理论)。
  3. 打分与组合构建(Scoring & Portfolio Build):对两类因子进行截面标准化(Z-Score),等权相加得到综合得分,并筛选得分最高的前 N 只标的。

二、 实战代码实现

在运行以下代码前,请确保已安装必要的依赖库:

代码语言:bash
复制
pip install pandas numpy quantdash

接下来是完整的 Python 选股策略脚本:

代码语言:python
复制
import os
import numpy as np
import pandas as pd
from quantdash import QuantDash

# 1. 客户端初始化与选股池定义
# 混合选股池:包含 A股头部白马 与 港股互联网巨头
TICKER_POOL = [
    "600519.SH", "601318.SH", "600900.SH", "000333.SZ",  # A股
    "00700.HK", "03690.HK", "09988.HK", "01810.HK"       # 港股
]

api_key = os.getenv("QUANTDASH_API_KEY", "YOUR_API_KEY")
qd = QuantDash(api_key=api_key)

# 2. 批量拉取前复权历史日线数据
def fetch_pool_data(tickers, start_date):
    pool_data = {}
    for symbol in tickers:
        try:
            print(f"正在拉取标的数据: {symbol}")
            # 获取前复权历史K线,确保因子计算不因除权除息产生杂音
            df = qd.stock.get_kline(symbol=symbol, start_date=start_date, adjust="forward")
            if not df.empty:
                df['date'] = pd.to_datetime(df['date'])
                df.set_index('date', inplace=True)
                # 只保留收盘价进行特征计算
                pool_data[symbol] = df['close']
        except Exception as e:
            print(f"标的 {symbol} 数据获取失败: {e}")
    return pd.DataFrame(pool_data)

# 3. 计算多因子特征
def calculate_factors(price_df):
    factors_df = pd.DataFrame(index=price_df.columns)
    
    # 计算日收益率
    returns_df = price_df.pct_change()
    
    # 因子 1: 20日动量因子 (20-day cumulative return)
    # 计算公式:(今日收盘价 - 20天前收盘价) / 20天前收盘价
    factors_df['momentum_20'] = (price_df.iloc[-1] - price_df.iloc[-20]) / price_df.iloc[-20]
    
    # 因子 2: 20日低波动因子 (20-day Volatility)
    # 计算20日收益率的标准差,并取负值(波动越小,因子值越大)
    factors_df['low_vol_20'] = -returns_df.tail(20).std()
    
    return factors_df

# 4. 截面打分与排序构建组合
def generate_portfolio(factors_df, top_n=3):
    # 对因子进行 Z-Score 标准化,使其在同一维度下可比
    z_scores = factors_df.apply(lambda x: (x - x.mean()) / x.std() if x.std() != 0 else x)
    
    # 等权综合得分
    z_scores['composite_score'] = z_scores['momentum_20'] * 0.5 + z_scores['low_vol_20'] * 0.5
    
    # 按综合得分从高到低排序,筛选 Top N
    portfolio = z_scores.sort_values(by='composite_score', ascending=False)
    
    return portfolio

# --- 主程序运行 ---
if __name__ == "__main__":
    # 拉取最近 60 个交易日的数据,以确保有足够的历史长度计算20日因子
    start_date = "2026-03-01" 
    
    print("--- 步骤1:正在从 QuantDash 获取多市场历史行情数据 ---")
    raw_prices = fetch_pool_data(TICKER_POOL, start_date)
    
    # 剔除存在缺失值的数据行(保持截面对齐)
    clean_prices = raw_prices.dropna()
    print(f"\n有效交易日天数: {len(clean_prices)}")
    
    print("\n--- 步骤2:计算多因子特征指标 ---")
    factors = calculate_factors(clean_prices)
    print(factors)
    
    print("\n--- 步骤3:截面标准化并生成打分推荐组合 ---")
    result_portfolio = generate_portfolio(factors, top_n=3)
    print(result_portfolio[['momentum_20', 'low_vol_20', 'composite_score']])
    
    print("\n[推荐买入组合]:")
    for i, symbol in enumerate(result_portfolio.head(3).index):
        print(f"Top {i+1}: {symbol} (综合得分: {result_portfolio.loc[symbol, 'composite_score']:.4f})")

三、 核心工程痛点解析:为何跨市场数据对齐如此重要?

在传统的量化特征工程中,多因子选股最害怕遇到以下“数据陷阱”:

  1. 停牌与非交易日错位:A股和港股的法定节假日并不完全一致(例如复活节港股休市但A股开市)。如果使用普通的非结构化爬虫数据,需要手动去对齐两边的交易日历。
  2. 数据尺度不一致:QuantDash 的 Python SDK 在服务端将不同交易所的字段、类型进行了高度标准化归一,无需在本地编写大量的兼容逻辑,直接通过 Pandas 的 dropna() 或 fillna() 即可快速实现截面对齐。

四、 后续拓展建议

基于上述打分系统,你可以进一步将其接入自动化交易网关,或者利用 Streamlit 等前端框架将每日的 result_portfolio 做成交互式的多因子选股看板。通过 QuantDash 高效、干净的数据获取能力,你可以省去繁琐的数据运维开销,把更多时间投入到新因子(如量价背离因子、筹码集中度因子)的开发中。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、 系统设计架构
  • 二、 实战代码实现
  • 三、 核心工程痛点解析:为何跨市场数据对齐如此重要?
  • 四、 后续拓展建议
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档