嘗試不寫任何代碼完全交由chatgpt做一個股票預測模型之第二部曲

更新於 發佈於 閱讀時間約 22 分鐘
投資理財內容聲明
raw-image

好的看他說得一口像資料科學家一樣我就照著她說的做

raw-image

好的取得完數據之後我們照他說得考慮政治因素市場情緒

raw-image
import yfinance as yf
import pandas as pd
import numpy as np
import datetime as dt
import requests

# 設定要取得的股票代碼和時間範圍
ticker = "AAPL"
start_date = dt.datetime(2016, 1, 1)
end_date = dt.datetime(2021, 12, 31)

# 使用 yfinance 取得股票價格資料
df = yf.download(ticker, start=start_date, end=end_date)

# 新增其他相關數據欄位
# 市場情緒:VIX波動率指數
vix_url = "https://fred.stlouisfed.org/graph/fredgraph.csv?id=VIXCLS"
vix_df = pd.read_csv(vix_url, index_col=0, parse_dates=True)
df = pd.merge(df, vix_df, how='left', left_index=True, right_index=True)

# 政治因素:美國總統就職日期
inauguration_dates = {
'Trump': '2017-01-20',
'Biden': '2021-01-20'
}
df['Inauguration'] = np.nan
for president, date in inauguration_dates.items():
inauguration = pd.to_datetime(date)
df['Inauguration'][df.index >= inauguration] = president

# 移除缺失值
df = df.dropna()

# 儲存處理後的資料
df.to_csv('stock_data.csv')

ok他給了我VIX波動率指數和美國總統就職日期

再來看看他能不能幫忙做特徵轉換和特徵工程

raw-image
import pandas as pd
from sklearn.preprocessing import StandardScaler

# 讀取資料
df = pd.read_csv('stock_data.csv', index_col=0)

# 將 Inauguration 欄位做 label encoding
df['Inauguration'] = df['Inauguration'].map({'Trump': 0, 'Biden': 1})

# 計算收盤價的一階差分
df['Close_diff'] = df['Adj Close'].diff()

# 計算 VIX 的 5 日移動平均值
df['VIX_5MA'] = df['VIXCLS'].rolling(window=5).mean()

# 將數據標準化
scaler = StandardScaler()
df_scaled = pd.DataFrame(scaler.fit_transform(df), index=df.index, columns=df.columns)

# 計算收盤價的未來一天差分
df_scaled['Close_diff_shifted'] = df_scaled['Close_diff'].shift(-1)

# 刪除最後一列缺失值
df_scaled = df_scaled[:-1]

# 儲存處理後的資料
df_scaled.to_csv('processed_data.csv')

看起來不錯他對數據轉換,標準化,encoding都會

還算了一下收盤價的一階差分當作特徵工程項

不過過程中其實有些許錯誤我自己跳下去修改了一下之後

把整段代碼貼上補一句問他

raw-image
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import Dense, LSTM, Dropout

# 讀取資料
df = pd.read_csv('processed_data.csv', index_col=0)

# 分割訓練集和測試集
train_size = int(len(df) * 0.7)
train_data = df.iloc[:train_size, :]
test_data = df.iloc[train_size:, :]

# 標準化數據
scaler = MinMaxScaler()
train_data_scaled = scaler.fit_transform(train_data)
test_data_scaled = scaler.transform(test_data)

# 設定時間窗口大小
window_size = 30

# 創建 X_train 和 y_train
X_train, y_train = [], []
for i in range(window_size, len(train_data_scaled)):
X_train.append(train_data_scaled[i-window_size:i, :])
y_train.append(train_data_scaled[i, -2])
X_train, y_train = np.array(X_train), np.array(y_train)

