如何通過akshare庫,獲取股票數據,并生成TabPFN這個模型 可以識別、處理的格式(并進行了訓練、推理)

計劃讓AI幫助編程使用TabPFN模型進行股價推理

原計劃提問的prompt

如何通過akshare庫,獲取股票數據,并生成TabPFN這個模型 可以識別、處理的格式

本意是想讓AI分步執行,先處理股票數據,然后再進行模型訓練,結果豆包超長發揮,直接把后面的模型預測部分也寫了,導致其它兩個模型都需要再附加上模型預測的prompt,

最終除豆包外的prompt

通過akshare庫,獲取股票數據,并生成TabPFN這個模型 可以識別、處理的格式,寫一個完整的預處理示例,并構建一個預測未來 3 天股價漲跌的分類任務

豆包答題

豆包的總體表現中規中矩,只用一句“數據處理”的prompt,它就完成了整個任務,這是沒有預料到的,也就是豆包會搶答了!

但是生成的代碼無法一次跑通,大約修改了2-3次,而且有一個地方AI是改不過來的,必須手工改。當然手工改這個地方其它AI也沒pass。

豆包的代碼

import akshare as ak
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from tabpfn import TabPFNClassifier# 獲取股票數據
stock_data = ak.stock_zh_a_hist(symbol="600519", period="daily", start_date="20200101", end_date="20230101",adjust="qfq")# 數據預處理函數
def prepare_data_for_tabpfn(stock_data, days_ahead=3):df = stock_data.copy()# 動態處理列名original_columns = df.columns.tolist()print(f"原始列名: {original_columns}")if len(original_columns) == 12:df.columns = ['日期', '開盤', '收盤', '最高', '最低', '成交量', '成交額', '振幅', '漲跌幅', '漲跌額', '換手率', '未知列']else:df.columns = [f"col_{i}" for i in range(len(original_columns))]print(f"警告: 列數量不匹配,使用默認列名: {df.columns.tolist()}")# 特征工程df['收盤價_滯后1'] = df['收盤'].shift(1)df['收盤價_滯后2'] = df['收盤'].shift(2)df['收盤價_滯后3'] = df['收盤'].shift(3)df['漲跌幅_1'] = df['收盤'].pct_change(1)df['漲跌幅_2'] = df['收盤'].pct_change(2)df['漲跌幅_3'] = df['收盤'].pct_change(3)df['MA5'] = df['收盤'].rolling(window=5).mean()df['MA10'] = df['收盤'].rolling(window=10).mean()df['MA20'] = df['收盤'].rolling(window=20).mean()df['波動率_5'] = df['漲跌幅_1'].rolling(window=5).std()df['波動率_10'] = df['漲跌幅_1'].rolling(window=10).std()df['成交量_變化'] = df['成交量'].pct_change(1)df['成交量_MA5'] = df['成交量'].rolling(window=5).mean()df['未來漲跌'] = np.where(df['收盤'].shift(-days_ahead) > df['收盤'], 1, 0)df = df.dropna()feature_columns = ['收盤價_滯后1', '收盤價_滯后2', '收盤價_滯后3','漲跌幅_1', '漲跌幅_2', '漲跌幅_3','MA5', 'MA10', 'MA20','波動率_5', '波動率_10','成交量_變化', '成交量_MA5']valid_features = [col for col in feature_columns if col in df.columns]if len(valid_features) < len(feature_columns):missing_features = set(feature_columns) - set(valid_features)print(f"警告: 缺少以下特征: {missing_features}")feature_columns = valid_featuresX = df[feature_columns].valuesy = df['未來漲跌'].valuesfeature_names = feature_columnsX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, shuffle=False)scaler = StandardScaler()X_train = scaler.fit_transform(X_train)X_test = scaler.transform(X_test)return X_train, X_test, y_train, y_test, feature_names# 準備數據
X_train, X_test, y_train, y_test, feature_names = prepare_data_for_tabpfn(stock_data)# 初始化并訓練TabPFN模型
model = TabPFNClassifier(device='cpu')
model.fit(X_train, y_train)# 預測(更新的API調用)
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:, 1]  # 獲取正類(上漲)的概率# 評估模型
accuracy = np.mean(y_pred == y_test)
print(f"模型準確率: {accuracy:.4f}")# 查看前10個預測結果
print("\n前10個預測結果:")
for i in range(10):print(f"樣本 {i+1}: 實際={y_test[i]}, 預測={y_pred[i]}, 概率={y_prob[i]:.4f}")

