Python绘制动态股价曲线图并保存视频

发布于:2024-07-04 ⋅ 阅读:(20) ⋅ 点赞:(0)

用akshare库获取英伟达(股票代码:105.NVDA) 在2014年6月19日到2024年6月19日期间的股票的收盘价数据(用后复权的收盘价);

基于后复权的收盘价数据,做一个动态股价曲线图,逐日显示英伟达股价的动态变化情况, 以mp4视频文件输出,保存到文件夹:E:\aivideo;

在大模型中使用如下提示词:

你是一个Python编程专家,要完成一个编写Python脚本的任务,具体步骤如下:

用akshare库获取英伟达(股票代码:105.NVDA) 在2014年6月19日到2024年6月19日期间的股票的收盘价数据(用后复权的收盘价);

基于后复权的收盘价数据,做一个动态股价曲线图,逐日显示英伟达股价的动态变化情况, 以mp4视频文件输出,保存到文件夹:E:\aivideo;

注意:

每一步都要输出信息到屏幕上

日期格式是YYYYMMDD

设置matplotlib默认字体为'SimHei',文件路径为:C:\Windows\Fonts\simhei.ttf

mp4视频的分辨率1080p,码率10Mbps以内,视频时长控制在5分钟以内,格式为MP4格式;

stock_data['日期'] 列的数据类型是字符串,而不是日期时间类型。我们需要先将这一列转换为日期时间类型,然后再进行操作

历史行情数据-东财

接口: stock_us_hist

目标地址: https://quote.eastmoney.com/us/ENTX.html#fullScreenChart

描述: 东方财富网-行情-美股-每日行情

限量: 单次返回指定上市公司的指定 adjust 后的所有历史行情数据

输入参数

名称类型描述

symbolstr美股代码, 可以通过 ak.stock_us_spot_em() 函数返回所有的 pandas.DataFrame 里面的 代码 字段获取

periodstrperiod='daily'; choice of {'daily', 'weekly', 'monthly'}

start_datestrstart_date="20210101"

end_datestrend_date="20210601"

adjuststr默认 adjust="", 则返回未复权的数据; adjust="qfq" 则返回前复权的数据, adjust="hfq" 则返回后复权的数据

输出参数

名称类型描述

日期object-

开盘float64注意单位: 美元

收盘float64注意单位: 美元

最高float64注意单位: 美元

最低float64注意单位: 美元

成交量int32注意单位: 股

成交额float64注意单位: 美元

振幅float64注意单位: %

涨跌幅float64注意单位: %

涨跌额float64注意单位: 美元

换手率float64注意单位: %

接口示例

import akshare as ak

stock_us_hist_df = ak.stock_us_hist(symbol='106.TTE', period="daily", start_date="20200101", end_date="20240214", adjust="qfq")

print(stock_us_hist_df)

根据大模型给出的代码,排除错误后结果如下:

import akshare as ak
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
import os
from matplotlib.animation import FuncAnimation, FFMpegWriter
import matplotlib
matplotlib.rcParams['animation.ffmpeg_path'] = r'D:\Shotcut\ffmpeg.exe'
# 设置matplotlib默认字体为'SimHei'
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 获取英伟达股票数据
def get_stock_data():
    print("正在获取英伟达股票数据...")
    stock_data = ak.stock_us_hist(symbol='105.NVDA', period="daily", start_date="20140619", end_date="20240619", adjust="hfq")
    print("数据获取完成。")
    return stock_data

# 转换日期格式
def convert_date_format(stock_data):
    print("正在转换日期格式...")
    stock_data['日期'] = pd.to_datetime(stock_data['日期'], format='%Y-%m-%d')
    print("日期格式转换完成。")
    return stock_data

# 创建动态股价曲线图
def create_animation(stock_data):
    print("正在创建动态股价曲线图...")
    fig, ax = plt.subplots(figsize=(19.2, 10.8))
    ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
    ax.xaxis.set_major_locator(mdates.YearLocator())
    line, = ax.plot([], [], lw=2)

    def init():
        ax.set_xlim(stock_data['日期'].iloc[0], stock_data['日期'].iloc[-1])
        ax.set_ylim(stock_data['收盘'].min(), stock_data['收盘'].max())
        return line,

    def update(frame):
        line.set_data(stock_data['日期'].iloc[:frame], stock_data['收盘'].iloc[:frame])
        ax.relim()
        ax.autoscale_view()
        return line,

    ani = FuncAnimation(fig, update, frames=len(stock_data), init_func=init, blit=True)
    print("动态股价曲线图创建完成。")
    return ani

# 保存视频
def save_video(ani):
    print("正在保存视频...")
    if not os.path.exists(r'E:\aivideo'):
        os.makedirs(r'E:\aivideo')
    writer = FFMpegWriter(fps=30, metadata=dict(artist='Me'), bitrate=10000)
    ani.save(r'E:\aivideo\nvidia_stock_price.mp4', writer=writer)
    print("视频保存完成。")

# 主函数
def main():
    stock_data = get_stock_data()
    stock_data = convert_date_format(stock_data)
    ani = create_animation(stock_data)
    save_video(ani)

if __name__ == "__main__":
    main()