# 創建 LSTM 模型
model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(Dropout(0.2))
model.add(LSTM(units=50, return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(units=50))
model.add(Dropout(0.2))
model.add(Dense(units=1))

# 編譯模型
model.compile(optimizer='adam', loss='mean_squared_error')

# 訓練模型
model.fit(X_train, y_train, epochs=50, batch_size=32)

# 預測未來的股價
inputs = df.iloc[len(df)-len(test_data)-window_size:, :].values
inputs = scaler.transform(inputs)
X_test = []
for i in range(window_size, len(inputs)):
X_test.append(inputs[i-window_size:i, :])
X_test = np.array(X_test)
predicted_price = model.predict(X_test)
predicted_price = scaler.inverse_transform(predicted_price)

# 視覺化結果
import matplotlib.pyplot as plt
plt.plot(test_data['Adj Close'].values, color='red', label='Actual Price')
plt.plot(predicted_price, color='blue', label='Predicted Price')
plt.title('Stock Price Prediction')
plt.xlabel('Time')
plt.ylabel('Stock Price')
plt.legend()
plt.show()

到這邊就出現問題了

y_train.append(train_data_scaled[i, -2])#不是我要預測的 y 收盤價欄位
for i in range(window_size, len(train_data_scaled)):
X_train.append(train_data_scaled[i-window_size:i, :])
#這一段也很怪應該改成
for i in range(0, len(inputs)-window_size):
X_train.append(train_data_scaled[i:i+window_size, :])
raw-image

看來他搞混了我的預測目標是明天收盤價,而不是收盤價的差分

大概做到這邊就極限了他開始胡言亂語

後面出現神經網路內部架構的錯誤

raw-image

好吧我只能親手動手來了,不過他倒是提供了一個很好的藍圖

最終結果算是我跟chatgpt協作的成果

import yfinance as yf
import pandas as pd
import numpy as np
import datetime as dt
import requests
from textblob import TextBlob
from sklearn.preprocessing import LabelEncoder

# 設定要取得的股票代碼和時間範圍
ticker = "AAPL"
start_date = dt.datetime(2013, 1, 18)
end_date = dt.datetime(2023, 2, 18)

# 使用 yfinance 取得股票價格資料
df = yf.download(ticker, start=start_date, end=end_date)

# 新增其他相關數據欄位
# 市場情緒:VIX波動率指數
vix_url = "https://fred.stlouisfed.org/graph/fredgraph.csv?id=VIXCLS"
vix_df = pd.read_csv(vix_url, index_col=0, parse_dates=True)
df = pd.merge(df, vix_df, how='left', left_index=True, right_index=True)

# 政治因素:美國總統就職日期
inauguration_dates = {
'Trump': '2017-01-20',
'Biden': '2021-01-20'
}
df['Inauguration'] = np.nan
for president, date in inauguration_dates.items():
inauguration = pd.to_datetime(date)
df['Inauguration'][df.index >= inauguration] = president
le = LabelEncoder()
df['Inauguration'] = le.fit_transform(df['Inauguration'].astype(str))


# 儲存處理後的資料
df.to_csv('stock_data.csv')
import pandas as pd
from sklearn.preprocessing import StandardScaler

# 讀取資料
df = pd.read_csv('stock_data.csv', index_col=0)

# 計算收盤價的一階差分
df['Close_diff'] = df['Adj Close'].diff()

# 計算 VIX 的 5 日移動平均值
df['VIX_5MA'] = df['VIXCLS'].rolling(window=5).mean()

# 計算收盤價的未來一天差分
df['Close_diff_shifted'] = df['Close_diff'].shift(-1)

# 計算未來一天收盤價
df['Close_Tomorrow'] = df['Close'].shift(-1)

df = df.dropna()
df_processed = df

# 儲存處理後的資料
df_processed.to_csv('processed_data.csv')
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import Dense, LSTM, Dropout

# 讀取資料
df = pd.read_csv('processed_data.csv', index_col=0)

# 分割訓練集和測試集
train_size = int(len(df) * 0.7)
train_data = df.iloc[:train_size, :]
test_data = df.iloc[train_size:, :]

# 標準化數據
scaler = MinMaxScaler()
train_data_scaled = scaler.fit_transform(train_data)
test_data_scaled = scaler.transform(test_data)

# y各自做特徵縮放
y_max = df['Close_Tomorrow'].max()
y_min = df['Close_Tomorrow'].min()
train_data_scaled[:,-1] = (train_data['Close_Tomorrow'].values-y_min)/(y_max-y_min)
test_data_scaled[:,-1] = (test_data['Close_Tomorrow'].values-y_min)/(y_max-y_min)

def inverse_transform_y(y):
y *= (y_max-y_min)
y += y_min
return y

# 設定時間窗口大小
window_size = 30

# 創建 X_train 和 y_train
X_train, y_train = [], []
for i in range(0,len(train_data_scaled)-window_size):
X_train.append(train_data_scaled[i:i+window_size, :])
y_train.append(train_data_scaled[i+window_size, -1])
X_train, y_train = np.array(X_train), np.array(y_train)

# 創建 LSTM 模型
model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(Dropout(0.2))
model.add(LSTM(units=50, return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(units=50))
model.add(Dense(units=1))

# 編譯模型
model.compile(optimizer='adam', loss='mean_squared_error')

# 訓練模型
model.fit(X_train, y_train, epochs=10, batch_size=32)

# 預測未來的股價
inputs = df.iloc[len(df)-len(test_data)-window_size:, :].values
inputs = scaler.transform(inputs)
X_test = []
for i in range(window_size, len(inputs)):
X_test.append(inputs[i-window_size:i, :])
X_test = np.array(X_test)

train_predicted_price = inverse_transform_y(model.predict(X_train))
test_predicted_price = inverse_transform_y(model.predict(X_test))

# 視覺化結果
import matplotlib.pyplot as plt
plt.plot(train_data['Close_Tomorrow'].values, color='red', label='Actual Price(train)')
plt.plot(train_predicted_price, color='blue', label='Predicted Price(train)')
plt.title('Stock Price Prediction')
plt.xlabel('Time')
plt.ylabel('Stock Price')
plt.legend()
plt.show()

plt.plot(test_data['Close_Tomorrow'].values, color='red', label='Actual Price(test)')
plt.plot(test_predicted_price, color='blue', label='Predicted Price(test)')
plt.title('Stock Price Prediction')
plt.xlabel('Time')
plt.ylabel('Stock Price')
plt.legend()
plt.show()
raw-image

這就是照著chatgpt的思路(考量政治因素市場情緒)搞出的一個股價預測模型

大概在前幾年就看過許多人這樣搞這種LSTM然後抓股價開高收低量

這種文章在網路上滿天飛

CHATGPT可能在訓練資料集有看過相關的文章

唯一有幫助的是我要他製作一些市場情緒政治因素的特徵

說真的我還真的不會做,他還知道要去哪個URL撈市場情緒:VIX波動率指數

# 市場情緒:VIX波動率指數
vix_url = "https://fred.stlouisfed.org/graph/fredgraph.csv?id=VIXCLS"
vix_df = pd.read_csv(vix_url, index_col=0, parse_dates=True)
df = pd.merge(df, vix_df, how='left', left_index=True, right_index=True)

如果是chatgpt出來以前的時代大概要花一些時間google才找到的

什麼是市場情緒特徵,然後理解什麼是VIX指標,之後再研究怎麼用python下載

和現有程式做整合而CHATGPT出來後只要問他他馬上可以把

VIX指標的URL給出來並自動merge到df裡當作一項特徵,算是很大的幫助

最後來看一下表現:

raw-image

test r2_score 0.59 左右看來有點準但又不是太準,但是方向抓得出來

總結

我可以看到chatgpt是一個超級強大的助手,特別是對於像我這樣的內容創作者。過去身為一個工程師我常常為一篇文章編寫大量代碼,但在這篇文章中,我的工作量其實減少許多。大部份代碼都由chatgpt完成,確實是一個不錯的工具

感謝您的閱讀,希望您喜歡這篇文章!

如果您想要來支持我的內容創作那麼您可以用

PayPal

請我喝杯咖啡讓我更有創作的熱情跟動力🙂

留言
avatar-img
留言分享你的想法!
李咏謙-avatar-img
2023/12/13
請問這能做出更長時間的預測嗎~
avatar-img
于正龍(Ricky)的沙龍
36會員
57內容數
人工智能工作經驗跟研究
2025/03/05
你做錯了。你剛剛發給 ChatGPT 的「寫一個函式來……」的提示?刪掉它吧。這些通用提示就是為什麼你的編碼速度還跟其他人一樣的原因。 在與 AI 進行超過 3,000 小時的結對編程後,我發現了真正有效的方法——而這並不是你想的那樣。 真相是:85% 的開發者陷入了 AI 驅動的複製粘貼循環。
2025/03/05
你做錯了。你剛剛發給 ChatGPT 的「寫一個函式來……」的提示?刪掉它吧。這些通用提示就是為什麼你的編碼速度還跟其他人一樣的原因。 在與 AI 進行超過 3,000 小時的結對編程後,我發現了真正有效的方法——而這並不是你想的那樣。 真相是:85% 的開發者陷入了 AI 驅動的複製粘貼循環。
2025/03/05
簡介 — 我如何停止浪費時間的故事 幾年前,我意識到我花在“做事”上的時間比實際在專案上取得進展的時間要多。我醒來時有無休止的待辦事項清單、回復電子郵件、參加會議、審查檔,但到一天結束時,我覺得我實際上沒有在任何重要的事情上取得進展。 有一天,一個朋友告訴我: 忙碌並不等同於有效。 這讓
2025/03/05
簡介 — 我如何停止浪費時間的故事 幾年前,我意識到我花在“做事”上的時間比實際在專案上取得進展的時間要多。我醒來時有無休止的待辦事項清單、回復電子郵件、參加會議、審查檔,但到一天結束時,我覺得我實際上沒有在任何重要的事情上取得進展。 有一天,一個朋友告訴我: 忙碌並不等同於有效。 這讓
2023/09/30
看到滿多年輕工程師提問:工作時經常查 ChatGPT,感覺不太踏實,沒關係嗎? 讓我簡單談論一下這件事 --- 首先,讓我們把時間倒回 2000 年代 google 剛出來的時候 當時一定也是這樣, 年輕工程師遇到問題狂查 google 資深工程師則覺得 google 可有可無,
2023/09/30
看到滿多年輕工程師提問:工作時經常查 ChatGPT,感覺不太踏實,沒關係嗎? 讓我簡單談論一下這件事 --- 首先,讓我們把時間倒回 2000 年代 google 剛出來的時候 當時一定也是這樣, 年輕工程師遇到問題狂查 google 資深工程師則覺得 google 可有可無,
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
本研究使用了盤中逐筆成交資料(Tick-by-tick Data)來進行股票價格的預測,並討論了馬可夫鏈模型和擴散核模型在這方面的應用。研究結果表明,大多數股票的未來三秒價格可以在少於22個狀態中找到,顯示了交易價格的低不確定性。此外,研究還發現波動性更大和價格更高的股票更難以準確預測。
Thumbnail
本研究使用了盤中逐筆成交資料(Tick-by-tick Data)來進行股票價格的預測,並討論了馬可夫鏈模型和擴散核模型在這方面的應用。研究結果表明,大多數股票的未來三秒價格可以在少於22個狀態中找到,顯示了交易價格的低不確定性。此外,研究還發現波動性更大和價格更高的股票更難以準確預測。
Thumbnail
前言 這篇會拿Finlab上的策略與機器學習預測線圖的因子進行結合。由於模型是透過2007-2011年的線圖作為訓練資料,回測的時候會從2012年開始以示公平。 還沒看過前面兩篇的可以點下面連結,會比較看得懂接下來的內容。 第一篇: 什麼?!AI也看得懂k線圖?利用機器學習來判斷股票漲
Thumbnail
前言 這篇會拿Finlab上的策略與機器學習預測線圖的因子進行結合。由於模型是透過2007-2011年的線圖作為訓練資料,回測的時候會從2012年開始以示公平。 還沒看過前面兩篇的可以點下面連結,會比較看得懂接下來的內容。 第一篇: 什麼?!AI也看得懂k線圖?利用機器學習來判斷股票漲
Thumbnail
還沒有看過上一篇的可以點擊下面連結 什麼?!AI也看得懂k線圖?利用機器學習來判斷股票漲跌。(1)論文解析。 這一篇會把注意力放在論文提到的技術並套用在台股市場,也會使用論文中的方法進行驗證,看看是否在台股也有一樣的超額報酬。 資料生成 第一步也是最難的一步-資料生成。 這裡
Thumbnail
還沒有看過上一篇的可以點擊下面連結 什麼?!AI也看得懂k線圖?利用機器學習來判斷股票漲跌。(1)論文解析。 這一篇會把注意力放在論文提到的技術並套用在台股市場,也會使用論文中的方法進行驗證,看看是否在台股也有一樣的超額報酬。 資料生成 第一步也是最難的一步-資料生成。 這裡
Thumbnail
chatgpt說得一口好資料科學跟股票分析,我就來實際看看他會寫什麼出來
Thumbnail
chatgpt說得一口好資料科學跟股票分析,我就來實際看看他會寫什麼出來
Thumbnail
國內知名投資人"麥克風"曾提出,如果要找股市的相對低點,可以看ptt上的畢業文的數量。如果數量越多,就代表越接近相對低點。不過,這種觀察市場情緒的方式是否可以量化,並且為量化投資人帶來超額報酬?答案是可行的
Thumbnail
國內知名投資人"麥克風"曾提出,如果要找股市的相對低點,可以看ptt上的畢業文的數量。如果數量越多,就代表越接近相對低點。不過,這種觀察市場情緒的方式是否可以量化,並且為量化投資人帶來超額報酬?答案是可行的
Thumbnail
每日『市場指數』能快速判斷短中期趨勢方向!透過量化權重計算美股、台股、加密貨幣的短中期趨勢概況,簡化你的投資決策時間,請注意量化數據都是概率性不是絕對,長期的大賺小賠才是王道,追蹤我讓投資比呼吸還簡單!
Thumbnail
每日『市場指數』能快速判斷短中期趨勢方向!透過量化權重計算美股、台股、加密貨幣的短中期趨勢概況,簡化你的投資決策時間,請注意量化數據都是概率性不是絕對,長期的大賺小賠才是王道,追蹤我讓投資比呼吸還簡單!
Thumbnail
在上一篇文章中,我們學會了如何繪製最新的分鐘圖,讓我們了解最新一日的個股股價變化,不過有時分鐘圖太過細小,並無法了解到個股整體的趨勢狀況,這時我們就必須要使用到日線圖,因此,今天我們就來學習如何繪製日線圖吧!!
Thumbnail
在上一篇文章中,我們學會了如何繪製最新的分鐘圖,讓我們了解最新一日的個股股價變化,不過有時分鐘圖太過細小,並無法了解到個股整體的趨勢狀況,這時我們就必須要使用到日線圖,因此,今天我們就來學習如何繪製日線圖吧!!
Thumbnail
股價是股票匯集各式因素所組成的視覺圖,因此今天我們就來學學如何畫製個股的最新分鐘圖,讓你能夠一鍵輕鬆看到當日最新股價走勢圖,我們就開始來教學吧!!
Thumbnail
股價是股票匯集各式因素所組成的視覺圖,因此今天我們就來學學如何畫製個股的最新分鐘圖,讓你能夠一鍵輕鬆看到當日最新股價走勢圖,我們就開始來教學吧!!
Thumbnail
使用pandas,透過TWStock_2的資料,計算 6 日與12日RSI 值並繪製成圖。 首先先連接到TWStock_2資料庫將資料load出來。 這次load的資料一樣是2330台積電,然後我們一樣只取收盤價,修改日期格式。 之後要算出每日的U與D值(絕對漲跌),條件如下ㄑ 輸出會如下圖
Thumbnail
使用pandas,透過TWStock_2的資料,計算 6 日與12日RSI 值並繪製成圖。 首先先連接到TWStock_2資料庫將資料load出來。 這次load的資料一樣是2330台積電,然後我們一樣只取收盤價,修改日期格式。 之後要算出每日的U與D值(絕對漲跌),條件如下ㄑ 輸出會如下圖
Thumbnail
使用pandas,透過TWStock_2的資料,計算下列三種常用的技術指標 1. 移動平均線 2. 指數移動平均線 3. MACD 首先連接資料庫,然後我們只取"成交股數 , 開盤價 , 最高價 , 最低價 , 收盤價" 這5個columns代入新的tsmc( 名稱 ) code如下 參考連結如下
Thumbnail
使用pandas,透過TWStock_2的資料,計算下列三種常用的技術指標 1. 移動平均線 2. 指數移動平均線 3. MACD 首先連接資料庫,然後我們只取"成交股數 , 開盤價 , 最高價 , 最低價 , 收盤價" 這5個columns代入新的tsmc( 名稱 ) code如下 參考連結如下
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News