You need to enable JavaScript to run this app. 基于SMA15指标实现股票三类趋势判断的Python代码问题
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 03:36:05