深度學習在金融領域的應用日益廣泛,尤其在股票價格預測方面展現出相當的潛力。本文以 Tesla 股票價格為例,示範如何運用 TensorFlow 與 PySpark 構建一個深度學習迴歸模型,並進行訓練和評估。首先,我們使用 PySpark 讀取和預處理股票歷史資料,包含開盤價、最高價、最低價、收盤價和交易量等特徵。接著,利用 TensorFlow 建立一個多層感知器模型,並使用預處理後的資料進行訓練。模型訓練過程中,我們採用標準化特徵和隨機分割資料集的方式,以提高模型的泛化能力。最後,我們評估模型的預測效能,並將預測結果與實際值進行比較,以 matplotlib 繪製圖表,更直觀地展現模型的預測效果。程式碼中也示範瞭如何使用 logging 模組記錄訓練過程中的關鍵指標,方便監控和除錯。
比較與繪製實際值與預測值
以下指令碼執行以下操作:
• 從包含股票價格資料的CSV檔案載入測試資料
• 使用從tesla_stock_price_prediction模組匯入的preprocess_data函式對資料進行預處理,透過縮放特徵
• 使用PyTorch定義神經網路模型架構
• 從檔案載入預訓練的模型權重
• 使用載入的模型對預處理後的測試資料進行預測
• 將前十個實際和預測的股票價格並排列印出來
• 將所有實際和預測值繪製在折線圖上以進行視覺化
程式碼實作
import torch
import numpy as np
import matplotlib.pyplot as plt
from tesla_stock_price_prediction import (
load_data,
preprocess_data
)
def main():
"""
載入測試資料、預處理,並使用預訓練模型進行預測。
此函式從CSV檔案載入測試資料,進行預處理,載入預訓練的PyTorch模型,
對測試資料進行預測,並視覺化實際與預測的股票價格。
"""
test_data_file_path = "/home/ubuntu/airflow/dags/TSLA_stock.csv"
test_data = load_data(test_data_file_path)
test_data = preprocess_data(test_data)
test_features = test_data.select('scaled_features').collect()
test_features = np.array(
[
row.scaled_features.toArray()
for row in test_features
],
dtype=np.float64
)
input_size = 4
output_size = 1
model = torch.nn.Sequential(
torch.nn.Linear(input_size, 64),
torch.nn.ReLU(),
torch.nn.Linear(64, 32),
torch.nn.ReLU(),
torch.nn.Linear(32, 16),
torch.nn.ReLU(),
torch.nn.Linear(16, output_size)
)
model.load_state_dict(
torch.load(
'/home/ubuntu/airflow/dags/trained_model.pth',
map_location=torch.device('cpu')
)
)
model.eval()
test_features_tensor = torch.tensor(test_features, dtype=torch.float64)
model = model.double()
with torch.no_grad():
predictions = model(test_features_tensor).squeeze().numpy()
actual_labels = test_data.select('Close').collect()
actual_labels = np.array(
[
row.Close for row in actual_labels
],
dtype=np.float64
)
actual_labels = actual_labels[::-1]
predictions = predictions[::-1]
print("前10個實際值與預測值:")
print("實際值\t預測值")
for i in range(10):
print(f"{actual_labels[i]:.4f}\t{predictions[i]:.4f}")
plt.figure(figsize=(10, 6))
plt.plot(actual_labels, label='實際值')
plt.plot(predictions, label='預測值')
plt.xlabel('索引')
plt.ylabel('價格')
plt.title('實際與預測的Tesla股票價格(2019年2月26日至2024年2月23日)')
plt.legend()
plt.grid(True)
plt.show()
if __name__ == "__main__":
main()
內容解密:
load_data和preprocess_data函式:這兩個函式用於載入和預處理測試資料。load_data從指定的CSV檔案路徑載入資料,而preprocess_data則對載入的資料進行縮放特徵等預處理操作。- 神經網路模型定義:使用PyTorch的
torch.nn.Sequential定義了一個具有多層線性轉換和ReLU啟用函式的神經網路模型,用於學習輸入特徵與輸出股票價格之間的複雜關係。 - 模型權過載入:透過
model.load_state_dict方法載入預訓練的模型權重,使模型具備預測股票價格的能力。 - 預測與視覺化:對測試資料進行預測後,將實際值與預測值進行比較,並透過折線圖視覺化展示兩者之間的差異,以便直觀評估模型的效能。
使用TensorFlow進行迴歸任務
在前一章中,我們使用PyTorch訓練和評估了一個迴歸模型,並用它來預測Tesla的每日股票價格。本章節將展示如何使用TensorFlow複製相同的過程,並使用相同的資料集直接比較兩個框架下模型的效能。
資料集介紹
我們將使用從Yahoo! Finance下載的Tesla股票歷史資料集,該資料集包含從2019年2月26日至2024年2月23日的每日交易資料,共1,258個觀測值。每個交易日記錄了開盤價、最高價、最低價、收盤價和交易量等關鍵指標。
資料集範例
| 日期 | 開盤價 | 最高價 | 最低價 | 收盤價 | 交易量 | |
-|
–|
–|
–|
–|
–| | 2024-02-23 | 195.31 | 197.57 | 191.50 | 191.97 | 78,670,300 | | 2024-02-22 | 194.00 | 198.32 | 191.36 | 197.41 | 92,739,500 | | … | … | … | … | … | … |
TensorFlow模型構建與訓練
本章節將詳細介紹如何使用TensorFlow構建、訓練和評估迴歸模型,並與PyTorch模型的結果進行比較,以評估不同深度學習框架在相同任務下的表現。
程式碼實作(待補充)
此部分將展示使用TensorFlow實作迴歸模型的程式碼範例,包括資料預處理、模型定義、訓練和評估等步驟。
內容解密(待補充)
此部分將詳細解說TensorFlow實作中每個程式碼段的作用、相關技術原理以及實務上的考量。
使用TensorFlow預測Tesla股票價格
本章節將利用先前所建立的資料集,實作深度學習演算法以預測Tesla的股票價格。該資料集包含了開盤價(Open)、最高價(High)、最低價(Low)以及交易量(Volume)等重要特徵,並將收盤價(Close)作為目標變數。透過將這些特徵納入我們的預測模型中,我們能夠有效捕捉市場的基本動態,如開盤情緒和交易活動,以及技術層面,如價格波動和交易區間,這些對於準確的股票價格預測至關重要。
值得注意的是,我們的模型旨在展示基本概念,而非窮盡所有可能性。雖然目前的特徵集提供了寶貴的見解,但加入額外的特徵,如技術指標、基本面資料或市場情緒,可能會進一步增強模型的預測能力。然而,這些改進超出了本章的範圍。
資料處理與模型訓練流程
為了促進資料處理,我們利用PySpark的分散式計算能力,而TensorFlow則用於構建和訓練神經網路模型。Python程式碼實作了從資料載入到模型評估的端對端工作流程。在第8章中,我們將展示如何使用Apache Airflow佈署此程式碼。
程式碼解析
import logging
import numpy as np
import tensorflow as tf
from pyspark.sql import SparkSession
from pyspark.ml.feature import VectorAssembler, StandardScaler
from sklearn.metrics import r2_score
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import matplotlib.pyplot as plt
內容解密:
import logging: 用於啟用日誌功能,能夠記錄執行過程中的資訊、警告和錯誤。在後續的程式碼中,日誌模組將用於記錄測試損失和R2分數,並在發生異常時記錄錯誤。import numpy as np: 將NumPy模組別名設為np,便於參照。NumPy將用於陣列操作和數學運算,特別是在TSLARegressor類別的convert_to_numpy()方法中,將Spark DataFrames轉換為NumPy陣列以進行進一步處理。import tensorflow as tf: 引入TensorFlow深度學習框架,用於構建、訓練和評估神經網路模型。它將用於建立Sequential模型及其層、編譯模型、訓練模型以及評估模型效能。from pyspark.sql import SparkSession: 從pyspark.sql模組匯入SparkSession類別,用於建立SparkSession物件。在程式碼中,SparkSession物件將用於執行Spark相關操作,如從CSV檔案讀取資料和建立Spark DataFrames。from pyspark.ml.feature import VectorAssembler, StandardScaler: 從pyspark.ml.feature模組匯入VectorAssembler和StandardScaler類別,用於特徵工程和預處理。在preprocess_data()方法中,這些類別將用於組裝特徵向量並標準化特徵,以便訓練模型。from sklearn.metrics import r2_score: 從sklearn.metrics模組匯入r2_score函式,用於計算R平方分數,這是一種評估迴歸模型效能的指標。在predict_and_evaluate()方法中,r2_score將用於計算已訓練模型的R2分數。from tensorflow.keras.models import Sequential: 從tensorflow.keras.models模組匯入Sequential類別,用於在TensorFlow Keras中建立順序神經網路模型。
導向物件的設計方法
本章採用導向物件的方法論,引入了一個名為TSLARegressor的類別,作為組織和協調對TSLA股票價格進行迴歸分析的各種功能的中心樞紐。在這個類別中,每個方法都專注於迴歸工作流程中的特定任務,包括資料載入、特徵預處理、模型建立和訓練、效能評估以及預測生成。
類別設計的好處
透過將這些功能封裝在類別中,我們增強了程式碼的模組化、可讀性和可重用性。這種結構化的方法簡化了迴歸分析工作流程的開發和維護。此外,利用類別使我們能夠實作更好的程式碼組織和抽象,從而在專案發展過程中更輕鬆地進行管理和擴充套件。
步驟與實作細節
我們的模型實作步驟包括:
- 匯入必要的函式庫
- 設定日誌
- 載入資料
- 資料預處理
- 建立資料載入器
- 訓練模型
- 評估模型效能
- 主函式執行
程式碼細節與邏輯解析
後續章節將詳細介紹這些步驟的實作細節,包括具體的程式碼範例和邏輯解析,以幫助讀者深入理解整個流程。
TensorFlow深度學習在股票價格迴歸分析的應用
在股票市場分析中,深度學習技術被廣泛應用於預測股票價格走勢。本文將介紹如何使用TensorFlow構建一個深度學習模型,以Tesla(TSLA)股票價格為例,進行迴歸分析。
匯入必要的函式庫
首先,我們需要匯入必要的Python函式庫,包括TensorFlow、PySpark、NumPy和Matplotlib。這些函式庫將用於資料處理、模型構建和結果視覺化。
程式碼解析:
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import matplotlib.pyplot as plt
內容解密:
import tensorflow as tf:匯入TensorFlow函式庫並賦予別名tf,用於構建和訓練深度學習模型。from tensorflow.keras.models import Sequential:從TensorFlow的Keras模組中匯入Sequential模型,用於定義神經網路模型的架構。from tensorflow.keras.layers import Dense:匯入Dense層類別,用於新增全連線層到神經網路模型中。import matplotlib.pyplot as plt:匯入Matplotlib的pyplot模組,用於建立資料視覺化圖表。
定義TSLARegressor類別
接下來,我們定義一個名為TSLARegressor的類別,該類別封裝了資料載入、預處理、模型建立、訓練、評估和預測等方法。
程式碼解析:
class TSLARegressor:
def __init__(self):
self.logger = logging.getLogger(__name__)
self.spark = SparkSession.builder.appName("TSLA_Regression").getOrCreate()
self.input_shape = None
self.model = None
內容解密:
class TSLARegressor::定義一個名為TSLARegressor的類別,用於執行TSLA股票價格迴歸分析。def __init__(self)::初始化方法,當建立TSLARegressor物件時自動呼叫。self.logger = logging.getLogger(__name__):建立一個記錄器,用於記錄程式碼執行過程中的資訊、警告和錯誤。self.spark = SparkSession.builder.appName("TSLA_Regression").getOrCreate():建立一個SparkSession物件,用於Spark相關操作,如讀取CSV檔案和建立Spark DataFrames。
資料預處理
在這一步中,我們定義了preprocess_data方法,用於對資料進行預處理,包括讀取CSV檔案、特徵匯總和特徵縮放。
程式碼解析:
def preprocess_data(self, file_path, feature_cols=['Open', 'High', 'Low', 'Volume'], train_ratio=0.8, seed=42):
df = self.spark.read.csv(file_path, header=True, inferSchema=True)
assembler = VectorAssembler(inputCols=feature_cols, outputCol='features')
df = assembler.transform(df)
scaler = StandardScaler(inputCol='features', outputCol='scaled_features', withMean=True, withStd=True)
scaler_model = scaler.fit(df)
df = scaler_model.transform(df)
train_df, test_df = df.randomSplit([train_ratio, 1-train_ratio], seed=seed)
return train_df, test_df
內容解密:
df = self.spark.read.csv(file_path, header=True, inferSchema=True):讀取CSV檔案到Spark DataFrame中。assembler = VectorAssembler(inputCols=feature_cols, outputCol='features'):建立一個VectorAssembler物件,用於將指定的特徵欄位合併成一個特徵向量欄位。scaler = StandardScaler(inputCol='features', outputCol='scaled_features', withMean=True, withStd=True):建立一個StandardScaler物件,用於對特徵向量進行標準化縮放。
透過上述步驟,我們完成了資料預處理,為後續的模型訓練和評估做好了準備。接下來的步驟將介紹如何使用TensorFlow構建和訓練神經網路模型,以進行TSLA股票價格的迴歸分析。