Nombres entiers et décimaux
Python propose deux types de nombres pour le travail courant. Un int est un nombre entier, comme 200 actions. Un float est un nombre décimal, comme 184.25, un prix. type() indique de quel type est une valeur. Les quantités (actions, lots, jours) sont des int ; les prix, rendements et ratios sont des float.
shares = 200
price = 184.25
print(type(shares), type(price)) # <class 'int'> <class 'float'>Trois sortes de division
+, - et * se comportent comme prévu. La division existe en trois variantes. / renvoie toujours un float, même pour 10 / 2 (soit 5.0). // est la division entière : elle divise et arrondit vers le bas à un nombre entier. % donne le reste. ** élève un nombre à une puissance.
# Division, floor division, remainder and power
print(7 / 2) # 3.5
print(7 // 2) # 3
print(7 % 2) # 1
print(2 ** 10) # 1024// arrondit vers moins l'infini, donc -7 // 2 vaut -4 et non -3. Pour les nombres positifs, cela revient à supprimer les décimales ; pas pour les négatifs.Combien d'actions entières pouvez-vous acheter ?
La division entière répond à « combien de fois cela tient-il ? ». Avec 1 000 en liquidités et un prix de 184,25, cash // price donne le nombre d'actions entières, et cash - shares * price ce qu'il reste. Sur des floats, // renvoie un float (5.0) : entourez-le de int() quand il vous faut un vrai compteur.
# 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.75Les floats sont des approximations
Un float stocke un nombre en binaire, et la plupart des décimaux comme 0.1 n'ont pas de forme binaire exacte. Python conserve la plus proche, d'où de minuscules erreurs. Cela arrive dans tous les langages et ce n'est pas un bogue de Python. La règle pour un quant : ne jamais comparer des floats avec ==. Utilisez math.isclose, qui accepte une petite tolérance.
# 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)) # TrueArrondir au tick
round(x, n) arrondit à n décimales. Les places de marché n'acceptent que des prix multiples d'un tick (par exemple 0,05) : divisez par le tick, arrondissez à un nombre entier de ticks, puis multipliez de nouveau. Notez aussi que round envoie une moitié exacte vers le nombre pair le plus proche : round(2.5) vaut 2 et round(3.5) vaut 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 4L'argent en centimes entiers
Comme les floats sont approximatifs, les systèmes qui doivent être exacts conservent l'argent sous forme d'un nombre entier de centimes. Pour convertir, multipliez par 100 et arrondissez. int() ne fait que couper les décimales : 19.99 * 100, qui vaut en réalité 1998.9999999999998, perdrait un centime.
# 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- Quantités (actions, lots, jours) :
int. - Prix, rendements et ratios :
float, comparés avecmath.isclose. - Argent exact : centimes entiers (ou le module
decimal).
À suivre : les chaînes et les f-strings, pour transformer ces nombres en texte lisible comme AAPL 184.25 x 184.50.
Lab : ce qui est noté
- Compter les actions entières qu'un budget permet d'acheter avec
shares_for_cash25 pts - Trouver les liquidités restantes avec
leftover_cash25 pts - Ramener un prix au tick le plus proche avec
round_to_tick25 pts - Convertir des dollars en centimes entiers exacts avec
cents25 pts