Código de Python - Stock Monitor

Filtrado por el tag: scrip js
<<>>
Imágen de perfil
Val: 712
Bronce
Ha aumentado 1 puesto en Python (en relación al último mes)
Gráfica de Python

Stock Monitorgráfica de visualizaciones


Python

Actualizado el 7 de Abril del 2025 por Antonio (77 códigos) (Publicado el 22 de Octubre del 2023)
2.591 visualizaciones desde el 22 de Octubre del 2023
El siguiente script muestra en tiempo real las cotizaciones en bolsa, de acciones e índices bursátiles.
El programa utiliza un bucle en el que va realizando sucesivas peticiones de datos, usando 'yfinance'. Entre una petición y la siguiente, media un tiempo en segundos que viene determinado por la opción '-delay/--time_delay', teniendo un valor por defecto de 5 segundos y no pudiendo ser inferior a 0.5
Para detener la obtención de datos, pulsar la barra espaciadora. Al hacerlo, el programa mostrará el texto 'wait until application ends..' ya que tendrá que esperar el tiempo que quede restante del especificado por '-delay/--time_delay'. Finalizando definitivamente, transcurrido dicho tiempo restante.

ARGUMENTOS:
'-tick/--ticker' : Ticker o símbolo del valor cuya cotización se quiere obtener.
'-delay/--time_delay': Periodicidad, en segundos, entre una petición de datos y la siguiente.
'-clr/--color': Mostrar precio de cierre en color, en función de su fluctuación respecto del valor anterior.
'-uind/--use_index': Incluir esta opción para obtener cotizaciones de índices bursátiles (ej: ^IXIC, ^DJI..)

La petición de valores se interrumpe pulsando la barra espaciadora.
PARA CUALQUIER DUDA U OBSERVACIÓN, UTILICEN LA SECCIÓN DE COMENTARIOS.

sm1
sm2
sm3

Requerimientos

Librerias: yfinance, argparse, colorama, pynput, time

1.0

Actualizado el 27 de Octubre del 2023 (Publicado el 22 de Octubre del 2023)gráfica de visualizaciones de la versión: 1.0
476 visualizaciones desde el 22 de Octubre del 2023

1.1

Actualizado el 7 de Abril del 2025 (Publicado el 31 de Octubre del 2023)gráfica de visualizaciones de la versión: 1.1
2.116 visualizaciones desde el 31 de Octubre del 2023
estrellaestrellaestrellaestrellaestrella
estrellaestrellaestrellaestrella
estrellaestrellaestrella
estrellaestrella
estrella

Visualización de la diferencia y porcentaje respecto a la sesión anterior.
sm4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import argparse
import yfinance as yf
from pynput import keyboard
from colorama import init, Fore, Back, Style
import time
import warnings
 
warnings.filterwarnings("ignore")
 
init()
stop = False
 
def on_press(key):
    global stop
    if key == keyboard.Key.space:
        stop = True
        print('Wait until application ends...')
        return False
 
