基础入门
本讲在收益率结果上加入 if 条件判断,筛出上涨交易日并解释日期与收益率为何需要错位对应,帮助读者从“把结果算出来”进一步走向“按规则筛选样本”。
第 5 讲开始把前面算出来的日收益率真正拿来做判断。目标很清楚:学会用 if 条件判断,从一组收益率里筛出上涨交易日。这一步非常实用,因为很多后续任务本质上都是“先算,再筛”。比如只看上涨日、只看回撤日、只看波动过大的日子,底层动作都离不开条件判断。
学完这一讲后,你可以直接完成下面几件事:
第 5 讲的重点不是复杂条件,而是先把最常见的筛选动作写稳。
条件判断本身是通用语法,但如果没有一个具体对象,新手很容易只停留在背 if、elif、else 的写法上。把它放到“上涨交易日”这个场景里,最大的好处是:
所以第 5 讲重点不在于多学一条语法,更在于把“算出结果之后怎么继续挑样本”这件事跑通。
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 讲的收益率函数和本讲的条件判断接起来,让你看到“先计算,再筛选”的完整顺序。
本讲只用一条最简单也最常见的规则:
ret > 0
也就是说,只要当天收益率大于 0,就把这一天视为上涨日。当前先不要引入“涨幅超过 2%”之类更复杂的条件,先把基础动作练稳。
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 天的变化,所以日期要从第二个交易日开始取。
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 列表,后面无论是统计次数还是继续打印明细,都有了明确结果容器。
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%}")
把日期和收益率一起打印出来,有助于你核对筛选逻辑到底对不对,而不是只看到一个孤零零的日期列表。
验证时不要只看打印结果好不好看,而要确认被筛中的日期和你手工判断的涨跌方向是否一致。
assert isinstance(up_days, list)
assert len(up_days) <= len(returns)
assert '2024-01-02' in up_days
因为 12.80 比 12.34 高,所以 2024-01-02 对应的收益率应为正。
assert '2024-01-03' not in up_days
因为 12.65 相比 12.80 是下跌,这一天不应该被归入上涨日。
只要这些检查都成立,就说明你已经能把条件判断稳定地用在价格样本上了。
这一节里最容易出错的不是 if 语法本身,而是日期、收益率和索引位置是否保持一致。
因为收益率从第二天才开始有值。若直接用 dates[i],日期和收益率会整体错一位。
这是为了先把筛选逻辑练清楚。后面如果你想把日期和收益率一起保存,也完全可以扩成字典列表。
可以,但那样你筛出来的只是“今天价格高不高”,而不是“相对昨天是否上涨”。量化里这两个含义不同。
那它不算上涨日。第 5 讲先用严格大于 0 的规则最清楚,后面需要时再扩展成平盘日分类。
elif 和 else,只写一个 if 也足够完成本讲。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))
这样你后面想换一组样本时,只要重新传入日期和收益率即可。
前几讲更多是在搭数据和计算链路,第 5 讲开始进入更接近真实分析的动作。因为真实的量化工作很少停留在“把结果算出来”,通常还会继续问:上涨日有哪些,下跌日有哪些,哪些天值得再看一遍。条件判断的价值,就体现在这里。
所以第 5 讲最重要的收获,不只是会写 if current_return > 0,而是你开始知道:计算只是中间步骤,筛选才是很多分析动作真正的入口。
如果你现在已经能根据收益率筛出上涨交易日,并且清楚日期为什么要和收益率错位一位去对应,那第 5 讲就算完成。
本讲是《Python量化入门短课》的第 5/8 讲,当前主题是《条件判断:筛出上涨交易日》。
上一讲:第 4 讲《函数封装:写一个收益率计算器》。
下一讲:第 6 讲《CSV读写:保存再读回价格表》。
后续安排:第 7 讲《异常处理:避开空值和除零》;第 8 讲《生成一份行情摘要》。
风险揭示与免责声明
本页面内容仅用于量化研究与技术交流,旨在展示研究方法与流程,不构成对任何金融产品、证券或衍生品的要约、招揽、推荐或保证。
本文所涉历史数据、回测结果与示例参数不代表未来表现,也不应作为投资决策依据。
市场存在波动、流动性与执行偏差等不确定性,任何策略均可能出现收益波动或阶段性失效。
读者应结合自身风险承受能力进行独立判断,并在必要时咨询持牌专业机构意见。