豆包的輸出

原始列名: ['日期', '股票代碼', '開盤', '收盤', '最高', '最低', '成交量', '成交額', '振幅', '漲跌幅', '漲跌額', '換手率']模型準確率: 0.5915前10個預測結果:
樣本 1: 實際=1, 預測=1, 概率=0.6773
樣本 2: 實際=0, 預測=0, 概率=0.4536
樣本 3: 實際=1, 預測=1, 概率=0.5055
樣本 4: 實際=1, 預測=0, 概率=0.4203
樣本 5: 實際=1, 預測=1, 概率=0.6198
樣本 6: 實際=1, 預測=1, 概率=0.6163
樣本 7: 實際=1, 預測=1, 概率=0.5240
樣本 8: 實際=1, 預測=1, 概率=0.5556
樣本 9: 實際=0, 預測=1, 概率=0.5418
樣本 10: 實際=1, 預測=0, 概率=0.4687

躍問表現

只用前面一句prompt不行,它沒像豆包那樣幫著把推理、預測也做了,所以要加上一句

prompt

通過akshare庫,獲取股票數據,并生成TabPFN這個模型 可以識別、處理的格式,寫一個完整的預處理示例,并構建一個預測未來 3 天股價漲跌的分類任務

躍問代碼

# 安裝必要的庫(如果尚未安裝)
# pip install akshare pandas sklearn# 導入必要的庫
import akshare as ak
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score# 設置股票代碼和日期范圍
stock_code = "000001" # 示例股票代碼
start_date = "2023-01-01"
end_date = "2023-12-31"# 獲取歷史日線數據
stock_data = ak.stock_zh_a_hist(symbol=stock_code, start_date=start_date, end_date=end_date, adjust="qfq")# 將數據轉換為DataFrame
df = pd.DataFrame(stock_data)# 查看數據
print(df.head())# 數據預處理
# 將日期字段轉換為日期類型
df["日期"] = pd.to_datetime(df["日期"])# 按日期排序
df = df.sort_values(by="日期")# 計算未來3天的漲跌情況
future_3_day_change = df["收盤價"].shift(-3).sub(df["收盤價"])
df["未來3天漲跌"] = future_3_day_change.apply(lambda x: "漲" if x > 0 else "跌")# 刪除NaN值
df.dropna(subset=["未來3天漲跌"], axis=0, how="any")# 查看排序后的數據
print(df.head())# 保存數據為CSV文件
df.to_csv(f"{stock_code}_daily_data.csv", index=False, encoding="utf-8-sig")
print(f"數據已保存到 {stock_code}_daily_data.csv")# 構建分類任務
# 特征和目標變量
X = df[["開盤價", "最高價", "最低價", "成交量"]]
y = df["未來3天漲跌"]# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 構建隨機森林分類器
clf = RandomForestClassifier(n_estimators=100, random_state=42)# 訓練模型
clf.fit(X_train, y_train)# 預測測試集
y_pred = clf.predict(X_test)# 計算準確率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型準確率為:{accuracy:%.2f}")

這個有報錯,懶得改了

KeyError ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Traceback (most recent call last)
/tmp/ipykernel_35/3161264376.py in <cell line: 0>()
? ? ? 1 # 將日期字段轉換為日期類型
----> 2 df["日期"] = pd.to_datetime(df["日期"])
? ? ? 3?
? ? ? 4 # 按日期排序
? ? ? 5 df = df.sort_values(by="日期")?

修改一次后還有報錯:

AttributeError: 'DataFrame' object has no attribute 'columnss'

放棄了。

?

文心4.5表現

?生成數據集