def quoter(args):
    listener = keyboard.Listener(on_press=on_press)
    listener.start()
    prev_value = None  # Ahora es float o None
    downloaded = False
 
    ticker_symbol = f"^{args.ticker}" if args.use_index else args.ticker
 
    try:
        print(Fore.BLACK + Back.WHITE + f"\nREAL TIME {ticker_symbol} QUOTATION -[PRESS SPACE BAR TO EXIT]" + Fore.RESET + Back.RESET)
 
        try:
            prev_day = yf.download(ticker_symbol, period="5d", interval="1d")
 
 
            # Convertimos todos los valores en float
            last_day_open_price = float(prev_day["Open"].iloc[-2])
            last_day_high_price = float(prev_day["High"].iloc[-2])
            last_day_low_price = float(prev_day["Low"].iloc[-2])
            last_day_close_price = float(prev_day["Close"].iloc[-2])
            last_day_volume = float(prev_day["Volume"].iloc[-2])
 
            dec = args.decimals
            last_datetime = prev_day.index[-2]
 
            print(Fore.YELLOW + Style.BRIGHT + f"{last_datetime} | Ticker: {ticker_symbol} | Low: {last_day_low_price:.{dec}f} | High: {last_day_high_price:.{dec}f} |"
                  f" Open: {last_day_open_price:.{dec}f} | Volume: {last_day_volume:.{dec}f} | Close: {last_day_close_price:.{dec}f}" + Fore.RESET + Style.RESET_ALL)
            downloaded = True
 
        except Exception as e:
            print(Fore.RED + Style.BRIGHT + f"ERROR: Ticker '{ticker_symbol}' does not exist or is invalid. Please check!" + Fore.RESET + Style.RESET_ALL)
            #stop = True
 
        if downloaded:
            while not stop:
                try:
                    stock_data = yf.download(ticker_symbol, period="1d", interval="1m").tail(1)
 
                    # Convertimos a float los valores más recientes
                    last_open_price = float(stock_data["Open"].iloc[-1])
                    last_high_price = float(stock_data["High"].iloc[-1])
                    last_low_price = float(stock_data["Low"].iloc[-1])
                    last_close_price = float(stock_data["Close"].iloc[-1])
                    last_volume = float(stock_data["Volume"].iloc[-1])
 
                    current_datetime = stock_data.index[-1]
 
                    # Determinar color de línea
                    if args.color:
                        line_color = Fore.BLUE
                        if prev_value is None or last_close_price == prev_value:
                            color = Fore.YELLOW
                        elif last_close_price > prev_value:
                            color = Fore.GREEN
                        else:
                            color = Fore.RED
                    else:
                        color = Fore.GREEN
                        line_color = Fore.GREEN
 
                    # Diferencias y porcentaje
                    diference = last_close_price - last_day_close_price
                    percentage = (diference / last_day_close_price) * 100
 
                    if diference > 0:
                        diference_color = Fore.GREEN + "+"
                    elif diference < 0:
                        diference_color = Fore.RED
                    else:
                        diference_color = Fore.YELLOW
 
                    print(line_color + Style.BRIGHT + f"{current_datetime} | Ticker: {ticker_symbol} | Low: {last_low_price:.{dec}f} | High: {last_high_price:.{dec}f} | Open: {last_open_price:.{dec}f} |"
                          f" Volume: {last_volume:.{dec}f} | Close: " + color + f"{last_close_price:.{dec}f}    "
                          + diference_color + f"{diference:.{dec}f} ({percentage:.{dec}f}%)" + Fore.RESET + Style.RESET_ALL)
 
                    prev_value = last_close_price
                    time.sleep(args.time_delay)
 
                    if stop:
                        print("\nProcess terminated by user.")
                        break
 
                except Exception as e:
                    print(Fore.RED + Style.BRIGHT + "\nUNEXPECTED ERROR: " + str(e) + Fore.RESET + Style.RESET_ALL)
                    break
 
 
    except Exception as e:
        print(Fore.RED + Style.BRIGHT + str(e) + Fore.RESET + Style.RESET_ALL)
 
def main():
    parser = argparse.ArgumentParser(prog="STOCK MONITOR 1.1", description="Show stock quotation in real time",
                                     epilog="REPO: https://github.com/antonioam82/Stock-Monitor")
    parser.add_argument('-tick', '--ticker', required=True, type=str, help='Ticker name')
    parser.add_argument('-clr', '--color', action='store_true', help='Use this action for color close values')
    parser.add_argument('-delay', '--time_delay', type=float, default=5, help='Call delay to the API, in seconds')
    parser.add_argument('-uind', '--use_index', action='store_true', default=None, help='Use index')
    parser.add_argument('-decim', '--decimals', type=int, default=2, help="Number of values decimals")
 
    args = parser.parse_args()
    if args.time_delay >= 0.5:
        quoter(args)
    else:
        parser.error(Fore.RED + Style.BRIGHT + "time delay value must be greater than or equal to 0.5" + Fore.RESET + Style.RESET_ALL)
 
if __name__ == '__main__':
    main()



Comentarios sobre la versión: 1.1 (0)


No hay comentarios
 

Comentar la versión: 1.1

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad

http://lwp-l.com/s7450