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

列表

路线进度模块 1/11 · 主题 12/33
1.12 列表
—实验得分— / 100总 XP—连续天数—

一个有序且可修改的集合

列表(list)把值按顺序放在方括号里:[184.0, 185.5, 183.2]。它可以放任何值,len(prices) 告诉你有多少个。每个元素都有一个位置,叫索引(index),从 0 开始计数。负索引从末尾倒数,所以 -1 是最后一个元素。访问不存在的位置会引发 IndexError。

prices = [184.0, 185.5, 183.2, 186.1]

# Reading by position
print(prices[0])    # 184.0
print(prices[-1])   # 186.1
print(len(prices))  # 4

# A list is changeable: assign to a position
prices[1] = 185.0
print(prices)       # [184.0, 185.0, 183.2, 186.1]

切片:取列表的一部分

prices[start:stop] 返回从 start 到 stop(不含)的新列表。省略一端就一直取到那一端:prices[:3] 是前三个,prices[-3:] 是后三个。切片超出范围不会报错,只会在末尾停下。有一个陷阱:-0 就是 0,所以 prices[-0:] 是整个列表,而不是空列表。

prices = [184.0, 185.0, 183.2, 186.1, 187.4]

# Slices are new lists
print(prices[1:3])   # [185.0, 183.2]
print(prices[:2])    # [184.0, 185.0]
print(prices[-2:])   # [186.1, 187.4]

# Going past the end is fine, but -0 is not "none"
print(prices[3:99])  # [186.1, 187.4]
print(prices[-0:])   # the whole list

添加与删除

append(x) 在末尾添加一个元素,extend(items) 添加多个,insert(i, x) 把元素放到位置 i。pop() 删除并返回最后一个元素(pop(i) 是位置 i 的元素),remove(x) 删除第一个等于 x 的元素。这些方法就地修改列表并返回 None,所以 prices = prices.append(1) 会让 prices 变成 None。用 + 相加则会生成新列表。

# Changing a list in place
fills = [100, 250]
fills.append(75)
fills.extend([40, 60])
print(fills)           # [100, 250, 75, 40, 60]

last = fills.pop()
fills.remove(250)
print(last, fills)     # 60 [100, 75, 40]

# + builds a new list and leaves the old ones alone
both = fills + [10]
print(both, fills)     # [100, 75, 40, 10] [100, 75, 40]

排序

排序有两种方式。prices.sort() 就地重排列表并返回 None;sorted(prices) 不改动原列表,返回一个新的已排序列表,并且可接受任何可迭代对象。两者都支持 reverse=True(从大到小)和 key=...(按其他依据排序,如 key=len)。当其他代码可能还要用原来的顺序时,优先用 sorted。

# sorted() returns a new list, sort() changes the old one
prices = [185.0, 183.2, 187.4, 184.0]

ranked = sorted(prices, reverse=True)
print(ranked)      # [187.4, 185.0, 184.0, 183.2]
print(prices)      # [185.0, 183.2, 187.4, 184.0] (unchanged)

prices.sort()
print(prices)      # [183.2, 184.0, 185.0, 187.4]

两个名字,一个列表

backup = prices 不会复制列表:两个名字指向同一个对象,改动其中一个,另一个也会变。用 prices.copy()、list(prices) 或切片 prices[:] 得到真正的(浅)拷贝。函数同理:对参数调用 .append、.sort 或 .pop 的函数也会改动调用者的列表,而调用者很少预期到这一点。

# A second name is not a copy
prices = [184.0, 185.0]
alias = prices
alias.append(186.0)
print(prices)   # [184.0, 185.0, 186.0]

# A real copy is independent
backup = list(prices)
backup.append(187.0)
print(prices)   # [184.0, 185.0, 186.0]
print(backup)   # [184.0, 185.0, 186.0, 187.0]
返回新列表,别让调用者感到意外接收列表的函数通常应保持原列表不变并返回一个新列表。可以用 sorted(...)、切片和推导式,它们都会生成新列表。实验会检查你收到的列表之后是否保持不变。
  • items[i]、items[-1]:一个元素;items[a:b]:新列表。
  • append、extend、insert、pop、remove 会修改列表,返回值没有用。
  • sorted(items) 生成新的已排序列表;items.sort() 就地重排。

下一节:元组与解包,列表的定长兄弟,以及一种整洁地拆分值的方式。

实验:评分内容

  • 用 top_n 选出最高的价格25 分
  • 用 last_n 取最近的几个值25 分
  • 用 moving_average 计算每个价格窗口的平均值25 分
  • 用 rotate 把值从一端移到另一端25 分
资源管理器 · lab-12-1
▾ lab-12-1
…
bash · 浏览器内
learner@quantcraft:~/lab-12-1$
Python 尚未加载PythonLn 1, Col 1Spaces: 4UTF-8

要重置此主题吗?

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

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

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

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

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