条件が成り立つ間、繰り返す
while ループは、1回ごとに条件を確認し、条件が True の間ブロックを実行します。何回必要かが事前にわからない場面で使います。たとえば、注文が十分小さくなるまで半分にする、価格があるラインを超えるまで待つ、残高が目標に届くまで増やす、といった場合です。ブロックの中で条件を変える処理がなければ、ループは永遠に終わりません。
# Halve an order until it is small enough to trade at once
quantity, limit = 1000, 100
steps = 0
while quantity > limit:
quantity = quantity / 2
steps += 1
print(steps, quantity) # 4 62.5forとwhile、どちらを使う?
要素がすでにある、または個数がわかっているなら for を使います。for が無限に回り続けることはありません。止まる位置がループ中の出来事で決まるなら while を使います。判断のコツは、「これらの各々について」と言えるなら for、「これが真になるまで」と言うなら while です。
ループが終われるようにする
while ループを実行する前に3点を確認しましょう。条件がループ内で変わる変数を使っていること、その変更が毎回行われること、そしてその変更が条件を False に近づけることです。ここでループが長く続くと、10秒で止められます。break:今すぐループを抜ける
break はその場でループを終わらせ、直後の行から続けます。最初に上限を超えた価格のように、答えが見つかった時点で止めるための方法です。ここでは、ループ自身が増やすインデックスで位置をたどっています。
# break leaves the loop at once
prices = [184.25, 184.5, 186.0, 185.0]
limit = 185.5
index = 0
while index < len(prices):
if prices[index] > limit:
print("breach at", index) # breach at 2
break
index += 1continue:次の周回へ進む
continue は現在の周回の残りを飛ばして、条件の判定に戻ります。不正なデータを無視するのに便利で、本来の処理を if の中に入れ子にせずに済みます。while ループでは、ループ変数を continue の前に更新しましょう。そうしないと、同じ要素に永遠に戻ってきます。
# continue skips the rest of the pass; step first, or it never moves on
fills = [100, -5, 250, 0, 75]
total = 0
index = 0
while index < len(fills):
value = fills[index]
index += 1
if value <= 0:
continue
total += value
print(total) # 425探索や収束のループ
クオンツの仕事には「〜まで続ける」型のものが多くあります。目標まで複利で増やす、変化しなくなるまで推定値を改良する、成功するまでリクエストを再試行する、などです。終了判定が処理の途中にあるときは、while True: の途中に break を置く形がよく使われます。
# How many years until 10,000 grows to 15,000 at 7% a year?
balance, target, rate = 10_000, 15_000, 0.07
years = 0
while balance < target:
balance = balance * (1 + rate)
years += 1
print(years) # 6
# while True + break: the exit test sits in the middle
attempt = 0
while True:
attempt += 1
if attempt * 25 >= 100:
break
print(attempt) # 4- 条件が、ループ内で変わる変数を使っている
- その変更は毎回行われる(
continueの前でも) - 答えがわかったらすぐに
breakを使う
次は関数の定義と呼び出しです。コードのまとまりに名前を付けて再利用します。
ラボ:採点される内容
halving_stepsで注文を半分にする回数を数える25点first_breachで上限を最初に超える価格を見つける25点sum_until_zeroで終了マーカーまで有効な約定を合計する25点years_to_targetで残高が目標に届くまで複利で増やす25点