σμ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.7·~30分钟入门

while 循环、break 与 continue

路线进度模块 1/11 · 主题 7/33
1.7 while 循环、break 与 continue
—实验得分— / 100总 XP—连续天数—

条件成立时重复执行

while 循环在每一轮之前检查条件,只要条件为 True 就执行代码块。当你事先不知道需要几轮时就用它:把订单不断减半直到足够小、等待价格突破某个水平、让余额增长到目标值。代码块里必须有东西改变条件,否则循环永远不会结束。

# Halve an order until it is small enough to trade at once
quantity, limit = 1000, 100
steps = 0
while quantity > limit:
    quantity = quantity / 2
    steps += 1
print(steps, quantity)  # 4 62.5

用 for 还是 while?

已经有这些元素或知道数量时用 for:它不会无限运行。停止点取决于循环过程中发生的事情时用 while。一个简单的判断:如果你会说“对其中每一个”,就写 for;如果你会说“直到这个条件成立”,就写 while。

确保循环能够结束运行 while 循环之前检查三件事:条件用到了循环会修改的变量;每一轮都会修改;并且修改使条件朝 False 靠近。如果某个循环在这里运行太久,10 秒后会被强制停止。

break:立即退出循环

break 会立即结束循环,并从循环之后的那一行继续。当你已经得到答案(例如第一个突破限价的价格)时,就用它来提前停止。这里的循环用一个由它自己递增的索引来遍历各个位置。

# break leaves the loop at once
prices = [184.25, 184.5, 186.0, 185.0]
limit = 185.5
index = 0
while index < len(prices):
    if prices[index] > limit:
        print("breach at", index)  # breach at 2
        break
    index += 1

continue:跳到下一轮

continue 会跳过本轮剩余的代码,回到条件判断。用它可以忽略无效数据,而不必把真正的处理逻辑嵌套进 if 里。在 while 循环中,要在 continue 之前更新循环变量,否则循环会永远卡在同一个元素上。

# continue skips the rest of the pass; step first, or it never moves on
fills = [100, -5, 250, 0, 75]
total = 0
index = 0
while index < len(fills):
    value = fills[index]
    index += 1
    if value <= 0:
        continue
    total += value
print(total)  # 425

用于搜索或收敛的循环

量化中的许多任务都是“一直做到……”:复利增长到目标、不断改进估计直到不再变化、重试直到请求成功。当退出判断位于处理过程中间时,常见的写法是 while True: 并在中间放一个 break。

# How many years until 10,000 grows to 15,000 at 7% a year?
balance, target, rate = 10_000, 15_000, 0.07
years = 0
while balance < target:
    balance = balance * (1 + rate)
    years += 1
print(years)  # 6

# while True + break: the exit test sits in the middle
attempt = 0
while True:
    attempt += 1
    if attempt * 25 >= 100:
        break
print(attempt)  # 4
  • 条件使用了循环会修改的变量。
  • 每一轮都会修改,即使是在 continue 之前。
  • 一旦得到答案就用 break。

下一节:定义与调用函数,给一段代码起个名字并重复使用。

实验:评分内容

  • 用 halving_steps 统计订单需要减半的次数25 分
  • 用 first_breach 找到第一个超过限价的价格25 分
  • 用 sum_until_zero 累加有效成交直到结束标记25 分
  • 用 years_to_target 把余额复利增长到目标值25 分
资源管理器 · lab-7-1
▾ lab-7-1
…
bash · 浏览器内
learner@quantcraft:~/lab-7-1$
Python 尚未加载PythonLn 1, Col 1Spaces: 4UTF-8

要重置此主题吗?

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

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

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

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

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