Ganze Zahlen und Dezimalzahlen
Python hat zwei Zahlentypen für den Alltag. Ein int ist eine ganze Zahl wie 200 Aktien. Ein float ist eine Dezimalzahl wie 184.25, ein Preis. type() verrät, welcher Typ vorliegt. Zählwerte (Aktien, Lots, Tage) sind ints; Preise, Renditen und Verhältnisse sind floats.
shares = 200
price = 184.25
print(type(shares), type(price)) # <class 'int'> <class 'float'>Drei Arten der Division
+, - und * verhalten sich wie erwartet. Die Division gibt es in drei Varianten. / liefert immer einen float, auch bei 10 / 2 (also 5.0). // ist die ganzzahlige Division: Sie teilt und rundet nach unten auf eine ganze Zahl. % liefert den Rest. ** potenziert eine Zahl.
# Division, floor division, remainder and power
print(7 / 2) # 3.5
print(7 // 2) # 3
print(7 % 2) # 1
print(2 ** 10) # 1024// rundet Richtung minus unendlich, daher ist -7 // 2 gleich -4, nicht -3. Bei positiven Zahlen sieht das nach Abschneiden der Nachkommastellen aus, bei negativen nicht.Wie viele ganze Aktien können Sie kaufen?
Die ganzzahlige Division beantwortet „wie oft passt das hinein?“. Bei 1.000 Bargeld und einem Preis von 184,25 ist cash // price die Zahl ganzer Aktien und cash - shares * price der Rest. Bei floats liefert // einen float (5.0); umhüllen Sie ihn mit int(), wenn Sie eine echte Anzahl brauchen.
# 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.75Floats sind Näherungen
Ein float speichert eine Zahl binär, und die meisten Dezimalzahlen wie 0.1 haben keine exakte Binärdarstellung. Python speichert die nächstgelegene, daher entstehen winzige Fehler. Das passiert in jeder Sprache und ist kein Python-Fehler. Die Regel für Quants: Floats nie mit == vergleichen. Verwenden Sie math.isclose, das eine kleine Toleranz erlaubt.
# 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)) # TrueAuf den Tick runden
round(x, n) rundet auf n Nachkommastellen. Börsen akzeptieren nur Preise auf einem Tick (zum Beispiel alle 0,05): Teilen Sie durch den Tick, runden Sie auf eine ganze Zahl von Ticks und multiplizieren Sie zurück. Beachten Sie außerdem: round rundet eine exakte Hälfte zur nächsten geraden Zahl, also ist round(2.5) gleich 2 und round(3.5) gleich 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 4Geld in ganzen Cent
Weil floats nur Näherungen sind, speichern Systeme, die exakt sein müssen, Geld als ganzzahlige Cent-Beträge. Zum Umrechnen multiplizieren Sie mit 100 und runden. int() schneidet nur die Nachkommastellen ab, sodass 19.99 * 100, in Wahrheit 1998.9999999999998, einen Cent verlieren würde.
# 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- Zählwerte (Aktien, Lots, Tage):
int. - Preise, Renditen und Verhältnisse:
float, verglichen mitmath.isclose. - Exaktes Geld: ganze Cent (oder das Modul
decimal).
Als Nächstes: Strings und f-Strings, mit denen Sie diese Zahlen in lesbaren Text wie AAPL 184.25 x 184.50 verwandeln.
Lab: Was bewertet wird
- Mit
shares_for_cashdie ganzen Aktien zählen, die ein Budget kauft25 Pkt. - Mit
leftover_cashdas übrige Bargeld finden25 Pkt. - Mit
round_to_tickeinen Preis auf den nächsten Tick runden25 Pkt. - Mit
centsDollar in exakte ganze Cent umrechnen25 Pkt.