整数と小数
Pythonには日常的に使う数値の型が2つあります。int は 200 株のような整数、float は価格 184.25 のような小数です。type() で値の型を確認できます。株数・ロット数・日数のような「数えるもの」はint、価格・リターン・比率はfloatです。
shares = 200
price = 184.25
print(type(shares), type(price)) # <class 'int'> <class 'float'>3種類の割り算
+・-・* は期待どおりに動きます。割り算は3種類あります。/ は 10 / 2 でも常にfloat(5.0)を返します。// は切り捨て除算で、割った結果を小さい方へ丸めて整数にします。% は余りを返し、** はべき乗です。
# Division, floor division, remainder and power
print(7 / 2) # 3.5
print(7 // 2) # 3
print(7 % 2) # 1
print(2 ** 10) # 1024// は負の無限大の方向へ丸めるため、-7 // 2 は -3 ではなく -4 です。正の数では小数部の切り捨てに見えますが、負の数では異なります。何株まで買えるか
切り捨て除算は「いくつ入るか」に答えます。現金1,000、価格184.25なら、cash // price が買える整数株数、cash - shares * price が残りの現金です。floatに対する // はfloat(5.0)を返すので、本当の個数が必要なときは int() で包みます。
# Whole shares for a cash budget, and the cash left over
cash, price = 1000, 184.25
shares = int(cash // price)
left = cash - shares * price
print(shares, left) # 5 78.75floatは近似値
floatは数を2進数で保持するため、0.1 のような多くの小数は2進数で正確に表せません。Pythonは最も近い値を保存するので、ごくわずかな誤差が出ます。これはどの言語でも起きることで、Pythonのバグではありません。クオンツの鉄則はfloatを == で比較しないことです。わずかな許容誤差を認める math.isclose を使いましょう。
# Floats are approximate: compare with isclose, not ==
import math
print(0.1 + 0.2) # 0.30000000000000004
print(0.1 + 0.2 == 0.3) # False
print(math.isclose(0.1 + 0.2, 0.3)) # Trueティックに丸める
round(x, n) は小数第 n 位に丸めます。取引所はティック(たとえば0.05刻み)に乗った価格しか受け付けないので、ティックで割り、整数のティック数に丸めてから、元に掛け戻します。なお round はちょうど半分の値を最も近い偶数へ丸めるため、round(2.5) は 2、round(3.5) は 4 になります。
# Snap a price to the nearest 5-cent tick
price, tick = 184.267, 0.05
ticks = round(price / tick)
print(ticks, ticks * tick) # 3685 184.25
print(round(2.5), round(3.5)) # 2 4お金は整数のセントで
floatは近似値なので、正確さが必要なシステムではお金を整数のセントで持ちます。変換は100倍して丸めるだけです。int() は小数部を切り捨てるだけなので、実際には 1998.9999999999998 である 19.99 * 100 は1セント失われてしまいます。
# Dollars to integer cents: round, do not truncate
amount = 19.99
print(amount * 100) # 1998.9999999999998
print(int(amount * 100)) # 1998 (a cent is lost)
print(round(amount * 100)) # 1999- 個数(株数・ロット・日数):
int - 価格・リターン・比率:
float(比較はmath.isclose) - 正確なお金:整数のセント(または
decimalモジュール)
次は文字列とf文字列です。これらの数値を AAPL 184.25 x 184.50 のような読みやすい文字にします。
ラボ:採点される内容
shares_for_cashで予算で買える整数株数を数える25点leftover_cashで残りの現金を求める25点round_to_tickで価格を最も近いティックに合わせる25点centsでドルを正確な整数セントに変換する25点