机器学习模型进行预测和回测

这段代码是为了并行地处理多个 CSV 文件,并使用机器学习模型进行预测和回测。主要涉及以下步骤:

  1. 初始化环境与设置

    • 引入必要的库,如 ray 用于并行计算,pandas 用于数据处理,tqdm 用于进度条显示等。
    • 设置一些路径,用于保存结果、图像、模型等。
    • 定义一些处理特征、数据预处理的函数。
  2. 并行处理函数 csv_predict

    • 使用 ray.remotecsv_predict 函数并行化。
    • 在每个函数中,加载训练好的模型,并对新的 CSV 文件进行预测和回测。
  3. 具体步骤

    • 读取 CSV 文件:读取并处理每个 CSV 文件,确保数据格式正确。
    • 数据预处理:包括特征计算、标准化等。
    • 构建验证数据集:将处理后的数据转换为模型可接受的格式。
    • 预测与回测:使用模型对数据进行预测,并根据预测结果进行回测计算,模拟交易策略。
  4. 结果保存

    • 根据回测结果,将交易数据保存到不同的文件夹中。
    • 以不同的策略和条件,将结果分门别类保存。

代码解读

import ray# 验证集数据处理
a = []
sum_dam_data = []# 定义并行处理函数
@ray.remote    
def csv_predict(csv_path):# 创建和训练模型参数nhits_params = {'sampling_stride': 8,'eval_metrics': ["mse", "mae"],'batch_size': 32,'max_epochs': 100,'patience': 10}rnn_params = {'sampling_stride': 8,'eval_metrics': ["mse", "mae"],'batch_size': 32,'max_epochs': 100,'patience': 10,}mlp_params = {'sampling_stride': 8,'eval_metrics': ["mse", "mae"],'batch_size': 32,'max_epochs': 100,'patience': 10,'use_bn': True,}# 加载训练好的加权集成预测模型reg = WeightingEnsembleForecaster(in_chunk_len=64,out_chunk_len=1,skip_chunk_len=0,estimators=[(NHiTSModel, nhits_params), (RNNBlockRegressor, rnn_params), (MLPRegressor, mlp_params)])reg = reg.load(os.path.join(model_center, "low_high"))# 读取 CSV 文件new_data = pd.read_csv(csv_path)new_data[['open', 'high', 'low', 'close', 'pre_close', 'change', 'pct_chg', 'vol', 'amount']] = new_data[['open', 'high', 'low', 'close', 'pre_close', 'change', 'pct_chg', 'vol', 'amount']].apply(pd.to_numeric, errors='coerce')# 如果数据长度不足,返回空结果if len(new_data) < 2048:return {}base_case = 0base_num = 0money = 0reverse_data = new_data.iloc[::-1]  # 反转数据顺序# 计算特征reverse_data = calculate_features(reverse_data)# 逐天进行预测和回测for day_i in range(64):new_data = reverse_data[-256:-64+day_i]new_data['index_new'] = range(1, len(new_data) + 1)# 构建验证数据集valid_tsdataset = TSDataset.load_from_dataframe(new_data,time_col="index_new",target_cols=['open', 'high', 'low', 'close', 'pre_close', 'change', 'pct_chg', 'MA5', 'MA10', 'MA20', 'EMA12', 'EMA26', 'Volatility_5', 'Volatility_10', 'Volume_MA5', 'Volume_Change_Rate', 'RSI14', 'Momentum_3', 'Momentum_7', 'Middle_Band', 'Upper_Band', 'Lower_Band'])valid_tsdataset = scaler.transform(valid_tsdataset)predicted = reg.recursive_predict(valid_tsdataset, 3)predicted = scaler.inverse_transform(predicted)predicted = predicted.to_dataframe()# 根据预测结果进行回测计算high_value = predicted.max().to_dict()['high']low_value = predicted.min().to_dict()['low']round_value = round((high_value - low_value) / low_value, 3) * 1000high_index = predicted[predicted['high'] == high_value].index.values[0] - len(new_data)low_index = predicted[predicted['low'] == low_value].index.values[0] - len(new_data)if high_value > low_value:if high_index > low_index:if base_num < 100000:if reverse_data[-(64 - day_i)][3] > low_value > reverse_data[-(64 - day_i)][4]:base_case += 10000 * low_valuebase_num += 10000money -= 10000 * low_valueif low_index > high_index:high_value = predicted['high'].tolist()[0]if reverse_data[-(64 - day_i)][3] > high_value > reverse_data[-(64 - day_i)][4]:base_case -= base_num * high_valuemoney += base_num * high_valuebase_num = 0else:base_case -= base_num * high_valuemoney += base_num * high_valuebase_num = 0sum_money = money + base_num * reverse_data[-(64 - day_i)][5]# 保存回测结果deal.append({"base_case": base_case,"base_num": base_num,"money": money,"index": reverse_data[-(64 - day_i)][-1],"close": reverse_data[-(64 - day_i)][5] * 10000,"total": base_num * reverse_data[-(64 - day_i)][5],"sum": sum_money,"rate": 100 * (sum_money / (reverse_data[-(64 - day_i)][5] * 10000))})try:pd.DataFrame(deal).to_csv(os.path.join("./back_test/low_high_128_5_100", last_price_data, str(int(deal[-1]['rate'])) + "_" + export_csv),index=False)except Exception as e:print(e)returnif deal[-1]['rate'] > 10:if pd.DataFrame(deal)['rate'].sum() > 0:pd.DataFrame(deal).to_csv(os.path.join("./back_test/good_low_high_5_100_deal_101", last_price_data, str(int(deal[-1]['rate'])) + "_" + export_csv),index=False)if deal[-1]['rate'] > 50:if pd.DataFrame(deal)['rate'].sum() > 0:pd.DataFrame(deal).to_csv(os.path.join("./back_test/good_low_high_5_100_deal_105", last_price_data, str(int(deal[-1]['rate'])) + "_" + export_csv),index=False)

