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

Python 语法与第一个程序

路线进度模块 1/11 · 主题 1/33
1.1 Python 语法与第一个程序
—实验得分— / 100总 XP—连续天数—

Python 程序如何运行

Python 程序就是由语句组成的文本文件。Python 从上到下逐条执行语句,不需要任何固定模板:main.py 这个文件本身就是程序。点击 Run,或在终端输入 python main.py。

bid = 184.25
ask = 184.50
print(ask - bid)  # 0.25

语句与表达式

表达式会产生一个值,例如 ask - bid 或 2 * 3。语句会执行某个动作,例如 bid = 184.25 或 print(bid)。每条语句独占一行,行尾即语句结束,不需要分号。语句太长时,用括号括起来,在后续几行继续书写。

total_cost = (
    price * quantity
    + commission
    + exchange_fee
)

注释与文档字符串

从 # 到行尾的内容都是注释,Python 会忽略它。注释应该解释代码为什么这样做,而不是重复它在做什么。放在文件或函数开头的三引号字符串是文档字符串(docstring),工具和 help() 会把它显示为正式说明。

# Mid price: the fair value halfway between bid and ask.
mid = (bid + ask) / 2  # average of the two quotes

缩进是语法的一部分

其他语言用花括号的地方,Python 用缩进。以冒号结尾的行会开启一个代码块,代码块就是它下面缩进的那些行。缩进请用四个空格,千万不要混用制表符和空格。顶格书写的代码属于最外层。

def spread(bid, ask):
    # both lines below are the block: indented by four spaces
    width = ask - bid
    return width

print(spread(184.25, 184.50))  # back at the left margin: 0.25
注意多一个或少一个空格会触发 IndentationError,漏写冒号会触发 SyntaxError。Python 会在运行任何代码之前就停止,所以先看错误信息里的行号。请把编辑器设置为按 Tab 键时插入空格。

变量与赋值

名称 = 值 会把一个名称绑定到一个值上。= 表示赋值而不是相等:Python 先计算右侧,再把名称指向结果。名称区分大小写,可以包含字母、数字和下划线,不能以数字开头,也不能是 if、for 这样的关键字。Python 的惯例是 snake_case,例如 last_price。

price = 184.25
quantity = 200
notional = price * quantity
price = 185.00      # rebinds price; notional is unchanged
quantity += 50      # shorthand for quantity = quantity + 50
print(notional)     # 36850.0

算术运算与运算符优先级

  • +、-、* 分别是加、减、乘。
  • / 是真除法,结果总是小数:7 / 2 等于 3.5。
  • // 做除法并向下取整,% 返回余数:7 // 2 等于 3,7 % 2 等于 1。
  • ** 表示乘方:1.05 ** 10 表示 5% 连续复利十次。

Python 遵循数学中的运算顺序:先算 **,再算 * 和 /,最后算 + 和 -。所以 2 + 3 * 4 等于 14,而 (2 + 3) * 4 等于 20。拿不准时就加括号:它没有任何代价,还能让意图一目了然。数字中的下划线(如 10_000)会被忽略,用来提高大数的可读性。

spread = ask - bid                   # 0.25
mid = (bid + ask) / 2                # 184.375
spread_bps = spread / mid * 10_000   # the spread in basis points

用 print 显示结果

print() 会把值以空格分隔输出到终端。引号里的文字是字符串,字符串和数字会在后面的主题中深入讲解。现在,print 就是你观察程序内部的窗口:打印一个值,手工验证,然后继续。

print("bid", bid, "ask", ask)
print("mid", mid)

在实验中,你只需要用本页讲过的内容(赋值、算术运算和括号)写几个小的价格公式。下一节:Python 如何存储数字,以及为什么 0.1 + 0.2 并不精确等于 0.3。

实验:评分内容

  • 用 notional 计算持仓价值25 分
  • 用 midpoint 求中间价25 分
  • 用 spread 计算买卖价差25 分
  • 用 spread_bps 以基点表示价差25 分
资源管理器 · lab-1-1
▾ lab-1-1
…
bash · 浏览器内
learner@quantcraft:~/lab-1-1$
Python 尚未加载PythonLn 1, Col 1Spaces: 4UTF-8

要重置此主题吗?

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

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

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

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

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