基于MACD与AROON指标的Pandas买入信号生成问题求助
搞定你的交易信号生成问题:从返回False到正确输出Series
首先得说,你现在的代码问题挺明显的——函数一碰到条件就直接return,相当于只检查了第一个日期就结束了,当然只会返回单个True/False,根本生成不了对应每个日期的信号Series。而且移位操作的用法也不对,咱们一步步来解决:
原代码的核心坑点
- 提前返回:循环里只要满足或不满足条件就立刻
return,函数根本没机会遍历所有日期,自然出不来Series - 逻辑错位:
xMacd.shift(n).macd > 0是个布尔Series,你取[n]只会拿到单个值,这样的循环逻辑完全没法跟踪持续的MACD区间和AROON计数 - 目标错误:你要的是每个日期的信号标记,不是单个“有没有触发过”的结果
正确的实现思路
咱们要做的是逐日期跟踪状态:
- 先判断当前是否处于MACD大于0的区间里
- 在这个区间内,统计AROON.up等于100的次数
- 当次数凑够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都是负数,所以不会触发信号。假设后续有这样的日期数据:
| Date | macd | up |
|---|---|---|
| 2018-05-11 | 5.2 | 100 |
| 2018-05-18 | 6.1 | 90 |
| 2018-05-25 | 7.3 | 100 |
那2018-05-25这一天的信号就会被标记为True,完全符合你要的逻辑:MACD持续大于0期间,AROON.up出现两次100时触发买入。
内容的提问来源于stack exchange,提问作者Clueless
相关产品推荐
相关产品推荐

