Números enteros y decimales
Python tiene dos tipos de número para el trabajo diario. Un int es un número entero, como 200 acciones. Un float es un número decimal, como 184.25, un precio. type() te dice de cuál se trata. Los recuentos (acciones, lotes, días) son int; los precios, rendimientos y ratios son float.
shares = 200
price = 184.25
print(type(shares), type(price)) # <class 'int'> <class 'float'>Tres tipos de división
+, - y * se comportan como esperas. La división tiene tres variantes. / siempre devuelve un float, incluso con 10 / 2 (es decir, 5.0). // es la división entera: divide y redondea hacia abajo a un número entero. % da el resto. ** eleva un número a una potencia.
# Division, floor division, remainder and power
print(7 / 2) # 3.5
print(7 // 2) # 3
print(7 % 2) # 1
print(2 ** 10) # 1024// redondea hacia menos infinito, así que -7 // 2 es -4, no -3. Con números positivos parece quitar los decimales; con negativos no.¿Cuántas acciones enteras puedes comprar?
La división entera responde a «¿cuántas veces cabe esto?». Con 1.000 en efectivo y un precio de 184,25, cash // price es el número de acciones enteras y cash - shares * price lo que sobra. Con floats, // devuelve un float (5.0), así que envuélvelo en int() cuando necesites un recuento real.
# 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.75Los floats son aproximaciones
Un float guarda un número en binario, y la mayoría de los decimales como 0.1 no tienen forma binaria exacta. Python guarda el más cercano, y por eso aparecen errores diminutos. Pasa en todos los lenguajes y no es un fallo de Python. La regla para un quant: nunca compares floats con ==. Usa math.isclose, que admite una pequeña tolerancia.
# 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)) # TrueRedondear al tick
round(x, n) redondea a n decimales. Los mercados solo aceptan precios en múltiplos de un tick (por ejemplo, 0,05): divide entre el tick, redondea a un número entero de ticks y vuelve a multiplicar. Ten en cuenta también que round lleva una mitad exacta al par más cercano: round(2.5) es 2 y round(3.5) es 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 4El dinero en centavos enteros
Como los floats son aproximados, los sistemas que deben ser exactos guardan el dinero como un número entero de centavos. Para convertir, multiplica por 100 y redondea. int() solo corta los decimales, así que 19.99 * 100, que en realidad es 1998.9999999999998, perdería un centavo.
# 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- Recuentos (acciones, lotes, días):
int. - Precios, rendimientos y ratios:
float, comparados conmath.isclose. - Dinero exacto: centavos enteros (o el módulo
decimal).
A continuación: cadenas y f-strings, donde convertirás estos números en texto legible como AAPL 184.25 x 184.50.
Lab: qué se califica
- Contar las acciones enteras que compra un presupuesto con
shares_for_cash25 pts - Hallar el efectivo restante con
leftover_cash25 pts - Ajustar un precio al tick más cercano con
round_to_tick25 pts - Convertir dólares a centavos enteros exactos con
cents25 pts