深圳融克迪特科技有限公司 Logo,金融科技,量化交易,软件开发

深圳融克迪特科技有限公司

RONG CREDIT TECHNOLOGY CO., LTD.

基础入门

【Python 系列 第5讲】条件判断:筛出上涨交易日

本讲在收益率结果上加入 if 条件判断,筛出上涨交易日并解释日期与收益率为何需要错位对应,帮助读者从“把结果算出来”进一步走向“按规则筛选样本”。

2026-04-26 智铨研究 阅读时长 7 分钟

目录

  1. 本节目标
  2. 为什么先筛“上涨交易日”
  3. 继续沿用价格和收益率样本
  4. 四步筛出上涨交易日
  5. 先明确筛选规则
  6. 循环遍历收益率和对应日期
  7. 用if判断是否上涨
  8. 把上涨日和收益率一起打印出来
  9. 怎样判断筛选结果是对的
  10. 上涨日列表不是随便拼出来的
  11. 上涨日条数不应超过收益率条数
  12. 第一段样本里第 2 天应被筛中
  13. 下跌日不应被错放进上涨列表
  14. 为什么一加条件判断就容易错位
  15. 为什么日期要用dates[i + 1]
  16. 为什么只把日期存进up_days
  17. 能不能直接筛价格,不先算收益率
  18. 如果收益率刚好等于 0 怎么办
  19. 哪些情况仍然算本讲完成
  20. 写一个最小上涨日筛选函数
  21. 第 5 讲建立的是“基于结果继续筛选”的意识
  22. 完成标准
  23. 系列衔接
  24. 风险揭示与免责声明

Python · 入门短课

  1. 第 1 讲【Python 系列 第1讲】Python环境检查:先打印一组收盘价
  2. 第 2 讲【Python 系列 第2讲】列表和字典:装下价格与日期
  3. 第 3 讲【Python 系列 第3讲】for循环:批量计算日收益率
  4. 第 4 讲【Python 系列 第4讲】函数封装:写一个收益率计算器
  5. 第 5 讲【Python 系列 第5讲】条件判断:筛出上涨交易日
  6. 第 6 讲【Python 系列 第6讲】CSV读写:保存再读回价格表
  7. 第 7 讲【Python 系列 第7讲】异常处理:避开空值和除零
  8. 第 8 讲【Python 系列 第8讲】生成一份行情摘要

【Python 系列 第5讲】条件判断:筛出上涨交易日

1. 本节目标

第 5 讲开始把前面算出来的日收益率真正拿来做判断。目标很清楚:学会用 if 条件判断,从一组收益率里筛出上涨交易日。这一步非常实用,因为很多后续任务本质上都是“先算,再筛”。比如只看上涨日、只看回撤日、只看波动过大的日子,底层动作都离不开条件判断。

学完这一讲后,你可以直接完成下面几件事:

  1. 根据收益率是否大于 0 判断当天是否上涨。
  2. 把上涨日对应的日期筛出来。
  3. 把“计算”和“筛选”两个动作分开理解。

第 5 讲的重点不是复杂条件,而是先把最常见的筛选动作写稳。

2. 为什么先筛“上涨交易日”

条件判断本身是通用语法,但如果没有一个具体对象,新手很容易只停留在背 ifelifelse 的写法上。把它放到“上涨交易日”这个场景里,最大的好处是:

  1. 条件足够直观,收益率大于 0 就代表上涨。
  2. 结果容易验证,肉眼就能看出哪些日子应该被筛中。
  3. 和前几讲的价格、收益率练习能自然衔接起来。

所以第 5 讲重点不在于多学一条语法,更在于把“算出结果之后怎么继续挑样本”这件事跑通。

3. 继续沿用价格和收益率样本

dates = ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04']
prices = [12.34, 12.80, 12.65, 13.10]

先用第 4 讲的函数把收益率算出来:

def calc_simple_returns(prices):
    returns = []
    for i in range(1, len(prices)):
        prev_price = prices[i - 1]
        curr_price = prices[i]
        returns.append((curr_price - prev_price) / prev_price)
    return returns

returns = calc_simple_returns(prices)
print(returns)

这里要注意,returns 的长度会比 dates 少 1,所以后面筛选时,日期要从第二天开始对应。

4. 四步筛出上涨交易日

这四步会把第 4 讲的收益率函数和本讲的条件判断接起来,让你看到“先计算,再筛选”的完整顺序。

5. 先明确筛选规则

本讲只用一条最简单也最常见的规则:

ret > 0

也就是说,只要当天收益率大于 0,就把这一天视为上涨日。当前先不要引入“涨幅超过 2%”之类更复杂的条件,先把基础动作练稳。

6. 循环遍历收益率和对应日期

up_days = []

for i in range(len(returns)):
    current_date = dates[i + 1]
    current_return = returns[i]
    print(current_date, current_return)

