σμ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 でコードを再利用する

モジュールは、他のコードがその名前(関数、定数、クラス)を使える 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 は名前を1つだけ取り込むので、接頭辞なしで 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 は自分のファイルを読み込んで分かりにくい形で失敗します。標準ライブラリのモジュールと同じ名前をファイルに付けてはいけません。互いを先頭でインポートし合う2つのモジュール(循環インポート)も避け、共通部分は3つ目のモジュールに移します。

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。1つの名前なら from module import name、別名なら import module as short
  • インポートは先頭に置き、import * は避ける
  • ファイルを標準モジュールと同じ名前にしない。直接実行時だけ動かすコードには if __name__ == "__main__": を使う

次はパッケージとプロジェクト構成です。複数のモジュールを、きれいにインポートできるフォルダーに整理する方法を学びます。

ラボ:採点される内容

  • daily_vol でボラティリティを測る25点
  • annualize_vol でボラティリティを年率に換算する25点
  • days_between で2つの日付の間の日数を数える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で続ける