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