σμ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.15·~30 分初級

集合

ロードマップ上の位置モジュール 1/11 · トピック 15/33
1.15 集合
—ラボスコア— / 100合計XP—連続日数—

重複のないコレクション

集合(set)は同じ値を最大1つしか持たず、位置もありません:{"AAPL", "MSFT", "GOOG"}。すでにある値を追加しても何も変わりません。set(items) は任意のイテラブルを集合にし、重複を取り除く最も手軽な方法で、len は異なる値の数を数えます。集合に順序はないのでインデックスは使えず、表示したときの順序に頼ってもいけません。空の集合は set() で、{} は空の辞書です。

symbols = ["AAPL", "MSFT", "AAPL", "GOOG", "MSFT"]

# set() removes repeats
unique = set(symbols)
print(len(symbols), len(unique))      # 5 3

# Adding something already there changes nothing
unique.add("AAPL")
unique.add("TSLA")
print(len(unique))                    # 4

# {} is a dict; an empty set is set()
print(type({}), type(set()))          # <class 'dict'> <class 'set'>

高速な所属判定

x in some_set は、値が何百万あってもほぼ瞬時に答えます。集合は全体を走査せず、ハッシュで値を見つけるからです。リストで同じ判定をすると要素を1つずつ調べるため、リストが大きいほど遅くなります。同じコレクションに何度も in で問い合わせる場合(たとえば受信した注文ごとに禁止シンボルのリストと照合するなど)は、そのコレクションを一度だけ集合に変換しましょう。集合の要素は辞書のキーと同様にハッシュ可能でなければなりません。

# Membership: a set is the fast structure for "is it in there?"
banned = {"GME", "AMC", "BBBY"}
orders = ["AAPL", "GME", "MSFT", "AMC"]

allowed = [symbol for symbol in orders if symbol not in banned]
print(allowed)                       # ['AAPL', 'MSFT']

# Sets only keep hashable values
try:
    {["AAPL"]}
except TypeError as error:
    print("not hashable:", error)

集合演算

集合は数学と同じように組み合わせられます。a | b は和集合(どちらかにある)、a & b は積集合(両方にある)、a - b は差集合(a にあって b にない)、a ^ b は対称差(どちらか一方だけにある)です。それぞれ a.union(b) のようなメソッドもあり、こちらは任意のイテラブルを受け取れます。どれも新しい集合を返し、a と b は変わりません。2つのシンボル群や2つの保有リストを比べるのにまさに適しています。

# Comparing yesterday's and today's universe
yesterday = {"AAPL", "MSFT", "GOOG", "IBM"}
today = {"AAPL", "MSFT", "TSLA"}

print(sorted(yesterday | today))   # ['AAPL', 'GOOG', 'IBM', 'MSFT', 'TSLA']
print(sorted(yesterday & today))   # ['AAPL', 'MSFT']
print(sorted(today - yesterday))   # ['TSLA']   (new listings)
print(sorted(yesterday - today))   # ['GOOG', 'IBM']   (dropped)
print(sorted(yesterday ^ today))   # ['GOOG', 'IBM', 'TSLA']

集合の変更と順序の保持

add(x) は値を1つ、update(items) は複数を挿入し、discard(x) は値があれば(黙って)取り除き、remove(x) も取り除きますが、なければ KeyError になります。集合は順序を忘れるので、順序が大事ならリストが必要です。sorted(some_set) は並べ替えたリストを返し、最初に出てきた順序を保ったまま重複を除くには、値をたどりながら既出のもの(seen)を集合に覚えておきます。集合なので、この確認は高速です。

# Remove repeats and keep the first-seen order
symbols = ["MSFT", "AAPL", "MSFT", "GOOG", "AAPL"]
seen = set()
ordered = []
for symbol in symbols:
    if symbol not in seen:
        seen.add(symbol)
        ordered.append(symbol)
print(ordered)             # ['MSFT', 'AAPL', 'GOOG']

# discard is quiet, remove is strict
seen.discard("TSLA")
try:
    seen.remove("TSLA")
except KeyError:
    print("TSLA was not in the set")
集合に順序はない:表示や比較の前に並べ替える等しい2つの集合が異なる順序で表示されることがあるので、その順序には決して頼らないでください。集合演算の結果を返す、または表示するときは sorted(...) で包んで、安定したリストにしましょう。ラボが並べ替えたリストを求めるのは、まさにこのためです。
  • set(items):各値を1つだけ残す。len(set(items)) は異なる値の数
  • x in s は高速。a | b、a & b、a - b、a ^ b は新しい集合を作る
  • 集合に順序はない。リストが必要なときは sorted(s) を使う

次はテキストファイルの読み書きです。プログラムが実行をまたいでデータを保持できるようになります。

ラボ:採点される内容

  • distinct_count で異なるシンボルの数を数える25点
  • new_listings で新しく現れたシンボルを見つける25点
  • common_symbols で2つのポートフォリオの共通部分を求める25点
  • dedupe_keep_order で順序を保ったまま重複を除く25点
エクスプローラー · lab-15-1
▾ lab-15-1
…
bash · ブラウザ内
learner@quantcraft:~/lab-15-1$
Pythonは未読み込みPythonLn 1, Col 1Spaces: 4UTF-8

このトピックをリセットしますか?

lab-15-1 の内容はすべてスターターファイルに戻り、ターミナルも消去されます。現在の解答は失われ、元に戻せません。

リセットされるもの
  • main.py → スターターコード
  • ターミナル履歴とテスト出力
  • 未提出の変更
保持されるもの
  • ラボの最高スコア
  • XPと連続日数
  • 講義の進捗とメモ

コードを実行するにはログインしてください。

レクチャーはすべて無料で読めます。コードの実行、テスト、ラボの提出にはアカウントの作成かログインが必要です。

  • ブラウザ内IDEとbashターミナル。インストール不要
  • 即時採点、XP、ロードマップでの現在地
アカウントを作成ログイン
または
GitHubで続ける