🚀 AI 一键生成 joinquant 策略代码
立即体验

joinquant 资金流策略:如何基于主力净额(net_amount_main)构建选股模型?(附 Python 源码)

joinquant | 发布时间: 2026/7/26
以下内容由 EasyQuant 生成。

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: joinquant 资金流策略:基于主力净额(net_amount_main)构建选股模型

Question: 如何在 joinquant 中利用 get_money_flow 提取主力净额并编写选股策略?

解决方案

joinquant 资金流策略:基于主力净额(net_amount_main)构建选股模型

在股票市场中,主力资金(超大单和大单)的动向往往对短期价格走势具有较强的指示作用。通过监控主力净额(net_amount_main,量化投资者可以识别机构资金跟进的标的,从而构建高效的资金流选股策略。

本文将详细介绍如何在 JoinQuant(聚宽)平台上,使用 get_money_flow API 获取资金流数据,并编写一个定期调仓的主力资金动量选股策略。


一、get_money_flow API 详解

聚宽提供了 get_money_flow 函数,用于获取沪深 A 股的每日资金流向数据。

1. 函数语法与常用参数

from jqdata import *

get_money_flow(security_list, start_date=None, end_date=None, fields=None, count=None)
  • security_list: 股票代码或股票代码列表(例如 '000001.XSHE' 或股票池列表)。
  • end_date: 查询截止日期(默认为今天)。
  • count: 取 end_datecount 个交易日的数据。
  • fields: 返回字段列表。核心指标如下:
    • net_amount_main: 主力净额(万元),计算公式为:超大单净额 + 大单净额。
    • net_pct_main: 主力净占比(%),主力净额 / 总成交额。
    • net_amount_xl: 超大单净额(≥50万股或100万元)。
    • net_amount_l: 大单净额(10万-50万股或20万-100万元)。

注意:在回测中,为避免未来函数,通常查询截至 context.previous_date 的历史数据。


二、策略逻辑设计

  1. 股票池筛选:选择沪深 300 成分股(剔除 ST 和停牌股票)。
  2. 因子计算:计算过去 5 个交易日内累积**主力净额(net_amount_main)**最大的前 10 只股票。
  3. 调仓机制:每周第一个交易日开盘(09:30)调仓,全仓等权重持有选出的标的。
  4. 风控与复权:开启动态复权模式(use_real_price),设置真实的滑点与手续费。

三、完整 Python 策略源码

# 导入聚宽数据库
from jqdata import *

def initialize(context):
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    # 设置基准
    set_benchmark('000300.XSHG')
    # 设置手续费:买入佣金万分之三,卖出佣金万分之三加千分之一印花税
    set_order_cost(OrderCost(open_tax=0, close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
    
    # 选股参数设置
    g.stock_num = 10       # 持仓股票数
    g.lookback_days = 5    # 计算资金流的回看天数
    
    # 设置定时运行函数:每周第一个交易日 09:30 执行调仓
    run_weekly(my_trade, weekday=1, time='09:30')

def my_trade(context):
    # 1. 获取股票池(以沪深300成分股为例)
    stocks = get_index_stocks('000300.XSHG', date=context.current_dt)
    
    # 2. 过滤停牌、ST及未上市新股
    current_data = get_current_data()
    stocks = [s for s in stocks if not current_data[s].paused and not current_data[s].is_st]
    
    # 3. 获取资金流数据,提取主力净额
    df_money = get_money_flow(stocks, end_date=context.previous_date, count=g.lookback_days, fields=['sec_code', 'net_amount_main'])
    
    if df_money is None or df_money.empty:
        return
        
    # 4. 按股票汇总过去 N 天的主力净额总和
    main_sum = df_money.groupby('sec_code')['net_amount_main'].sum()
    
    # 5. 排序并按主力净额最大选取前 N 只股票
    target_stocks = main_sum.sort_values(ascending=False).head(g.stock_num).index.tolist()
    
    # 6. 执行卖出:不在目标池中的股票清仓
    for stock in context.portfolio.positions:
        if stock not in target_stocks:
            order_target(stock, 0)
            log.info("卖出非目标股: %s" % stock)
            
    # 7. 执行买入:等权重买入目标股票
    if len(target_stocks) > 0:
        # 获取可用资金并等分
        cash_per_stock = context.portfolio.available_cash / len(target_stocks)
        for stock in target_stocks:
            if stock not in context.portfolio.positions:
                order_value(stock, cash_per_stock)
                log.info("买入股票: %s, 预算资金: %.2f" % (stock, cash_per_stock))

四、总结与优化方向

  1. 主力净占比(net_pct_main)正交化/标准化:直接使用绝对净额可能偏向市值较大的股票,引入 net_pct_main 可以剔除市值影响,更客观反映资金控盘程度。
  2. 结合技术指标:配合 MA5/MA20 均线金叉或突破形态,在主力资金大幅流入且价格处于上升通道时入场,胜率更高。
  3. 止损止盈机制:在 handle_datarun_daily 中加入移动止损,可有效规避主力资金“假拉高真出货”的风险。