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

タプルとアンパック

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

固定された値のまとまり

タプルは、作成後に変更できないリストのようなものです。カンマで作り、たいていかっこで囲みます:("AAPL", 184.25, 184.5)。気配値や約定のように、各部分の意味が決まっている小さなレコードに向いています。リストと同じようにインデックスで読めますが、位置に代入すると TypeError になります。要素が1つのタプルは (5,) のように末尾のカンマが必要で、(5) はただの数値 5 です。

quote = ("AAPL", 184.25, 184.5)

# Reading works like a list
print(quote[0], len(quote))  # AAPL 3

# Changing does not
try:
    quote[1] = 185.0
except TypeError as error:
    print("tuples are fixed:", error)

# One item needs a trailing comma
print(type((5,)), type((5)))  # <class 'tuple'> <class 'int'>

アンパック:各部分に名前を付ける

アンパックは、タプル(や任意のシーケンス)の各部分を一度に複数の名前へ代入します:symbol, bid, ask = quote。名前の数と要素の数が一致しないと ValueError になります。quote[0]、quote[1]、quote[2] と比べて、名前を付ければ各部分の意味が伝わるので、アンパックのほうがたいてい読みやすくなります。一時変数なしで値を入れ替える定番の書き方 a, b = b, a もできます。

# Unpack a quote into named parts
quote = ("AAPL", 184.25, 184.5)
symbol, bid, ask = quote
print(symbol, round(ask - bid, 2))  # AAPL 0.25

# Swap two values without a temporary
bid, ask = ask, bid
print(bid, ask)                     # 184.5 184.25

# The count must match
try:
    symbol, bid = quote
except ValueError as error:
    print("wrong count:", error)

* で残りをまとめて受け取る

名前の前に * を付けると、その名前が残りすべてをリストとして受け取ります:first, *rest = prices や first, *middle, last = prices。* 付きの名前は1つだけ使え、ふつうの名前にはそれぞれ要素が1つ必要です。不要な部分には _ を使えます。例:first, *_, last = prices。

# * collects what is left, as a list
prices = [184.0, 185.0, 183.2, 186.1]

first, *rest = prices
print(first, rest)         # 184.0 [185.0, 183.2, 186.1]

first, *_, last = prices
print(first, last)         # 184.0 186.1

ループ・戻り値・並べ替えでのアンパック

アンパックは名前が代入されるあらゆる場所で使えます。for ループ(for symbol, price in quotes)、内包表記、そして return a, b で複数の値を返す関数の結果です(実際には1つのタプルを返しています)。タプルは要素ごとに、1番目同士、同じなら2番目同士の順で比較されるため、(price, symbol) のタプルのリストを並べ替えると、価格順になり、同じ価格はシンボルで決まります。

# Return several values, unpack them in the caller
def spread_and_mid(bid, ask):
    return ask - bid, (bid + ask) / 2

spread, mid = spread_and_mid(184.25, 184.5)
print(spread, mid)  # 0.25 184.375

# Tuples sort by the first item, then the second
quotes = [("AAPL", 184.5), ("MSFT", 410.2), ("GOOG", 171.0)]
by_price = sorted((price, symbol) for symbol, price in quotes)
print(by_price)     # [(171.0, 'GOOG'), (184.5, 'AAPL'), (410.2, 'MSFT')]

for price, symbol in by_price:
    print(symbol, price)
レコードにはタプル、コレクションにはリスト各部分の位置に意味があり、サイズが固定なら、(symbol, bid, ask) のようにタプルを使います。似た要素が多く、追加や削除があるかもしれないときはリストを使います。タプルは変更できないので、リストが使えない場所、たとえばまもなく学ぶ辞書のキーにも使えます。
  • (a, b, c):固定のまとまり。読めるが変更はできない
  • x, y = pair:名前へアンパック。数は一致させる
  • first, *rest = items:* 付きの名前が残りをリストで受け取る

次は辞書です。位置ではなく名前で値を引く方法を学びます。

ラボ:採点される内容

  • quote_stats で気配値をアンパックする25点
  • first_last で両端の値を取り出す25点
  • ranked で気配値を価格順に並べる25点
  • best_ask で最も安い取引所を見つける25点
エクスプローラー · lab-13-1
▾ lab-13-1
…
bash · ブラウザ内
learner@quantcraft:~/lab-13-1$
Pythonは未読み込みPythonLn 1, Col 1Spaces: 4UTF-8

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

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

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

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

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

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