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

定义与调用函数

路线进度模块 1/11 · 主题 8/33
1.8 定义与调用函数
—实验得分— / 100总 XP—连续天数—

给一段代码起个名字

函数是一段有名字、可以反复运行的代码。用 def、函数名、括号和冒号定义它一次,下面缩进的代码块就是函数体。return 把一个值交还给调用函数的地方。调用函数就是写出函数名,加上括号和要处理的值。

def gross_value(price, quantity):
    return price * quantity

print(gross_value(184.25, 200))  # 36850.0

形参与实参

def 括号里的名字是形参,是输入的占位符。调用时传入的值是实参,它们按顺序填入形参。顺序调换,结果就会变化;实参个数不对则会报错。每次调用都会得到一份全新的形参。

# Arguments fill the parameters in order
def spread(bid, ask):
    return ask - bid

print(spread(184.25, 184.5))  # 0.25
print(spread(184.5, 184.25))  # -0.25

return 不等于 print

print 是为人把内容显示在屏幕上;return 则把值交给调用它的代码,使其可以继续使用。没有 return 的函数会返回 None,意思是“什么也没有”。负责计算的函数应当返回结果,是否打印由调用方决定。

# A function with no return gives back None
def show(price):
    print("price", price)

result = show(184.25)   # price 184.25
print(result)           # None

相互叠加的小函数

函数可以调用其他函数,因此可以用小而易测试的部件搭出复杂的行为。让每个函数只做一件事,并起一个说明它的名字。紧跟在 def 下面的字符串叫 docstring,用来向下一个读者解释它。要在调用它的那一行运行之前先定义好函数。

# Small functions build bigger ones
def gross_value(price, quantity):
    """Value of a position before costs."""
    return price * quantity


def commission(gross):
    """0.1% of the value, but never less than 1.0."""
    return max(1.0, gross * 0.001)


def net_cost(price, quantity):
    """What the position really costs: value plus commission."""
    gross = gross_value(price, quantity)
    return gross + commission(gross)


print(net_cost(184.25, 200))  # 36886.85

返回多个值

return a, b 会把两个值作为一个元组一并返回:用逗号写成的有序数对(元组很快会有专门的一节)。调用方可以立刻给这两部分命名。用 // 和 % 把 1,000 股的订单拆成 3 份,就会返回每份的大小以及剩余的股数。

# return several values as a tuple
def split_fill(quantity, slices):
    return quantity // slices, quantity % slices

size, leftover = split_fill(1000, 3)
print(size, leftover)  # 333 1
return 会结束函数Python 在执行到第一个 return 时就离开函数,该路径上它之后的代码不会再运行。形参以及你在函数内创建的变量只在调用期间存在,外部代码看不到它们(详见“作用域”一节)。
  • 一个函数只做一件事,名字要说明它返回什么。
  • 计算后 return,打印交给调用方。
  • 加上说明输入与输出的 docstring。

下一节:函数参数与默认值,学习用名称、可选值和任意数量的参数来调用函数。

实验:评分内容

  • 用 gross_value 定义一个计算持仓价值的函数25 分
  • 用 commission 计算带最低收费的佣金25 分
  • 用 net_cost 由两个函数组合出实际成本25 分
  • 用 split_fill 一次返回两个值25 分
资源管理器 · lab-8-1
▾ lab-8-1
…
bash · 浏览器内
learner@quantcraft:~/lab-8-1$
Python 尚未加载PythonLn 1, Col 1Spaces: 4UTF-8

要重置此主题吗?

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

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

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

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

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