import akshare as ak
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split# 1. 獲取股票數據
def get_stock_data(stock_code="000001", start_date="20200101", end_date="20250604"):df = ak.stock_zh_a_hist(symbol=stock_code, period="daily", start_date=start_date, end_date=end_date)df['日期'] = pd.to_datetime(df['日期'])df = df.sort_values('日期').reset_index(drop=True)return df# 2. 特征工程
def create_features(df, window=5):# 基礎特征df['return'] = df['收盤'].pct_change()df['volatility'] = df['return'].rolling(window).std()df['ma5'] = df['收盤'].rolling(5).mean()df['ma10'] = df['收盤'].rolling(10).mean()# 技術指標df['rsi'] = compute_rsi(df['收盤'], 14)df['macd'], df['signal'] = compute_macd(df['收盤'])# 未來3天漲跌標簽 (1:漲, 0:跌)df['target'] = (df['收盤'].shift(-3) > df['收盤']).astype(int)# 刪除無效行df = df.dropna().reset_index(drop=True)return df# 3. 技術指標計算函數
def compute_rsi(series, period=14):delta = series.diff()gain = delta.where(delta > 0, 0)loss = -delta.where(delta < 0, 0)avg_gain = gain.rolling(period).mean()avg_loss = loss.rolling(period).mean()rs = avg_gain / avg_lossreturn 100 - (100 / (1 + rs))def compute_macd(series, fast=12, slow=26, signal=9):ema_fast = series.ewm(span=fast).mean()ema_slow = series.ewm(span=slow).mean()macd = ema_fast - ema_slowsignal_line = macd.ewm(span=signal).mean()return macd, signal_line# 4. 數據預處理
def preprocess_data(df):features = df.drop(['日期', '股票代碼', '開盤', '最高', '最低', '收盤', '成交量', '成交額', '振幅', '漲跌幅', '漲跌額', '換手率'], axis=1, errors='ignore')target = df['target']# 標準化from sklearn.preprocessing import StandardScalerscaler = StandardScaler()features_scaled = scaler.fit_transform(features)return features_scaled, target# 5. 主流程
if __name__ == "__main__":# 獲取數據stock_df = get_stock_data("600519")  # 茅臺股票# 特征工程feature_df = create_features(stock_df)# 預處理X, y = preprocess_data(feature_df)# 劃分訓練測試集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False, random_state=42)# 保存為TabPFN可讀格式np.savez('stock_data.npz', X_train=X_train, X_test=X_test, y_train=y_train, y_test=y_test)print("數據預處理完成,已保存為stock_data.npz")

訓練預測

import numpy as np
from tabpfn import TabPFNClassifier# 加載預處理數據
data = np.load('stock_data.npz')
X_train, X_test = data['X_train'], data['X_test']
y_train, y_test = data['y_train'], data['y_test']# 初始化TabPFN
# classifier = TabPFNClassifier(device='cpu', n_estimators=8)
classifier = TabPFNClassifier(device='cuda', n_estimators=8)
N_ensemble_configurations=32
# 訓練模型
classifier.fit(X_train, y_train)# 預測
y_pred = classifier.predict(X_test)
y_prob = classifier.predict_proba(X_test)[:, 1]# 評估
from sklearn.metrics import accuracy_score, roc_auc_score
print(f"測試集準確率: {accuracy_score(y_test, y_pred):.4f}")
print(f"測試集AUC: {roc_auc_score(y_test, y_prob):.4f}")# 預測未來3天漲跌
latest_data = X_test[-1].reshape(1, -1)  # 取最新數據
future_pred = classifier.predict(latest_data)
print(f"未來3天預測結果: {'上漲' if future_pred[0] == 1 else '下跌'}")

?

最終用的是cuda?

輸出結果:

測試集準確率: 1.0000
測試集AUC: 1.0000
未來3天預測結果: 下跌

這個,有點問題吧,這訓練的也太狠了....

總結

當前的AI都不能小瞧了,跟2年前比都有很大提升。

豆包還是比較有趣,它的理解能力不錯,主動性高,但是水平比較平庸。

文心4.5是三者中水平最高的。

躍問,主要是在pandas處理數據那塊就出問題了,再修改了一次之后,我就放棄了。

調試

發現幾個ai都碰到了這個錯誤

TypeError ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Traceback (most recent call last)
/tmp/ipykernel_35/4228700019.py in <cell line: 0>()
? ? ? 8?
? ? ? 9 # 初始化TabPFN
---> 10 classifier = TabPFNClassifier(device='cpu', N_ensemble_configurations=32)
? ? ?11?
? ? ?12 # 訓練模型

TypeError: TabPFNClassifier.__init__() got an unexpected keyword argument 'N_ensemble_configurations'

通過help(TabPFNClassifier) ,看到應該是:

n_estimators

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908106.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908106.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908106.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[藍橋杯]最大化股票交易的利潤

