基于MACD-DEMA的周/月交易信号延迟问题排查求助
基于MACD-DEMA的周/月交易信号延迟问题排查求助
大家好,我现在被一个交易信号触发延迟的问题难住了——试过GPT、找过Python开发者,都没找到问题根源,想请各位帮忙分析分析。
我的需求
- 周度信号:希望在每周周五收盘后立即生成买卖信号,这样我能第一时间跟进操作,不能有延迟
- 月度信号:同样,要在每月最后一个交易日收盘后立刻触发买卖信号,确保信号基于最新的收盘价数据
遇到的问题
目前代码运行后,信号触发总是有延迟,没法在周/月收盘后及时生成,我实在搞不清哪里出了问题。明明逻辑上是想紧跟最新数据的,但实际效果差很多,我怀疑问题出在主逻辑的日期判断部分,但自己查不出来。
主逻辑代码(周/月信号处理)
for stock in t2_list: # Download stock data for both intervals stock_data_weekly = download_weekly_data(stock, start_date, end_date) stock_data_weekly['Open'] = stock_data_weekly['Open'].round(2) stock_data_weekly['Close'] = stock_data_weekly['Close'].round(2) stock_data_weekly['High'] = stock_data_weekly['High'].round(2) stock_data_weekly['Low'] = stock_data_weekly['Low'].round(2) stock_data_monthly = download_monthly_data(stock, start_date, end_date) stock_data_monthly['Open'] = stock_data_monthly['Open'].round(2) stock_data_monthly['Close'] = stock_data_monthly['Close'].round(2) stock_data_monthly['High'] = stock_data_monthly['High'].round(2) stock_data_monthly['Low'] = stock_data_monthly['Low'].round(2) print(stock, len(stock_data_weekly), len(stock_data_monthly)) sleep(2) if len(stock_data_weekly) >= 71: #stock_data_weekly = calculate_macd(stock_data_weekly) stock_data_weekly = calculate_macd_dema(stock_data_weekly) #print(stock_data_weekly.iloc[:, -8:]) stock_data_weekly = check_crossovers(stock_data_weekly) # tradingview_data_weekly = format_tradingview_output(stock_data_weekly) for i, r in stock_data_weekly.iterrows(): sent_date = i + timedelta(days = 6) date_str = sent_date.strftime('%Y-%m-%d') # Adjust format as needed previous_friday = datetime.now() - timedelta(days = dates_diff[datetime.now().weekday()] + 1 ) pre_previous_friday =previous_friday - timedelta(days = 7 ) if r['Crossover'] != 'Neutral' and i>pre_previous_friday and i<previous_friday: #pass print('weekly', date_str, stock, r['Crossover']) webhook_discord(webhook_url_weekly, date_str, r['Crossover'], stock, r['Crosspoint']) sleep(5) if len(stock_data_monthly) >= 71: stock_data_monthly = calculate_macd_dema(stock_data_monthly) stock_data_monthly = check_crossovers(stock_data_monthly) for i , r in stock_data_monthly.iterrows(): stock_month = i.month curr_month = datetime.now().month if curr_month == 1: acc_month = 12 else: acc_month = curr_month-1 sent_date = i + timedelta(days = 33) date_str = sent_date.strftime('%Y-%m') # Adjust format as needed if r['Crossover'] != 'Neutral' and stock_month==acc_month: print('monthly', date_str, stock, r['Crossover']) webhook_discord(webhook_url_monthly, date_str, r['Crossover'], stock, r['Crosspoint']) #pass sleep(5) if __name__ == "__main__": main()
MACD-DEMA计算及交叉判断代码
def calculate_macd_dema(df, short_window=12, long_window=26, signal_window=9): # Calculate Short-term DEMA def ema(series, span): ta_ema = ta.ema(series, span) return ta_ema def dema(series, span): ema1 = ema(series, span) ema2 = ema(ema1, span) return 2 * ema1 - ema2 # Parameters sma = 12 lma = 26 tsp = 9 # Calculate DEMAs df['DEMAfast'] = dema(df['Close'], sma) df['DEMAslow'] = dema(df['Close'], lma) # Calculate MACD Line and Signal Line df['MACD_DEMA'] = df['DEMAfast'] - df['DEMAslow'] #print(df['MACD_DEMA']) df['Signal_Line'] = dema(df['MACD_DEMA'], tsp) df['MACDZeroLag'] = df['MACD_DEMA'] - df['Signal_Line'] return df # Check for MACD and Signal Line crossovers def check_crossovers(df): # crossovers = [] # for i in range(1, len(df)): # if df['MACD_DEMA'].iloc[i] > df['Signal_Line'].iloc[i] and df['MACD_DEMA'].iloc[i - 1] <= df['Signal_Line'].iloc[i - 1]: # crosspoint = df['Close'].iloc[i] # crossovers.append((df.index[i], "Buy", crosspoint)) # elif df['MACD_DEMA'].iloc[i] < df['Signal_Line'].iloc[i] and df['MACD_DEMA'].iloc[i - 1] >= df['Signal_Line'].iloc[i - 1]: # crosspoint = df['Close'].iloc[i] # crossovers.append((df.index[i], "Sell", crosspoint)) # else: # crossovers.append((df.index[i], "Neutral", None)) # None when there's no crosspoint df_macd_dema_1 = df['MACD_DEMA'] df_macd_dema_2 = df['MACD_DEMA'].shift(1) df_signal_1 = df['Signal_Line'] df_signal_2 = df['Signal_Line'].shift(1) df['Crossover'] = np.where((df_macd_dema_1 > df_signal_1) & (df_macd_dema_2 <= df_signal_2), 'Buy', np.where((df_macd_dema_1 < df_signal_1) & (df_macd_dema_2 >= df_signal_2), 'Sell', 'Neutral')) df['Crosspoint'] = np.where( (df['Crossover']=='Buy') | (df['Crossover']=='Sell'), df['Close'], None) return df
我感觉核心问题应该出在主逻辑里的日期判断部分,但反复检查都没发现问题,希望各位能帮我找出信号延迟的原因,谢谢大家!
备注:内容来源于stack exchange,提问作者Muhammed ALTIN
相关产品推荐
相关产品推荐

