TimesFM(Time Series Foundation Model)时间序列预测股市价格的数据研究(4)

news2024/12/17 6:04:13

TimesFM(Time Series Foundation Model)时间序列预测的数据研究(3)-CSDN博客文章浏览阅读846次,点赞19次,收藏12次。1. **表示预测区间**:在很多预测任务中,模型给出的不只是一个单一的预测值(比如预测某个时间点的数值),而是一个预测区间来体现不确定性。像如果预测某商品未来销量,通过计算不同 `quantiles` 的值,能知道销量大概率(比如 90% 的置信区间,对应 0.05 和 0.95 分位数)会落在哪个范围,以及最有可能的中间值(0.5 分位数即中位数)是多少。通过比较模型输出的 `quantiles` 对应的预测区间和实际观测值落在该区间的比例等情况,可以判断模型对不确定性的把握能力。https://blog.csdn.net/chenchihwen/article/details/144444583?spm=1001.2014.3001.5501前一回把时间序列进行了安装

利用 baostock 获取宁德时代(SZ.300750)股票数据 为例进行预测

从 start_date='2020-01-01', end_date=system date

并从60 天前开始做隔日的收盘价格预测 然后不断的调整 trainning date 往后加上1天,一直到前天的历史数据预测

预测的结果与实际的价格如下截图

结论,不是很准确。

import os
import time
import pandas as pd
import numpy as np
import timesfm
import baostock as bs
from datetime import datetime, timedelta

# 步骤一:从Baostock获取宁德时代(SZ.300750)股票数据,并保存到Excel
def get_stock_data(code, start_date='2020-01-01', end_date=None):
    data_list = []
    lg = bs.login()
    if lg.error_code == '0':
        if end_date is None:
            end_date = datetime.now().strftime('%Y-%m-%d')  # 设置为系统当前日期
        rs = bs.query_history_k_data_plus(code,
                                          "date,open,high,low,close,volume",
                                          start_date=start_date, end_date=end_date,
                                          frequency='d')
        while (rs.error_code == '0') & rs.next():
            data_list.append(rs.get_row_data())
        result = pd.DataFrame(data_list, columns=rs.fields)
        bs.logout()
    else:
        print("登录Baostock失败:", lg.error_msg)
        result = None
    return result


_MODEL_PATH = "google/timesfm-1.0-200m"  # 直接定义模型路径,也可以设置为命令行参数传入,此处简化处理
_BATCH_SIZE = 64  # 定义批次大小,同样可作为参数传入,这里先写死示例
_HORIZON = 128  # 定义预测的水平长度,可按需调整,此处示例写死
_BACKEND = "gpu"  # 定义后端,示例写死为gpu,可根据实际情况改变
_NUM_JOBS = 1  # 定义作业数量,示例值
_SAVE_DIR = "./results"  # 定义保存结果的目录,示例路径,可按需调整

# QUANTILES = list(np.arange(1, 10) / 10.0)  # 定义分位数列表,示例简化写法,和原代码功能类似,可按需细化
QUANTILES = list[0.2,  0.5,  0.8]

