返回文章列表

TensorFlow深度學習股票價格迴歸分析

本文利用 TensorFlow 和 PySpark 構建深度學習模型,以 Tesla 股票價格為例進行迴歸分析,涵蓋資料預處理、模型訓練、評估與視覺化。程式碼範例展示瞭如何使用 PySpark 載入和預處理資料,利用 TensorFlow 建立和訓練神經網路模型,並使用 matplotlib

機器學習 金融科技

深度學習在金融領域的應用日益廣泛,尤其在股票價格預測方面展現出相當的潛力。本文以 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()

內容解密:

  1. load_datapreprocess_data函式:這兩個函式用於載入和預處理測試資料。load_data從指定的CSV檔案路徑載入資料,而preprocess_data則對載入的資料進行縮放特徵等預處理操作。
  2. 神經網路模型定義:使用PyTorch的torch.nn.Sequential定義了一個具有多層線性轉換和ReLU啟用函式的神經網路模型,用於學習輸入特徵與輸出股票價格之間的複雜關係。
  3. 模型權過載入:透過model.load_state_dict方法載入預訓練的模型權重,使模型具備預測股票價格的能力。
  4. 預測與視覺化:對測試資料進行預測後,將實際值與預測值進行比較,並透過折線圖視覺化展示兩者之間的差異,以便直觀評估模型的效能。

使用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

內容解密:

  1. import logging 用於啟用日誌功能,能夠記錄執行過程中的資訊、警告和錯誤。在後續的程式碼中,日誌模組將用於記錄測試損失和R2分數,並在發生異常時記錄錯誤。
  2. import numpy as np 將NumPy模組別名設為np,便於參照。NumPy將用於陣列操作和數學運算,特別是在TSLARegressor類別的convert_to_numpy()方法中,將Spark DataFrames轉換為NumPy陣列以進行進一步處理。
  3. import tensorflow as tf 引入TensorFlow深度學習框架,用於構建、訓練和評估神經網路模型。它將用於建立Sequential模型及其層、編譯模型、訓練模型以及評估模型效能。
  4. from pyspark.sql import SparkSession 從pyspark.sql模組匯入SparkSession類別,用於建立SparkSession物件。在程式碼中,SparkSession物件將用於執行Spark相關操作,如從CSV檔案讀取資料和建立Spark DataFrames。
  5. from pyspark.ml.feature import VectorAssembler, StandardScaler 從pyspark.ml.feature模組匯入VectorAssembler和StandardScaler類別,用於特徵工程和預處理。在preprocess_data()方法中,這些類別將用於組裝特徵向量並標準化特徵,以便訓練模型。
  6. from sklearn.metrics import r2_score 從sklearn.metrics模組匯入r2_score函式,用於計算R平方分數,這是一種評估迴歸模型效能的指標。在predict_and_evaluate()方法中,r2_score將用於計算已訓練模型的R2分數。
  7. 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

內容解密:

  1. import tensorflow as tf:匯入TensorFlow函式庫並賦予別名tf,用於構建和訓練深度學習模型。
  2. from tensorflow.keras.models import Sequential:從TensorFlow的Keras模組中匯入Sequential模型,用於定義神經網路模型的架構。
  3. from tensorflow.keras.layers import Dense:匯入Dense層類別,用於新增全連線層到神經網路模型中。
  4. 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

內容解密:

  1. class TSLARegressor::定義一個名為TSLARegressor的類別,用於執行TSLA股票價格迴歸分析。
  2. def __init__(self)::初始化方法,當建立TSLARegressor物件時自動呼叫。
  3. self.logger = logging.getLogger(__name__):建立一個記錄器,用於記錄程式碼執行過程中的資訊、警告和錯誤。
  4. 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

內容解密:

  1. df = self.spark.read.csv(file_path, header=True, inferSchema=True):讀取CSV檔案到Spark DataFrame中。
  2. assembler = VectorAssembler(inputCols=feature_cols, outputCol='features'):建立一個VectorAssembler物件,用於將指定的特徵欄位合併成一個特徵向量欄位。
  3. scaler = StandardScaler(inputCol='features', outputCol='scaled_features', withMean=True, withStd=True):建立一個StandardScaler物件,用於對特徵向量進行標準化縮放。

透過上述步驟,我們完成了資料預處理,為後續的模型訓練和評估做好了準備。接下來的步驟將介紹如何使用TensorFlow構建和訓練神經網路模型,以進行TSLA股票價格的迴歸分析。