σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft Academy学习路线
Ctrl K
AO
+1.2k 位学习者
登录加入 ↗
学习路线
AO
+1.2k 位学习者
登录
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Python 学习路线›模块 1 · 面向量化的 Python 基础›主题 1.5·~30分钟入门

条件语句:if、elif、else

路线进度模块 1/11 · 主题 5/33
1.5 条件语句:if、elif、else
—实验得分— / 100总 XP—连续天数—

选择要执行的代码

到目前为止,每一行都会从上到下执行。if 语句只在条件为 True 时才执行一段代码。用 elif(“否则如果”)添加更多条件,用 else 处理其余所有情况。Python 按顺序检查,只执行第一个条件为真的代码块。每个条件行都以冒号结尾。

position, target = 100, 250
if target > position:
    print("buy", target - position)   # buy 150
elif target < position:
    print("sell", position - target)
else:
    print("hold")

缩进就是结构

if 下面缩进的行属于它的代码块;第一行回到左边距的代码就在块外。每一层用四个空格,并始终保持一致。Python 没有花括号:缩进就是结构,所以缩进错了,程序的行为就会改变。

# The indented lines are the block that belongs to the if
price = 184.5
if price > 184:
    print("above 184")           # above 184
    print("still inside the if")
print("always runs")             # back at the left margin

顺序很重要:第一个匹配的分支生效

由于只有第一个为真的分支会执行,elif 阶梯可以使用阈值:每个分支只需说明新增的条件。手续费阶梯就是典型例子。要把最窄、最具体的条件放在前面,否则上面范围更大的条件会把这个情况“吞掉”。

# elif branches are checked top to bottom; the first True wins
monthly_volume = 3_500_000
if monthly_volume < 1_000_000:
    rate = 0.0010
elif monthly_volume < 10_000_000:
    rate = 0.0007
else:
    rate = 0.0004
print(rate)  # 0.0007

提前返回

在函数里,return 会立即结束函数。因此可以为每种情况各写一个 if 加 return,不需要 else,也不需要深层嵌套;最后一行就是默认结果。这样写的代码结构平坦,读起来像一份规则清单。

# Early returns keep a function flat
def side(position, target):
    if target > position:
        return "buy"
    if target < position:
        return "sell"
    return "hold"

print(side(100, 250), side(250, 100), side(100, 100))  # buy sell hold

一行完成选择

当 if 只是在两个值中选一个时,条件表达式更简短:value_if_true if condition else value_if_false。它是表达式,所以可以放在 f-string 或 return 里。简单的选择用它,一旦要做的事情更多就改用普通的 if。

# A one-line choice between two values
cash = 40.0
status = "ok" if cash >= 0 else "overdrawn"
print(status)  # ok
不要把布尔值与 True 比较如果 is_open 本来就是布尔值,就写 if is_open: 和 if not is_open:。if is_open == True: 只是把同样的意思说得更笨拙。对数字和文本使用 if x: 也是一样,它判断的是“非零”和“非空”。
  • 两种结果:if/else,或一行的条件表达式。
  • 多个有序区间:elif 阶梯,最窄的条件放在最前。
  • 特殊情况与无效输入:先提前 return,正常情况放在最后。

下一节:for 循环与 range,为每个元素重复执行一段代码。

实验:评分内容

  • 用 order_side 决定买入、卖出或持有25 分
  • 用 fee_tier 按成交量选择费率25 分
  • 用 clamp 把数值限制在两个界限之间25 分
  • 用 crossover_signal 把两条均线变成信号25 分
资源管理器 · lab-5-1
▾ lab-5-1
…
bash · 浏览器内
learner@quantcraft:~/lab-5-1$
Python 尚未加载PythonLn 1, Col 1Spaces: 4UTF-8

要重置此主题吗?

lab-5-1 中的所有内容将恢复为初始文件,终端也会被清空。你当前的解答将丢失,且无法撤销。

将被重置
  • main.py → 初始代码
  • 终端历史与测试输出
  • 未提交的更改
将被保留
  • 实验最高得分
  • 你的 XP 与连续天数
  • 讲解进度与笔记

登录后即可运行你的代码。

所有讲解均可免费阅读。创建账户或登录后,即可运行代码、运行测试并提交此实验。

  • 浏览器内 IDE 与 bash 终端,无需安装
  • 即时评分、XP 以及你在学习路线中的位置
创建账户登录
或
使用 GitHub 继续