主要功能

  1. 模型加载与预测

    • 加载预训练模型 WeightingEnsembleForecaster 并进行预测。
    • 预测未来几天的高低价格。
  2. 回测策略

    • 根据预测的高低价进行模拟交易,计算收益。
    • 基于交易规则买入或卖出,计算资金和持仓。
  3. 结果保存

    • 将回测结果保存到 CSV 文件中。
    • 根据不同的收益率将结果分开保存。

使用说明

  1. 确保已安装 ray 库用于并行计算。
  2. 确保所有依赖库(如 pandas, paddlets, tqdm 等)已安装。
  3. 将代码中的路径和参数调整为实际数据和模型的位置。
  4. 运行代码,通过 ray 并行处理多个 CSV 文件,提高处理效率。

注意事项

  1. 确保数据格式和模型参数与实际情况匹配。
  2. 在并行化时,要确保每个子任务的独立性,避免数据冲突。
  3. 根据需要调整回测策略和交易规则,以满足实际需求。

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

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

相关文章

golang 不用sleep如何实现实现每隔指定时间执行一次for循环?

今天介绍的是在go语言里面不用time.Sleep&#xff0c; 使用for range 定时器管道 来实现按照我们指定的时间间隔来执行for循环, 即&#xff1a; for range ticker.C { } 这样就实现了for每隔指定时间执行一次&#xff0c;除非管道被关闭&#xff0c;否则for而且会一直柱塞当前线…

浅说线性DP(下)

声明 最近博主身体不适&#xff0c;更新较慢&#xff0c;请大家体谅体谅 最大上升子序列 【题目描述】 一个数的序列 你的任务&#xff0c;就是对于给定的序列&#xff0c;求出最大上升子序列和。注意&#xff0c;最长的上升子序列的和不一定是最大的&#xff0c;比如序列(1…

03-3.3.1 栈在括号匹配中的应用

&#x1f44b; Hi, I’m Beast Cheng&#x1f440; I’m interested in photography, hiking, landscape…&#x1f331; I’m currently learning python, javascript, kotlin…&#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以订…

echarts的使用

一 echarts的使用 引入 echarts.js 文件 <script src"https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script> 准备一个呈现图表的盒子 <div class"container"><div class"t_header"><span>端午…

东方博宜1760 - 整理抽屉

题目描述 期末考试即将来临&#xff0c;小T由于同时肩负了学习、竞赛、班团活动等多方面的任务&#xff0c;一直没有时间好好整理他的课桌抽屉&#xff0c;为了更好地复习&#xff0c;小T首先要把课桌抽屉里的书分类整理好。 小T的抽屉里堆着 N 本书&#xff0c;每本书的封面上…

智能视频监控平台LntonCVS视频融合共享平台保障露营安全解决方案

在当今社会&#xff0c;都市生活的快节奏和压力使得越来越多的人渴望逃离城市的喧嚣&#xff0c;寻求一种短暂的慢生活体验。他们向往在壮丽的山河之间或宁静的乡村中露营&#xff0c;享受大自然的宁静与美好。随着露营活动的普及&#xff0c;露营地的场景也变得更加丰富多样&a…

使用python绘制核密度估计图

使用python绘制核密度估计图 核密度估计图介绍效果代码 核密度估计图介绍 核密度估计&#xff08;Kernel Density Estimation&#xff0c;KDE&#xff09;是一种用于估计数据概率密度函数的非参数方法。与直方图不同&#xff0c;KDE 可以生成平滑的密度曲线&#xff0c;更好地…

Mybatis使用缓存的配置总结