这里的 i + 1 很关键。因为第一个收益率对应的是第 2 天相对于第 1 天的变化,所以日期要从第二个交易日开始取。

7. 用if判断是否上涨

up_days = []

for i in range(len(returns)):
    current_date = dates[i + 1]
    current_return = returns[i]

    if current_return > 0:
        up_days.append(current_date)

print(up_days)

这一步已经把“算”推进成了“筛”。当条件成立时,把日期放进 up_days 列表,后面无论是统计次数还是继续打印明细,都有了明确结果容器。

8. 把上涨日和收益率一起打印出来

for i in range(len(returns)):
    current_date = dates[i + 1]
    current_return = returns[i]

    if current_return > 0:
        print(f"上涨日: {current_date}, 收益率: {current_return:.2%}")

把日期和收益率一起打印出来,有助于你核对筛选逻辑到底对不对,而不是只看到一个孤零零的日期列表。

9. 怎样判断筛选结果是对的

验证时不要只看打印结果好不好看,而要确认被筛中的日期和你手工判断的涨跌方向是否一致。

10. 上涨日列表不是随便拼出来的

assert isinstance(up_days, list)

11. 上涨日条数不应超过收益率条数

assert len(up_days) <= len(returns)

12. 第一段样本里第 2 天应被筛中

assert '2024-01-02' in up_days

因为 12.8012.34 高,所以 2024-01-02 对应的收益率应为正。

13. 下跌日不应被错放进上涨列表

assert '2024-01-03' not in up_days

因为 12.65 相比 12.80 是下跌,这一天不应该被归入上涨日。

只要这些检查都成立,就说明你已经能把条件判断稳定地用在价格样本上了。

14. 为什么一加条件判断就容易错位

这一节里最容易出错的不是 if 语法本身,而是日期、收益率和索引位置是否保持一致。

15. 为什么日期要用dates[i + 1]

因为收益率从第二天才开始有值。若直接用 dates[i],日期和收益率会整体错一位。

16. 为什么只把日期存进up_days

这是为了先把筛选逻辑练清楚。后面如果你想把日期和收益率一起保存,也完全可以扩成字典列表。

17. 能不能直接筛价格,不先算收益率

可以,但那样你筛出来的只是“今天价格高不高”,而不是“相对昨天是否上涨”。量化里这两个含义不同。

18. 如果收益率刚好等于 0 怎么办

那它不算上涨日。第 5 讲先用严格大于 0 的规则最清楚,后面需要时再扩展成平盘日分类。

19. 哪些情况仍然算本讲完成

  1. 你可以只打印上涨日,不一定马上统计上涨天数。
  2. 当前不要求同时写 elifelse,只写一个 if 也足够完成本讲。
  3. 如果样本里刚好只有一个上涨日,也完全正常。
  4. 当前不要求把结果做成表格,列表形式已经够用。

20. 写一个最小上涨日筛选函数

def get_up_days(dates, returns):
    up_days = []
    for i in range(len(returns)):
        if returns[i] > 0:
            up_days.append(dates[i + 1])
    return up_days

returns = calc_simple_returns(prices)
print(get_up_days(dates, returns))

这样你后面想换一组样本时,只要重新传入日期和收益率即可。

21. 第 5 讲建立的是“基于结果继续筛选”的意识

前几讲更多是在搭数据和计算链路,第 5 讲开始进入更接近真实分析的动作。因为真实的量化工作很少停留在“把结果算出来”,通常还会继续问:上涨日有哪些,下跌日有哪些,哪些天值得再看一遍。条件判断的价值,就体现在这里。

所以第 5 讲最重要的收获,不只是会写 if current_return > 0,而是你开始知道:计算只是中间步骤,筛选才是很多分析动作真正的入口。

22. 完成标准

如果你现在已经能根据收益率筛出上涨交易日,并且清楚日期为什么要和收益率错位一位去对应,那第 5 讲就算完成。

23. 系列衔接

本讲是《Python量化入门短课》的第 5/8 讲,当前主题是《条件判断:筛出上涨交易日》。

上一讲:第 4 讲《函数封装:写一个收益率计算器》。

下一讲:第 6 讲《CSV读写:保存再读回价格表》。

后续安排:第 7 讲《异常处理:避开空值和除零》;第 8 讲《生成一份行情摘要》。

24. 风险揭示与免责声明

风险揭示与免责声明

本页面内容仅用于量化研究与技术交流,旨在展示研究方法与流程,不构成对任何金融产品、证券或衍生品的要约、招揽、推荐或保证。

本文所涉历史数据、回测结果与示例参数不代表未来表现,也不应作为投资决策依据。

市场存在波动、流动性与执行偏差等不确定性,任何策略均可能出现收益波动或阶段性失效。

读者应结合自身风险承受能力进行独立判断,并在必要时咨询持牌专业机构意见。