def main():
    # 获取股票数据
    stock_data = get_stock_data('SZ.300750')

    if stock_data is not None:
        # 将日期列转换为日期时间类型
        stock_data['date'] = pd.to_datetime(stock_data['date'])

        # 获取系统当前日期往前推60天作为划分依据(tday)
        tday = datetime.now() - timedelta(days=60)

        # 初始化一个空的DataFrame用于存储最终合并的结果
        result_df = pd.DataFrame()

        # 获取stock_data['date']中的所有日期数据列表,用于后续遍历
        all_dates = stock_data['date'].unique()
        # 筛选出大于等于tday的日期,确保从设置的起始日期开始遍历
        valid_dates = [date for date in all_dates if date >= tday]

        for current_date in valid_dates:
            # 划分训练集和测试集(这里只做了简单示意,和原代码逻辑保持一致,可能需要根据实际情况调整)
            train = stock_data[stock_data['date'] <= current_date]
            test = stock_data[stock_data['date'] >= current_date - timedelta(days=5)]
            
            # 初始化一个空的DataFrame用于存储本次循环调整后的数据(类似原代码中的test_pd作用)
            test_pd = pd.DataFrame(columns=['unique_id', 'ds', 'y'])
            # 循环处理每个特征列,构建符合要求的结构
            for col in train.columns[1:]:  # 从第2列开始,跳过日期列(索引为0)
                temp_df = pd.DataFrame({
                    'unique_id': f'sz.300750_{col.lower()}',
                    'ds': train['date'],  # 直接使用stock_data中的日期列
                    'y': train[col]
                })
                # 尝试将y列转换为数字类型,如果转换失败会将非数字值设置为NaN
                temp_df['y'] = pd.to_numeric(temp_df['y'], errors='coerce')
                test_pd = pd.concat([test_pd, temp_df], ignore_index=True)
            
            # 构建TimesFM模型(这部分和原代码保持一致,可能需要根据实际需求调整相关参数等)
            tfm = timesfm.TimesFm(
                hparams=timesfm.TimesFmHparams(
                    backend=_BACKEND,
                    per_core_batch_size=_BATCH_SIZE,
                    horizon_len=_HORIZON,
                ),
                checkpoint=timesfm.TimesFmCheckpoint(
                    huggingface_repo_id=_MODEL_PATH),
            )
            run_id = np.random.randint(100000)  # 简单示例设置运行ID为0,你可以根据实际需求调整生成方式,比如用时间戳等
            model_name = "timesfm"
            print(f"Evaluating model {model_name} on custom data", flush=True)
            # 获取test_pd数据对应的频率,这里假设是日频率'd',你可能需要根据实际情况调整获取逻辑
            freq = 'd'
            init_time = time.time()
            # 直接使用test_pd进行预测,调用forecast_on_df方法
            fcsts_df = tfm.forecast_on_df(
                inputs=test_pd,
                freq=freq,
                value_name="y",
                model_name=model_name,
                forecast_context_len=512,  # 这里的上下文长度你可以根据实际需求调整
                num_jobs=_NUM_JOBS,
            )
            fcsts_df = fcsts_df[fcsts_df['ds'] <= (current_date + timedelta(days=12))]
            test_df12 = test[test['date'] <= (current_date + timedelta(days=12))]
            fields_to_join = ['sz.300750_open', 'sz.300750_high', 'sz.300750_low', 'sz.300750_close', 'sz.300750_volume']
            # 先将test_df12表赋值给merged_df,后续在此基础上不断合并新列(原代码是复制test_df12,这里改为直接赋值)
            merged_df = test_df12
            for field in fields_to_join:
                temp_merged  = pd.merge(
                    merged_df,
                    fcsts_df[fcsts_df['unique_id'] == field ][['ds','timesfm']],
                    left_on='date',
                    right_on='ds',
                    how='left',
                    suffixes=('', '_fcsts')  # 指定后缀,避免列名冲突
                )
                # 根据当前的字段重命名合并后得到的'timesfm'列
                new_column_name = field.split('.')[-1]
                temp_merged.rename(columns={'timesfm': new_column_name}, inplace=True)
                merged_df = temp_merged
            # 删除不需要的列
            merged_df.drop(columns=['ds_fcsts'], inplace=True)
            # 删除不需要的列
            merged_df.drop(columns=['ds'], inplace=True) 
            merged_df['forecastOnTday'] = current_date     
            # 将本次循环得到的merged_df合并到result_df中
            print('merged_df:',merged_df)
            result_df = pd.concat([result_df, merged_df], ignore_index=True)

        # 打印最终的 DataFrame(这里打印合并后的result_df)
        print(result_df)       
        
        save_path = os.path.join(_SAVE_DIR, str(run_id))
        print(f"Saving results to {save_path}", flush=True)
        os.makedirs(save_path, exist_ok=True)
        result_df.to_csv(f"{save_path}/results.csv")
    else:
        print("未能成功获取股票数据,无法进行后续操作。")

if __name__ == "__main__":
    main()

