You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于MACD与AROON指标的Pandas买入信号生成问题求助

搞定你的交易信号生成问题:从返回False到正确输出Series

首先得说,你现在的代码问题挺明显的——函数一碰到条件就直接return,相当于只检查了第一个日期就结束了,当然只会返回单个True/False,根本生成不了对应每个日期的信号Series。而且移位操作的用法也不对,咱们一步步来解决:

原代码的核心坑点

  • 提前返回:循环里只要满足或不满足条件就立刻return,函数根本没机会遍历所有日期,自然出不来Series
  • 逻辑错位:xMacd.shift(n).macd > 0是个布尔Series,你取[n]只会拿到单个值,这样的循环逻辑完全没法跟踪持续的MACD区间和AROON计数
  • 目标错误:你要的是每个日期的信号标记,不是单个“有没有触发过”的结果

正确的实现思路

咱们要做的是逐日期跟踪状态:

  1. 先判断当前是否处于MACD大于0的区间里
  2. 在这个区间内,统计AROON.up等于100的次数
  3. 当次数凑够2次时,在当天标记买入信号;如果MACD转负,就重置计数器和状态

修正后的可运行代码

import pandas as pd

def generate_buy_signals(xMacd, xAroon):
    # 先把MACD和AROON数据对齐,避免日期错位
    combined_data = pd.concat(
        [xMacd['macd'], xAroon['up']],
        axis=1,
        join='inner'  # 只保留两个数据都有的日期
    )
    
    # 提前生成布尔序列,方便后续判断
    macd_is_positive = combined_data['macd'] > 0
    aroon_up_hit_100 = combined_data['up'] == 100
    
    # 初始化信号序列,默认都是False
    buy_signals = pd.Series(False, index=combined_data.index)
    aroon_counter = 0
    in_positive_macd_period = False
    
    # 逐日期遍历,跟踪状态
    for date, row in combined_data.iterrows():
        if macd_is_positive[date]:
            in_positive_macd_period = True
            if aroon_up_hit_100[date]:
                aroon_counter += 1
                # 当计数到2时,标记当天为买入信号
                if aroon_counter == 2:
                    buy_signals[date] = True
        else:
            # MACD转负,重置所有状态
            in_positive_macd_period = False
            aroon_counter = 0
    
    return buy_signals

# 替换成你的实际数据读取和指标计算代码
# data = read_data()
# xMacd = macd(data, 10, 15, 1)
# xAroon = aroon(data, 12)

# 生成信号
buy_signals = generate_buy_signals(xMacd, xAroon)
print(buy_signals)

关键细节解释

  • 索引对齐:用pd.concat合并两个数据,确保日期完全匹配,避免出现“日期对不上导致的错误计数”
  • 状态变量:in_positive_macd_period跟踪是否在MACD大于0的区间,aroon_counter统计100出现的次数,这俩是实现逻辑的核心
  • 信号序列初始化:先创建一个和日期索引长度一致的布尔Series,逐日期更新,最后返回完整结果,这就解决了你要的Series输出问题

用示例数据验证

你给的示例里MACD都是负数,所以不会触发信号。假设后续有这样的日期数据:

Datemacdup
2018-05-115.2100
2018-05-186.190
2018-05-257.3100

那2018-05-25这一天的信号就会被标记为True,完全符合你要的逻辑:MACD持续大于0期间,AROON.up出现两次100时触发买入。


内容的提问来源于stack exchange,提问作者Clueless

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:44:04