Voici une description détaillée de ce que fait chaque partie du code :
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.
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 date du jour et la date de début de la période sont calculées sur la base de n_jours.
Yahooquery est utilisé pour récupérer les données boursières historiques pour la période spécifiée.
Si aucune donnée n'est disponible, un message est imprimé et la fonction se termine.
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.
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.
Des filigranes sont ajoutés dans les coins inférieur gauche et supérieur droit de l'intrigue.
Le tracé est enregistré sous forme de fichier image avec le nom de fichier spécifié et affiché.
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!