执行的截图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2260891.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

opencv所有常见函数

一、opencv图像操作 二、opencv图像的数值运算 三、opencv图像的放射变换 四、opencv空间域图像滤波 五、图像灰度化与直方图 六、形态学图像处理 七、阈值处理与边缘检测 八、轮廓和模式匹配

常见漏洞—SSRF_FastCGI

FastCGI协议 简介 Fast CGI源自旧版本的CGI 路由/结构图 # 访问url --> 浏览器生成HTTP请求报文 --> web server解析请求&#xff08;例如nginx&#xff09; web server 是内容的分发者 当访问静态页面时&#xff0c;web server 会直接返回资源&#xff0c;例如index.htm…

【游戏设计原理】10 - 科斯特的游戏理论

科斯特的游戏理论强调了游戏与学习之间的关系&#xff0c;认为“玩得开心”与“学习”是紧密相连的。换句话说&#xff0c;游戏的核心魅力在于通过适当的挑战和不断的学习进程激发玩家的内啡肽循环&#xff0c;这让玩家在不断的探索和进步中找到乐趣。 科斯特的理论通过游戏是…

ES-IndexTemplate和DynamicTemplate

IndexTemplate 什么是IndexTemplate 索引模板&#xff0c;帮助你设定Mappings和Settings&#xff0c;并按照一定的规则&#xff0c;自动匹配到新创建的索引之上 模板仅在一个索引被新建的时候&#xff0c;才会产生应用&#xff0c;索引被修改不会影响已创建的索引可以设定多…

【大语言模型】ACL2024论文-27 Mementos:一个全面的多模态大型语言模型在图像序列推理上的基准测试

【大语言模型】ACL2024论文-27 Mementos&#xff1a;一个全面的多模态大型语言模型在图像序列推理上的基准测试 目录 文章目录 【大语言模型】ACL2024论文-27 Mementos&#xff1a;一个全面的多模态大型语言模型在图像序列推理上的基准测试目录文章摘要研究背景问题与挑战如何…

CSS基础与应用详解

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Css篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Css篇专栏内容:CSS基础与应用详解 前言 CSS&#xff08;层叠样式表&#xff09;是网页设计中不可或缺的一部分&am…

C/S软件授权注册系统(Winform+WebApi+.NET8+EFCore版)

适用软件&#xff1a;C/S系统、Winform桌面应用软件。 运行平台&#xff1a;Windows .NETCore&#xff0c;.NET8 开发工具&#xff1a;Visual Studio 2022&#xff0c;C#语言 数据库&#xff1a;Microsoft SQLServer 2012&#xff0c;Oracle 21c&#xff0c;MySQL8&#xf…

国标GB28181网页直播平台EasyGBS国标EasyGBD对讲音频demo

近年来&#xff0c;随着信息技术的飞速发展&#xff0c;视频监控领域正经历从传统安防向智能化、网络化安防的深刻转变。在此过程中&#xff0c;GB28181标准凭借其强大的功能和灵活性&#xff0c;成为了推动视频监控系统互联互通和高效管理的重要一环。通过支持GB28181协议&…

session 共享服务器

1.安装 kryo-3.0.3.jar asm-5.2.jar objenesis-2.6.jar reflectasm-1.11.9.jar minlog-1.3.1.jar kryo-serializers-0.45.jar msm-kryo-serializer-2.3.2.jar memcached-session-manager-tc9-2.3.2.jar spymemcached-2.12.3.jar memcached-session-manager-2.3.2.jar …

【蓝桥杯国赛真题15】python质因数个数 蓝桥杯青少年组python编程国赛真题详细解析

目录 python质因数个数 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python质因数个数 第十二届蓝桥杯青少年组python比赛国赛真题详细解析 …

智能硬件「百团大战」:AI驱动的周期来了吗?

要想在竞争激烈的市场中打造出真正的AI硬件“爆款”&#xff0c;并非简单地在现有硬件上堆砌AI功能就能实现&#xff0c;而是需要深刻理解AI的本质&#xff0c;用AI技术从底层逻辑出发&#xff0c;彻底重塑硬件产品的设计、功能与用户体验。 作者|斗斗 编辑|皮爷 出品|产…

