首页 >后端开发 >Python教程 >生成最近 n 天的股票价格图表的 Python 代码。

生成最近 n 天的股票价格图表的 Python 代码。

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-21 14:47:02731浏览

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

以下是代码各部分功能的详细说明:

导入库:

matplotlib.pyplot 用于创建绘图。
yahooquery.Ticker 用于从雅虎财经获取历史股票数据。
datetime 和 timedelta 用于日期操作。
pandas 用于数据处理。
pytz 用于处理时区。
os 用于文件系统操作。

函数plot_stock_last_n_days:

函数参数:
符号:股票代码(例如“NVDA”)。
n_days:显示历史数据的天数。
filename:保存绘图的文件名。
timezone:显示数据的时区。

日期范围:

当前日期和周期开始日期是根据n_days计算的。

获取数据:

yahooquery 用于检索指定时间段内的历史股票数据。

检查数据可用性:

如果没有可用数据,则会打印一条消息,然后函数退出。

数据处理:

数据的索引转换为日期时间格式并设置时区。
周末(周六和周日)被过滤掉。
计算收盘价的百分比变化。

创建和配置绘图:

主要情节是根据收盘价创建的。
绘图中添加了注释,显示收盘价和百分比变化。
配置 X 轴和 Y 轴、设置日期格式并添加网格线。
添加了额外的交易量图,用不同的颜色表示收盘价的正向和负向变化。

添加水印:

水印添加到图的左下角和右上角。

保存并显示绘图:

绘图将保存为具有指定文件名的图像文件并显示。

用法示例:

使用代码“NVDA”(NVIDIA) 调用该函数,显示过去 14 天的数据,将绘图保存为“output.png”,并使用 GMT 时区。

总之,代码生成历史股票数据的可视化表示,包括收盘价和交易量,以及百分比变化和时区注意事项的注释。

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')

以上是生成最近 n 天的股票价格图表的 Python 代码。的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn