基于SMA15指标实现股票三类趋势判断的Python代码问题
错误原因
Python 单行条件表达式的语法为结果1 if 条件1 else 其他结果,本身不支持elif关键字,多分支判断需要嵌套if...else实现。
写法1:修正列表推导式
按照嵌套条件表达式的规则调整即可:
df['Trend'] = [ 'up' if (df.loc[ei,'Close'] > df.loc[ei,'SMA15'] and df.loc[ei,'SMA15-5dif'] > 0) else 'down' if (df.loc[ei,'Close'] < df.loc[ei,'SMA15'] and df.loc[ei,'SMA15-5dif'] < 0) else 'no' for ei in df.index ]
写法2:更高效的向量化实现(推荐)
遍历DataFrame索引的性能较差,优先使用numpy.select实现多条件分支,无需循环,处理大数据量时优势明显:
import numpy as np # 定义判断条件 conditions = [ (df['Close'] > df['SMA15']) & (df['SMA15-5dif'] > 0), (df['Close'] < df['SMA15']) & (df['SMA15-5dif'] < 0) ] # 定义条件对应返回值 values = ['up', 'down'] # 不满足所有条件时默认填充'no' df['Trend'] = np.select(conditions, values, default='no')
补充:严格匹配需求的逻辑修正
你当前代码中SMA15-5dif>0只能判断MA15的5日均值较前一日上涨,和需求里「近5日MA15持续上行」的规则不完全匹配,如果要严格实现连续5天MA15每日上涨的判断,可修改为:
# 计算MA15每日差分 df['SMA15_diff'] = df['SMA15'].diff() # 判断近5天MA15是否全部上涨 df['SMA15_up_5d'] = df['SMA15_diff'].rolling(5).apply(lambda x: all(x > 0)).astype(bool) # 判断近5天MA15是否全部下跌 df['SMA15_down_5d'] = df['SMA15_diff'].rolling(5).apply(lambda x: all(x < 0)).astype(bool) # 生成最终趋势字段 conditions = [ (df['Close'] > df['SMA15']) & df['SMA15_up_5d'], (df['Close'] < df['SMA15']) & df['SMA15_down_5d'] ] values = [1, 0] df['Trend_Signal'] = np.select(conditions, values, default=np.nan)
内容的提问来源于stack exchange,提问作者AM EXPO
相关产品推荐
相关产品推荐