Linux核心概念与常用命令

文章目录 一、Linux概述1、常见的操作系统2、Linux发展史3、Linux目录结构 二、文件和目录操作1、pwd - 显示当前目录2、cd - 切换目录3、ls - 列出目录内容4、mkdir - 创建目录5、touch - 创建空文件6、cp - 复制文件或目录7、mv - 移动或重命名文件8、rm - 删除文件或目录9、…

uniappp配置导航栏自定义按钮(解决首次加载图标失败问题)

1.引入iconfont的图标&#xff0c;只保留这两个文件 2.App.vue引入到全局中 import "./static/fonts/iconfont.css"3.pages.json中配置text为图标对应的unicode {"path": "pages/invite/invite","style": {"h5": {"…

vue组件开发:构建响应式快捷导航

前言 快捷导航不仅能够显著提升系统的灵活性和用户交互性&#xff0c;还极大地增强了用户的操作体验。本文将展示如何在 vue 中实现一个既可自定义又具备响应式特性的快捷导航菜单。 一、实现思路 列表页 结构设计 定义页面结构&#xff0c;包含一个导航卡片和一个对话框组件&a…

基于 Spring Boot 实现图片的服务器本地存储及前端回显

??导读&#xff1a;本文探讨了在网站开发中图片存储的各种方法&#xff0c;包括本地文件系统存储、对象存储服务&#xff08;如阿里云OSS&#xff09;、数据库存储、分布式文件系统及内容分发网络&#xff08;CDN&#xff09;。文中详细对比了这些方法的优缺点&#xff0c;并…

深入了解IPv6——光猫相关设定:DNS来源、DHCPv6服务、前缀来源等

光猫IPv6设置后的效果对比图&#xff1a; 修改前&#xff1a; 修改后&#xff1a; 一、DNS来源 1. 网络连接 来源&#xff1a; 从上游网络&#xff08;如运营商&#xff09;获取 IPv6 DNS 信息&#xff0c;通过 PPPoE 或 DHCPv6 下发。 特点&#xff1a; DNS 服务器地址直…

欧科云链研究院:AI时代,如何证明“我是我”?

OKG Research&#xff5c;编辑 近日&#xff0c;OpenAI 发布了新模型 Sora。这是一款高性能的文本到多模态生成工具&#xff0c;支持从文本生成精细的图像和动态视频。 相较早先发布的视频样例&#xff0c;该功能目前已经可以由用户真实上手体验&#xff0c;目前由于服务过载…

Cesium进阶教程——自定义图形、外观、绘图基础、现有着色器移植至Cesium、ShadowMapping、视频GIS、模型压平、卷帘

基础必看 WEBGL基础&#xff08;从渲染管线角度解读&#xff09; 参考路线 http://www.xt3d.online/tutorial/further/article.html 自定义图形 https://blog.csdn.net/m0_55049655/article/details/138908327 https://blog.csdn.net/m0_55049655/article/details/140306837 …

【Linux|计算机网络】HTTPS工作原理与安全机制详解

目录 1、HTTPS是什么&#xff1f; 2、概念准备 2.1.什么是加密、解密、密钥 2.2.为什么要加密 2.3.常见的加密方式 1.对称加密 2.非对称加密 2.4.数据摘要 && 数据指纹 2.5. 数字签名 3.HTTPS 的工作过程探究 方案 1 - 只使用对称加密 方案 2 - 只使用非对…

【JavaWeb后端学习笔记】Redis常用命令以及Java客户端操作Redis

redis 1、redis安装与启动服务2、redis数据类型3、redis常用命令3.1 字符串String3.2 哈希Hash3.3 列表List3.4 集合Set&#xff08;无序&#xff09;3.5 有序集合zset3.6 通用命令 4、使用Java操作Redis4.1 环境准备4.2 Java操作字符串String4.3 Java操作哈希Hash4.4 Java操作…