最大化股票交易的利潤 題目描述 實現一個算法尋找最大化股票交易利潤的策略。介紹如下&#xff1a; 股票價格每天都在變化&#xff0c;以數組的索引表示交易日&#xff0c;以數組的元素表示每天的股票價格。可以通過買入和賣出獲得利潤。一天只能進行一次買入或賣出操作&…

URL 結構說明+路由(接口)的認識

一、URL 結構說明 以這個為例&#xff1a;http://127.0.0.1:5000/zhouleifeng 1.組成部分: http://&#xff1a;協議 127.0.0.1&#xff1a;主機&#xff08;本地地址&#xff09; :5000&#xff1a;端口號&#xff08;Flask 默認 5000&#xff09; /zhouleifeng&#xff1a…

微服務商城-用戶微服務

數據表 用戶表 CREATE DATABASE user; USE user;CREATE TABLE user (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 用戶ID,username varchar(50) NOT NULL DEFAULT COMMENT 用戶名,password varchar(50) NOT NULL DEFAULT COMMENT 用戶密碼&#xff0c;MD5加密…

Java面試題及答案整理( 2025年最新版,持續更新...)

最近發現網上很多Java面試題都沒有答案&#xff0c;所以花了很長時間搜集整理出來了這套Java面試題大全&#xff0c;希望大家能夠喜歡&#xff01; 注&#xff1a;篇幅有限&#xff0c;資料已整理成文檔&#xff0c;后臺si我666&#xff0c;我一個個發&#xff01; 這套面試文…

[論文閱讀]PPT: Backdoor Attacks on Pre-trained Models via Poisoned Prompt Tuning

PPT: Backdoor Attacks on Pre-trained Models via Poisoned Prompt Tuning PPT: Backdoor Attacks on Pre-trained Models via Poisoned Prompt Tuning | IJCAI IJCAI-22 發表于2022年的論文&#xff0c;當時大家還都在做小模型NLP的相關工作&#xff08;BERT&#xff0c;Ro…

Redis最佳實踐——性能優化技巧之集群與分片

Redis集群與分片在電商應用中的性能優化技巧 一、Redis集群架構模式解析 1. 主流集群方案對比 方案核心原理適用場景電商應用案例主從復制讀寫分離數據冗余中小規模讀多寫少商品詳情緩存Redis Sentinel自動故障轉移監控高可用需求場景訂單狀態緩存Redis Cluster原生分布式分片…

Vue 生命周期全解析:從創建到銷毀的完整旅程

Vue 生命周期是每個 Vue 開發者必須深入理解的核心概念之一。它定義了組件從創建、掛載、更新、銷毀的整個過程&#xff0c;以及在這個過程中各個階段提供的鉤子函數。掌握生命周期不僅能幫助你理解 Vue 的工作原理&#xff0c;還能讓你在合適的時機執行特定的操作&#xff0c;…

【Rust 高級trait】Rust trait的一些高級用法解密

?? 歡迎大家來到景天科技苑?? &#x1f388;&#x1f388; 養成好習慣&#xff0c;先贊后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者簡介&#xff1a;景天科技苑 &#x1f3c6;《頭銜》&#xff1a;大廠架構師&#xff0c;華為云開發者社區專家博主&#xff0c;…

聯想電腦護眼衛士與系統顏色配置(X-Rite)沖突 | 顯示設置頻繁變換色階 - 解決方案

聯想電腦護眼衛士與系統顏色配置X-Rite沖突 | 顯示設置頻繁變換色階 - 解決方案 前言方案1&#xff1a;解決聯想護眼衛士方案2&#xff1a;解決系統顏色配置(X-Rite) 前言 自帶X-Rite軟件的聯想電腦&#xff08;以拯救者Y9000P&#xff0c;Win11系統為例&#xff09;&#xff…

MySQL中SELECT查詢的執行順序

MySQL中SELECT查詢的執行順序 在日常的數據庫開發中&#xff0c;我們經常會寫各種復雜的SELECT查詢語句。然而&#xff0c;很多開發者對于MySQL實際執行這些查詢的順序并不完全了解。理解查詢的執行順序不僅有助于編寫更高效的SQL語句&#xff0c;還能幫助我們更好地優化查詢性…

es 的字段類型(text和keyword)

Text 當一個字段是要被全文檢索時&#xff0c;比如 Email 內容、產品描述&#xff0c;這些字段應該使用 text 類型。設置 text 類型以后&#xff0c;字段內容會被分析&#xff0c;在生成倒排索引之前&#xff0c;字符串會被分析器分詞。text類型的字段不用于排序&#xff0c;很…

MySQL安裝及啟用詳細教程(Windows版)

MySQL安裝及啟用詳細教程&#xff08;Windows版&#xff09; &#x1f4cb; 概述 本文檔將詳細介紹MySQL數據庫在Windows系統下的下載、安裝、配置和啟用過程。 &#x1f4e5; MySQL下載 官方下載地址 官方網站: https://dev.mysql.com/downloads/社區版本: https://dev.my…

Linux下使用nmcli連接網絡

Linux下使用nmcli連接網絡 介紹 在使用ubuntu系統的時候&#xff0c;有時候不方便使用桌面&#xff0c;使用ssh遠程連接&#xff0c;可能需要使用nmcli命令來連接網絡。本文將介紹如何使用nmcli命令連接網絡。nmcli 是 NetworkManager 的命令行工具&#xff0c;用于管理網絡連…

Python----循環神經網絡(BiLSTM:雙向長短時記憶網絡)

一、LSTM 與 BiLSTM對比 1.1、LSTM LSTM&#xff08;長短期記憶網絡&#xff09; 是一種改進的循環神經網絡&#xff08;RNN&#xff09;&#xff0c;專門解決傳統RNN難以學習長期依賴的問題。它通過遺忘門、輸入門和輸出門來控制信息的流動&#xff0c;保留重要信息并丟棄無關…

U盤掛載Linux

在 只能使用 Telnet 的情況下&#xff0c;如果希望通過 U盤 傳輸文件到 Linux 系統&#xff0c;可以按照以下步驟操作&#xff1a; &#x1f4cc; 前提條件 U盤已插入 Linux 主機的 USB 接口。Linux 主機支持自動掛載 U盤&#xff08;大多數現代發行版默認支持&#xff09;。T…

QuickBASIC QB64 支持 64 位系統和跨平臺Linux/MAC OS

QuickBASIC 的現代繼任者 QB64 已發展成為一個功能強大的開源項目&#xff0c;支持 64 位系統和跨平臺開發。以下是詳細介紹&#xff1a; 項目首頁 - QB64pe:The QB64 Phoenix Edition Repository - GitCode https://gitcode.com/gh_mirrors/qb/QB64pe 1. QB64 概述 官網&am…

【C++高級主題】命令空間(五):類、命名空間和作用域

目錄 一、實參相關的查找&#xff08;ADL&#xff09;&#xff1a;函數調用的 “智能搜索” 1.1 ADL 的核心規則 1.2 ADL 的觸發條件 1.3 ADL 的典型應用場景 1.4 ADL 的潛在風險與規避 二、隱式友元聲明&#xff1a;類與命名空間的 “私密通道” 2.1 友元聲明的基本規則…

免費開源Umi-OCR,離線使用,批量精準!

Umi-OCR&#xff08;Windows端&#xff09; Umi-OCR 是一款在 GitHub 上開源的免費 OCR 識別軟件&#xff0c;它最大的亮點就是免費、開源、支持批量處理&#xff0c;而且識別準確度很高。這款軟件不需要聯網就能用&#xff0c;非常值得推薦&#xff01; 在 OCR 識別功能方面&…

深入剖析 Docker 容器化原理與實戰應用,開啟技術新征程!

文章目錄 前言一、為什么 是Docker &#xff1f;二、Docker 容器化原理分析2.1 鏡像&#xff08;Image&#xff09;2.2 容器&#xff08;Container&#xff09;2.3 倉庫&#xff08;Registry&#xff09; 三、Docker 容器化實踐3.1 Docker安裝3.2 創建一個 Docker 鏡像3.3 運行…

黑馬程序員TypeScript課程筆記—class篇

class的基本使用 class的構造函數&#xff08;實現實例屬性的初始化&#xff09; 在使用構造函數的時候&#xff0c;小括號的后面不要指定類型&#xff0c;否則就會報錯&#xff0c;因為構造函數沒有返回值 class實例方法 class繼承&#xff08;extends&#xff09; class繼承…