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

模块与导入

路线进度模块 1/11 · 主题 20/33
1.20 模块与导入
—实验得分— / 100总 XP—连续天数—

用 import 复用代码

模块(module)是一个 Python 文件,其他代码可以使用它里面的名字(函数、常量、类)。import math 会加载标准库中的 math 模块,并以该名字提供给你:之后写 math.sqrt(2)。Python 自带数百个模块,以后安装的东西(如 numpy)也用同样的方式导入。把导入语句放在文件顶部,读者一眼就能看出它依赖什么。

import math
import statistics

# Use a name from a module with module.name
print(math.sqrt(252))                     # 15.874507866387544
print(round(math.sqrt(252), 2))           # 15.87

returns = [0.01, -0.02, 0.015, 0.0]
print(round(statistics.stdev(returns), 4))  # 0.0155

from ... import 与别名

from datetime import date 只引入一个名字,所以可以不带前缀直接写 date(2025, 1, 2)。import numpy as np 给模块起一个更短的别名,这是到处都能见到的惯例。避免使用 from module import *:它会把一堆未知名字倒进你的文件,还可能悄悄覆盖你自己的名字。优先用清晰的名字,在前缀能说明来源时保留前缀。

from datetime import date
from math import sqrt as square_root
import statistics as stats

# Only the names you asked for are imported
start = date(2025, 1, 2)
end = date(2025, 3, 3)
print((end - start).days)                  # 60
print(square_root(16))                     # 4.0
print(stats.mean([1.0, 2.0, 3.0]))         # 2.0

你自己的模块

任何 .py 文件都是模块。如果 fees.py 与 main.py 放在一起并定义了 commission,那么 main.py 可以 import fees 并调用 fees.commission(...)。直接运行一个文件时,Python 会把它的 __name__ 设为 "__main__";被导入时,__name__ 是模块名。因此 if __name__ == "__main__": 这个守卫会让代码只在文件被执行时运行,导入时不运行,使演示和测试不会碍事。

# fees.py
RATE = 0.001

def commission(notional):
    return notional * RATE

if __name__ == "__main__":
    print(commission(10000))   # runs only with: python fees.py

# main.py (next to fees.py)
import fees

print(fees.commission(50000))  # 50.0
print(__name__)                # __main__

Python 在哪里查找,以及一个经典陷阱

执行 import name 时,Python 先在正在运行的脚本所在的文件夹中查找,然后是标准库和已安装的包(这个列表就是 sys.path)。第一个匹配的获胜。所以你自己的文件如果叫 random.py 或 statistics.py,就会遮住真正的模块,import random 会加载你的文件并以令人困惑的方式失败。千万不要用标准库模块的名字给自己的文件命名。还要避免两个模块在顶部互相导入(循环导入);把共用的部分移到第三个模块里。

import sys
import random

# Imported modules are remembered in sys.modules; sys.path is the search list
print("random" in sys.modules)               # True
print(random.__name__)                       # random
print(len(sys.path) > 0)                     # True

# A quick tour of useful standard-library modules
import collections, datetime, itertools, pathlib
print(collections.Counter("AAPL")["A"])      # 2
print(datetime.date(2025, 1, 2).weekday())   # 3  (Thursday; Monday is 0)
先看标准库在自己编写日期运算、统计,或 CSV、JSON 处理之前,先看看有没有标准模块已经做到了(datetime、statistics、csv、json、collections、itertools、pathlib)。经过测试的库代码几乎总比匆忙自制的版本更安全,实验也会把手工拆解日期视为技术错误。
  • import module 然后 module.name;from module import name 引入单个名字;import module as short 起别名。
  • 导入放在顶部;避免 import *。
  • 不要用标准库模块名给文件命名;只应直接运行的代码放在 if __name__ == "__main__": 下。

下一节:包与项目结构,如何把多个模块组织到可以干净导入的文件夹中。

实验:评分内容

  • 用 daily_vol 衡量波动率25 分
  • 用 annualize_vol 把波动率换算为年化25 分
  • 用 days_between 计算两个日期之间的天数25 分
  • 用 is_business_day 区分工作日与周末25 分
资源管理器 · lab-20-1
▾ lab-20-1
…
bash · 浏览器内
learner@quantcraft:~/lab-20-1$
Python 尚未加载PythonLn 1, Col 1Spaces: 4UTF-8

要重置此主题吗?

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

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

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

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

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