Maison  >  Article  >  développement back-end  >  Code Python qui génère un graphique du cours des actions pour les n derniers jours.

Code Python qui génère un graphique du cours des actions pour les n derniers jours.

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-21 14:47:02652parcourir

Python code that generates a stock price chart for the last n days.

Voici une description détaillée de ce que fait chaque partie du code :

Importation de bibliothèques :

matplotlib.pyplot est utilisé pour créer des tracés.
yahooquery.Ticker est utilisé pour récupérer les données boursières historiques de Yahoo Finance.
datetime et timedelta sont utilisés pour la manipulation de la date.
pandas est utilisé pour le traitement des données.
pytz est utilisé pour travailler avec les fuseaux horaires.
os est utilisé pour les opérations du système de fichiers.

Fonction plot_stock_last_n_days :

Paramètres de fonction :
symbole : le symbole boursier (par exemple, « NVDA »).
n_days : le nombre de jours pendant lesquels les données historiques sont affichées.
filename : le nom du fichier dans lequel le tracé sera enregistré.
fuseau horaire : le fuseau horaire d'affichage des données.

la plage de dates :

La date du jour et la date de début de la période sont calculées sur la base de n_jours.

Récupération de données :

Yahooquery est utilisé pour récupérer les données boursières historiques pour la période spécifiée.

Vérification de la disponibilité des données :

Si aucune donnée n'est disponible, un message est imprimé et la fonction se termine.

Informatique:

L'index des données est converti au format datetime et le fuseau horaire est défini.
Les week-ends (samedi et dimanche) sont filtrés.
Les variations en pourcentage des cours de clôture sont calculées.

Création et configuration du tracé :

Une parcelle principale est créée avec les cours de clôture.
Des annotations sont ajoutées au graphique indiquant les prix de clôture et les variations en pourcentage.
Les axes X et Y sont configurés, les dates sont formatées et des lignes de quadrillage sont ajoutées.
Un graphique supplémentaire pour le volume des transactions est ajouté, avec différentes couleurs pour les changements positifs et négatifs des prix de clôture.

Ajout de filigranes :

Des filigranes sont ajoutés dans les coins inférieur gauche et supérieur droit de l'intrigue.

Sauvegarde et affichage du tracé :

Le tracé est enregistré sous forme de fichier image avec le nom de fichier spécifié et affiché.

Exemple d'utilisation :

La fonction est appelée avec le ticker « NVDA » (NVIDIA), affichant les données des 14 derniers jours, enregistrant le tracé sous « output.png » et en utilisant le fuseau horaire GMT.

En résumé, le code génère une représentation visuelle des données boursières historiques, y compris les cours de clôture et les volumes de transactions, avec des annotations pour les changements en pourcentage et les considérations de fuseau horaire.

import matplotlib.pyplot as plt
from yahooquery import Ticker
from datetime import datetime, timedelta
import matplotlib.dates as mdates
import os
import pandas as pd
import pytz

def plot_stock_last_n_days(symbol, n_days=30, filename='stock_plot.png', timezone='UTC'):
    # Define the date range
    end_date = datetime.now(pytz.timezone(timezone))
    start_date = end_date - timedelta(days=n_days)

    # Convert dates to the format expected by Yahoo Finance
    start_date_str = start_date.strftime('%Y-%m-%d')
    end_date_str = end_date.strftime('%Y-%m-%d')

    # Fetch historical data for the last n days
    ticker = Ticker(symbol)
    historical_data = ticker.history(start=start_date_str, end=end_date_str, interval='1d')

    # Check if the data is available
    if historical_data.empty:
        print("No data available.")
        return

    # Ensure the index is datetime for proper plotting and localize to the specified timezone
    historical_data.index = pd.to_datetime(historical_data.index.get_level_values('date')).tz_localize('UTC').tz_convert(timezone)

    # Filter out weekends
    historical_data = historical_data[historical_data.index.weekday < 5]

    # Calculate percentage changes
    historical_data['pct_change'] = historical_data['close'].pct_change() * 100

    # Ensure the output directory exists
    output_dir = 'output'
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    # Adjust the filename to include the output directory
    filename = os.path.join(output_dir, filename)

    # Plotting the closing price
    fig, ax1 = plt.subplots(figsize=(10, 5))
    ax1.plot(historical_data.index, historical_data['close'], label='Close Price', color='blue', marker='o')

    # Annotate each point with its value and percentage change
    for i in range(1, len(historical_data)):
        date = historical_data.index[i]
        close = historical_data['close'].iloc[i]
        pct_change = historical_data['pct_change'].iloc[i]
        color = 'green' if pct_change > 0 else 'red'
        ax1.text(date, close, f'{close:.2f}\n({pct_change:.2f}%)', fontsize=9, ha='right', color=color)

    # Set up daily gridlines and print date for every day
    ax1.xaxis.set_major_locator(mdates.DayLocator(interval=1))
    ax1.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))

    ax1.set_xlabel('Date')
    ax1.set_ylabel('Price (USD)')
    ax1.set_title(f'{symbol} Stock Price - Last {n_days} Days')
    ax1.legend(loc='upper left')
    ax1.grid(True)
    ax1.tick_params(axis='x', rotation=80)
    fig.tight_layout()

    # Adding the trading volume plot
    ax2 = ax1.twinx()
    calm_green = (0.6, 1, 0.6)  # Calm green color
    calm_red = (1, 0.6, 0.6)    # Calm red color
    colors = [calm_green if historical_data['close'].iloc[i] > historical_data['open'].iloc[i] else calm_red for i in range(len(historical_data))]
    ax2.bar(historical_data.index, historical_data['volume'], color=colors, alpha=0.5, width=0.8)
    ax2.set_ylabel('Volume')
    ax2.tick_params(axis='y')

    # Format y-axis for volume in millions
    def millions(x, pos):
        'The two args are the value and tick position'
        return '%1.0fM' % (x * 1e-6)

    ax2.yaxis.set_major_formatter(plt.FuncFormatter(millions))

    # Adjust the visibility and spacing of the volume axis
    fig.subplots_adjust(right=0.85)
    ax2.spines['right'].set_position(('outward', 60))
    ax2.yaxis.set_label_position('right')
    ax2.yaxis.set_ticks_position('right')

    # Add watermarks
    plt.text(0.01, 0.01, 'medium.com/@dmitry.romanoff', fontsize=12, color='grey', ha='left', va='bottom', alpha=0.5, transform=plt.gca().transAxes)
    plt.text(0.99, 0.99, 'medium.com/@dmitry.romanoff', fontsize=12, color='grey', ha='right', va='top', alpha=0.5, transform=plt.gca().transAxes)

    # Save the plot as an image file
    plt.savefig(filename)
    plt.show()

# Example usage
plot_stock_last_n_days('NVDA', n_days=14, filename='output.png', timezone='GMT')

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn