機器學習模型進行預測和回測

這段代碼是為了并行地處理多個 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.pswp.cn/web/24043.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24043.shtml
英文地址,請注明出處:http://en.pswp.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;兩者之間以一個空格分開。 接下來輸…