1.全局变量配置cacheEnabled&#xff1a; ture&#xff08;默认&#xff09;&#xff1a;开启二级缓存&#xff0c; false&#xff1a;关闭二级缓存&#xff0c;但一级缓存不受影响 2.映射文件中mapper标签下&#xff1a; 配置有&#xff1a;开启二级缓存 没配置有&#x…

LeetCode62不同路径

题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。问总共有多少条不同的路径&#xff1f; …

大模型参加高考,同写2024年高考作文,及格分(通义千问、Kimi、智谱清言、Gemini Advanced、Claude-3-Sonnet、GPT-4o)

大家好&#xff0c;我是章北海 今天高考&#xff0c;上午的语文结束&#xff0c;市面上又要来一场大模型参考的文章了。 我也凑凑热闹&#xff0c;让通义千问、Kimi、智谱清言一起来写一下高考作文。 公平起见&#xff0c;不加任何其他prompt&#xff0c;直接把题目甩过去。…

网络基础_02

1.ARP协议 地址解析协议&#xff08;Address Resolution Protocol&#xff09; 已知对方的三层ip地址&#xff0c;需要二层mac地址 当一台设备&#xff08;请求方&#xff09;需要知道某个 IP 地址对应的 MAC 地址时&#xff0c;会使用 ARP封装一个数据帧。这台设备的网络层以…

华为RH2288H V3服务器iBMC的SSL证书续期

本文对华为RH2288H V3服务器iBMC的SSL证书续期&#xff0c;以避名登录告警提示及主机状态异常。 一、检查现网服务器iBMC的SSL证书到期时间 登录iBMC&#xff0c;点击配置--SSL证书&#xff0c;如下&#xff1a; 可以看到本服务器SSL证书将于今年7月22日到期。 二、联系厂家…

【第四节】C/C++数据结构之树与二叉树

目录 一、基本概念与术语 二、树的ADT 三、二叉树的定义和术语 四、平衡二叉树 4.1 解释 4.2 相关经典操作 4.3 代码展示 一、基本概念与术语 树(Tree)是由一个或多个结点组成的有限集合T。其中: 1 有一个特定的结点&#xff0c;称为该树的根(root)结点&#xff1b; 2 …

【Linux】进程2——管理概念,进程概念

1.什么是管理&#xff1f; 那在还没有学习进程之前&#xff0c;就问大家&#xff0c;操作系统是怎么管理进行进程管理的呢&#xff1f; 很简单&#xff0c;先把进程描述起来&#xff0c;再把进程组织起来&#xff01; 我们拿大学为例子 最典型的管理者——校长最典型的被管理…

来自工业界的知识库 RAG 服务(三),FinGLM 竞赛获奖项目详解

背景介绍 前面介绍过工业界的 RAG 服务 QAnything 和 RagFlow 的详细设计&#xff0c;也介绍过来自学术界的 一些优化手段。 前一阵子刚好看到智谱组织的一个金融大模型比赛 FinGLM&#xff0c;主要做就是 RAG 服务的竞赛&#xff0c;深入研究了其中的几个获奖作品&#xff…

Pyramid Vision Transformer, PVT(ICCV 2021)原理与代码解读

paper&#xff1a;Pyramid Vision Transformer: A Versatile Backbone for Dense Prediction without Convolutions official implementation&#xff1a;GitHub - whai362/PVT: Official implementation of PVT series 存在的问题 现有的 Vision Transformer (ViT) 主要设计…

C++结合ffmpeg获取声音的分贝值

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、分贝是什么&#xff1f;1.功率量2.场量 二、实际操作1.分析wav文件2.读取麦克风 总结 前言 最近面对一个需求&#xff0c;就是需要传递声音文件到模型里推…

链表的回文结构OJ

链表的回文结构_牛客题霸_牛客网对于一个链表&#xff0c;请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法&#xff0c;判断其是否为。题目来自【牛客题霸】https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId49&&tqId29370&rp1&a…

CodeMeter助力Hilscher,推动实现全球智能制造连接解决方案

Hilscher的旗舰店为开放工业4.0联盟&#xff08;OI4&#xff09;社区提供了应用商店的便捷和开放性&#xff0c;将这一概念引入工业领域。该商店依托CodeMeter的许可证管理和加密保护&#xff0c;为工业用户提供了丰富的应用和解决方案库&#xff0c;满足他们在车间自动化和连接…

2020年06月C语言二级真题

计算矩阵边缘元素之和 题目描述 输入一个整数矩阵&#xff0c;计算位于矩阵边缘的元素之和。 所谓矩阵边缘的元素&#xff0c;就是第一行和最后一行的元素以及第一列和最后一列的元素。 输入格式 第一行分别为矩阵的行数n和列数m&#xff0c;两者之间以一个空格分开。 接下来输…