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

更新於 2023/02/18閱讀時間約 22 分鐘
  • 文內如有投資理財相關經驗、知識、資訊等內容,皆為創作者個人分享行為。
  • 有價證券、指數與衍生性商品之數據資料,僅供輔助說明之用,不代表創作者投資決策之推介及建議。
  • 閱讀同時,請審慎思考自身條件及自我決策,並應有為決策負責之事前認知。
  • 方格子希望您能從這些分享內容汲取投資養份,養成獨立思考的能力、判斷、行動,成就最適合您的投資理財模式。
好的看他說得一口像資料科學家一樣我就照著她說的做
好的取得完數據之後我們照他說得考慮政治因素市場情緒
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波動率指數和美國總統就職日期
再來看看他能不能幫忙做特徵轉換和特徵工程
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都會
還算了一下收盤價的一階差分當作特徵工程項
不過過程中其實有些許錯誤我自己跳下去修改了一下之後
把整段代碼貼上補一句問他
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, :])
看來他搞混了我的預測目標是明天收盤價,而不是收盤價的差分
大概做到這邊就極限了他開始胡言亂語
後面出現神經網路內部架構的錯誤
好吧我只能親手動手來了,不過他倒是提供了一個很好的藍圖
最終結果算是我跟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()
這就是照著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裡當作一項特徵,算是很大的幫助
最後來看一下表現:
test r2_score 0.59 左右看來有點準但又不是太準,但是方向抓得出來
總結
我可以看到chatgpt是一個超級強大的助手,特別是對於像我這樣的內容創作者。過去身為一個工程師我常常為一篇文章編寫大量代碼,但在這篇文章中,我的工作量其實減少許多。大部份代碼都由chatgpt完成,確實是一個不錯的工具
感謝您的閱讀,希望您喜歡這篇文章!
如果您想要來支持我的內容創作那麼您可以用
請我喝杯咖啡讓我更有創作的熱情跟動力🙂
為什麼會看到廣告
人工智能工作經驗跟研究
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
機器人會幫助我們獲得財務自由嗎? 毫無疑問,OpenAI 的 ChatGPT 非常出色! 我喜歡寫有關金融市場的文章,尤其是從數據科學的角度。 不用說,這個人工智能工具對我來說形成了一個很好的交集; 這能滿足我內心的書呆子,同時證明這工具對追求財務自由有價值嗎? 我問了一個非常直率的問題,直接對其進
你有沒有錯過 Binance 上的一個大型加密硬幣泵? 也許您正忙於工作,或者只是不夠快而無法抓住機會。 這是一種令人沮喪的感覺,尤其是當你看到價格在你眼前飛漲時。 但是,如果有一種方法可以實時識別這些爆漲? 在本文中,我們將向您展示如何使用 Python 快速輕鬆地識別加密貨幣暴漲。
首先可以這樣寫告訴chatgpt你希望他表現得像個linux terminal 不用寫解釋,只要回覆linux terminal應該回復的東西即可
google的以圖搜圖相信大家都不陌生,非常好用 本人這篇文章是紀錄一下自己如何利用本身在人工智能方面的知識 土法煉鋼一個以圖搜圖算法,至於跟google一不一樣就待討論了 首先以圖搜圖本身是一個相似度比對問題,人類怎麼做相似度比對呢? 好比給你一堆圖片,之後要求你選一張喜歡的,之後把剩下的圖片都拿
Google JAX是一種用於轉換數值函數的機器學習框架。 它被描述為匯集了autograd(通過函數微分自動獲得梯度函數)和TensorFlow的XLA(加速線性代數)的修改版本。 它旨在盡可能地遵循NumPy的結構和工作流程,並與各種現有框架(如TensorFlow和PyTorch)一起工作。
機器人會幫助我們獲得財務自由嗎? 毫無疑問,OpenAI 的 ChatGPT 非常出色! 我喜歡寫有關金融市場的文章,尤其是從數據科學的角度。 不用說,這個人工智能工具對我來說形成了一個很好的交集; 這能滿足我內心的書呆子,同時證明這工具對追求財務自由有價值嗎? 我問了一個非常直率的問題,直接對其進
你有沒有錯過 Binance 上的一個大型加密硬幣泵? 也許您正忙於工作,或者只是不夠快而無法抓住機會。 這是一種令人沮喪的感覺,尤其是當你看到價格在你眼前飛漲時。 但是,如果有一種方法可以實時識別這些爆漲? 在本文中,我們將向您展示如何使用 Python 快速輕鬆地識別加密貨幣暴漲。
首先可以這樣寫告訴chatgpt你希望他表現得像個linux terminal 不用寫解釋,只要回覆linux terminal應該回復的東西即可
google的以圖搜圖相信大家都不陌生,非常好用 本人這篇文章是紀錄一下自己如何利用本身在人工智能方面的知識 土法煉鋼一個以圖搜圖算法,至於跟google一不一樣就待討論了 首先以圖搜圖本身是一個相似度比對問題,人類怎麼做相似度比對呢? 好比給你一堆圖片,之後要求你選一張喜歡的,之後把剩下的圖片都拿
Google JAX是一種用於轉換數值函數的機器學習框架。 它被描述為匯集了autograd(通過函數微分自動獲得梯度函數)和TensorFlow的XLA(加速線性代數)的修改版本。 它旨在盡可能地遵循NumPy的結構和工作流程,並與各種現有框架(如TensorFlow和PyTorch)一起工作。
你可能也想看
Google News 追蹤
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
Thumbnail
【不夠善良的我們】究竟不夠善良的部份是什麼!? 這並不是一部講述愛情、親情甚至友情的故事,整個故事到最後揭露了過程中的各種"惡意",又是從哪裡感受到的呢!? 2024最夯的台劇【不夠善良的我們】,一次看到林依晨、許瑋甯、賀軍翔、柯震東同台飆戲,一步步帶我們走進人性的真實樣貌!!
Thumbnail
文章前警語: 小火車的投資筆記主要為透過基本面、財報做策略篩選並回測勝率後,(策略為部位-20%即停損,同時持有約240-300日)再加上個人研究公司的知識心得分享,並不帶有任何推薦意味、內容也並非投資意見。不會有任何目標價。希望您看完文章後,養成自我獨立思考的習慣。謹慎考慮,審慎投資。 你
Thumbnail
TenMax 作為台灣零售媒體第一品牌,秉持深度專業的理念,為你整理零售媒體最新發展與觀點分析,帶你更全面瞭解零售媒體產業動向。 
Thumbnail
最近,某房屋仲介公司主辦了一個名為「埋下誠實的種子」的徵稿活動。我是發自內心認為這不是一個好的題目,即使你立意良善,希望孩子體會誠實的意義,可是在獎金的利誘下,孩子反而可能寫出不誠實的內容,和你的立意背道而馳。
Thumbnail
重新整理以免讀者看不懂,日後更新以日期標註在,加在《後記》之中…… 以戰止戰迫不得已……所幸黎明將至…… 咱有把握這就是最終問題根源 親愛的本蛙訂閱讀者,長期日以繼夜鬧場,已經妨礙平台秩序與諸位權益,身為平台作者,有權利要求同平台作者,尊重本蛙發文權益,日後不再從事挑釁行為,這些要求絕對合理。
Thumbnail
我好不容易學會程式設計了,我想趕快來實作了!等等,先別急著將你內心的想法實現出來。你應該先問問使用者,並做一系列的思考規劃,也就是從最基本的需求訪談開始做起。這樣才能降低整個功能砍掉重練的可能性喔!
Thumbnail
我們習慣被一種思維受限:別人怎麼做有效果,我們就照著做,應該會有用吧? 對,我相信有些適用,但事實上,事情不完全是這樣子運作。 在未知的道路上,你也可以發揮創意,彈性的嘗試不同的方法,因為通往成功的道路不是單一制式的。
Thumbnail
你可能想踏入工程師的行業裡面看看自己適不適合,除了訓練思考之外,順便給自己一個磨練的機會嘗試看看,搞不好自己會深深愛上寫程式。不過,寫程式不能只是喜歡而已,更重要的是熱忱啊!這篇文章會跟你分享怎麼保持高度熱忱,讓你重回寫程式的興趣。
Thumbnail
時間不夠,結案又急 技術平台整個大改……..這種拼湊的日子,就算交得出結果 後面衍生的惡夢更多~ 我很小的時候,那時候華視晚上六點有播出卡通,無敵鐵金剛 因為年紀太小了,我不太記得劇情 印象中,這部卡通最傑出的創意,就是駕駛者必須跟機器人組合,才能操縱他。 結果更慘….. 冷涼卡好! 能怎樣呢?
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
Thumbnail
【不夠善良的我們】究竟不夠善良的部份是什麼!? 這並不是一部講述愛情、親情甚至友情的故事,整個故事到最後揭露了過程中的各種"惡意",又是從哪裡感受到的呢!? 2024最夯的台劇【不夠善良的我們】,一次看到林依晨、許瑋甯、賀軍翔、柯震東同台飆戲,一步步帶我們走進人性的真實樣貌!!
Thumbnail
文章前警語: 小火車的投資筆記主要為透過基本面、財報做策略篩選並回測勝率後,(策略為部位-20%即停損,同時持有約240-300日)再加上個人研究公司的知識心得分享,並不帶有任何推薦意味、內容也並非投資意見。不會有任何目標價。希望您看完文章後,養成自我獨立思考的習慣。謹慎考慮,審慎投資。 你
Thumbnail
TenMax 作為台灣零售媒體第一品牌,秉持深度專業的理念,為你整理零售媒體最新發展與觀點分析,帶你更全面瞭解零售媒體產業動向。 
Thumbnail
最近,某房屋仲介公司主辦了一個名為「埋下誠實的種子」的徵稿活動。我是發自內心認為這不是一個好的題目,即使你立意良善,希望孩子體會誠實的意義,可是在獎金的利誘下,孩子反而可能寫出不誠實的內容,和你的立意背道而馳。
Thumbnail
重新整理以免讀者看不懂,日後更新以日期標註在,加在《後記》之中…… 以戰止戰迫不得已……所幸黎明將至…… 咱有把握這就是最終問題根源 親愛的本蛙訂閱讀者,長期日以繼夜鬧場,已經妨礙平台秩序與諸位權益,身為平台作者,有權利要求同平台作者,尊重本蛙發文權益,日後不再從事挑釁行為,這些要求絕對合理。
Thumbnail
我好不容易學會程式設計了,我想趕快來實作了!等等,先別急著將你內心的想法實現出來。你應該先問問使用者,並做一系列的思考規劃,也就是從最基本的需求訪談開始做起。這樣才能降低整個功能砍掉重練的可能性喔!
Thumbnail
我們習慣被一種思維受限:別人怎麼做有效果,我們就照著做,應該會有用吧? 對,我相信有些適用,但事實上,事情不完全是這樣子運作。 在未知的道路上,你也可以發揮創意,彈性的嘗試不同的方法,因為通往成功的道路不是單一制式的。
Thumbnail
你可能想踏入工程師的行業裡面看看自己適不適合,除了訓練思考之外,順便給自己一個磨練的機會嘗試看看,搞不好自己會深深愛上寫程式。不過,寫程式不能只是喜歡而已,更重要的是熱忱啊!這篇文章會跟你分享怎麼保持高度熱忱,讓你重回寫程式的興趣。
Thumbnail
時間不夠,結案又急 技術平台整個大改……..這種拼湊的日子,就算交得出結果 後面衍生的惡夢更多~ 我很小的時候,那時候華視晚上六點有播出卡通,無敵鐵金剛 因為年紀太小了,我不太記得劇情 印象中,這部卡通最傑出的創意,就是駕駛者必須跟機器人組合,才能操縱他。 結果更慘….. 冷涼卡好! 能怎樣呢?