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

JoinQuant 聚宽量化平台:如何编写连续多日站上均线(MA)的判断逻辑?

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

问题描述

连续多日站上MA线应该怎么写?

已知MA5可以这样算,如果连续3日收盘价大于5MA线应该怎么写,求大佬指点,谢谢!

# 提取过去数据
close_data = get_bars(security, count=5, unit='1d', fields=['close'])
# 取得过去五天的平均价格
MA5 = close_data['close'].mean()

解决方案

在 JoinQuant 聚宽平台上,要判断“连续3日收盘价大于5日均线(MA5)”,核心思路是:不能只计算今天的 MA5,而是需要计算出过去3天每天的 MA5,然后将这3天的收盘价与对应的 MA5 分别进行比较。

为了计算过去3天的 MA5,我们需要获取 3 + 5 - 1 = 7 天的历史收盘价数据。我们可以借助强大的 pandas 库中的 rolling 函数来轻松实现。

核心代码实现

以下是具体的代码逻辑:

import pandas as pd

# 1. 获取过去7天的收盘价数据(为了计算最后3天的MA5,需要7天数据)
# 使用 attribute_history 获取数据,返回的是 pandas.DataFrame
close_data = attribute_history(security, 7, '1d', ['close'])

# 2. 使用 pandas 的 rolling 函数计算 MA5
close_data['MA5'] = close_data['close'].rolling(window=5).mean()

# 3. 截取最后3天的数据进行判断
last_3_days = close_data.iloc[-3:]

# 4. 判断是否连续3天的收盘价都大于对应的 MA5
# (last_3_days['close'] > last_3_days['MA5']) 会返回一个包含3个布尔值的 Series
# .all() 表示如果这3个布尔值全为 True,则返回 True
is_above_ma5_3days = (last_3_days['close'] > last_3_days['MA5']).all()

if is_above_ma5_3days:
    log.info(f"{security} 连续3日收盘价站上MA5!")
    # 在这里执行买入逻辑

完整策略示例

为了方便您测试,这里提供一个完整的简单策略框架,您可以直接复制到聚宽的回测环境中运行:

# 导入聚宽函数库
import jqdata
import pandas as pd

# 初始化函数
def initialize(context):
    # 设定要操作的股票:平安银行
    g.security = '000001.XSHE'
    # 设定沪深300作为基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    
    # 每天开盘时运行
    run_daily(market_open, time='09:30')

def market_open(context):
    security = g.security
    
    # 1. 获取过去7天的收盘价数据
    close_data = attribute_history(security, 7, '1d', ['close'])
    
    # 2. 计算 MA5
    close_data['MA5'] = close_data['close'].rolling(window=5).mean()
    
    # 3. 截取最后3天的数据
    last_3_days = close_data.iloc[-3:]
    
    # 4. 判断连续3日收盘价是否大于MA5
    is_above_ma5_3days = (last_3_days['close'] > last_3_days['MA5']).all()
    
    # 取得当前的现金
    cash = context.portfolio.available_cash
    
    # 如果连续3日站上MA5,且有现金,则全仓买入
    if is_above_ma5_3days and cash > 0:
        order_value(security, cash)
        log.info(f"满足条件,买入 {security}")
        
    # 简单的卖出逻辑:如果今天收盘价跌破MA5,则清仓
    elif close_data['close'].iloc[-1] < close_data['MA5'].iloc[-1] and context.portfolio.positions[security].closeable_amount > 0:
        order_target(security, 0)
        log.info(f"跌破MA5,卖出 {security}")

代码原理解析

  1. 为什么取7天数据? 因为第5天的数据才能算出第1个MA5(对应倒数第3天),第6天算出第2个MA5(对应倒数第2天),第7天算出第3个MA5(对应昨天)。
  2. rolling(window=5).mean():这是 Pandas 处理时间序列的利器,它会自动在一个大小为5的滑动窗口上计算平均值。
  3. .all():这是 Pandas Series 的方法,用于判断序列中的所有元素是否都为 True。如果是判断“只要有一天大于”,可以使用 .any()