最近嘗試用K線圖來預測股票
沒錯
就是這麼直覺

首先你需要一張顯示卡來訓練模型
當然也是因為有AI的協助之下
寫程式快很多
例如抓股票資料
print(f"yf.download : {ticker_yf} ...")
df = yf.download(ticker_yf, start=start_date, end=end_date, progress=False, auto_adjust=True)
if df is not None and not df.empty and len(df) >= sample_window:
if isinstance(df.columns, pd.MultiIndex):
df.columns = df.columns.get_level_values(0)
for col in ['Open', 'High', 'Low', 'Close', 'Volume']:
if col in df.columns:
df[col] = pd.to_numeric(df[col], errors='coerce').astype(float)
cleaned_df = df.dropna(subset=['Open', 'High', 'Low', 'Close'])
if len(cleaned_df) >= sample_window:
print(f"✓ Successfully yf fetched {years} years of data for {ticker} (via {ticker_yf})")
if not cache_dir is None:
save_cached_data(cleaned_df, ticker, cache_dir)
return cleaned_df, ticker_yf
但是說真的
AI給的程式自己必須要再看過
否則如果出問題
自己又認為 “AI 這邊寫的不會錯啊”
這種想法
往往會造成一個死胡同
就是一直有BUG 然後 AI 鬼打牆
時間也是成本
所以有時候還是要自己靜下心來看程式
重點是說
我發現給的資料最好不要直接給到數值
例如 價格, 成交量, 日期, 是否上市上櫃, 行業種類 …
就是那種可以明確將該K線圖分類的
否則就很容易過擬合
過擬合的話
這模型就幾乎沒有什麼價值

通常訓練train 資料一定會是最好
所以需要 val 與 test 來做驗證
val 是訓練中避免過擬合的資料
test 則是最後驗證模型的能力
通常我是將資料切 6 份
1-5份就是 train val 做交叉驗證
第6份做 test 驗證
假設今天 val 跟 test 成績差很遠
那也是過擬合
所以分3種資料是必要的
尤其是這種要實戰的

我原本嘗試將K線圖放上所有資訊來訓練看看
結果表現確實沒有比較好
最好的方式還是只有 K線 與 年線 與 季線 與 交易量 這樣的組合就好

然後發現一個重點
如果訓練時候是用 “時間” 來切割訓練資料
會發現怎麼訓練都很差
也就是說
實際上有一個”趨勢” 是跟著時間走的
有些人操作是隨著時間在改變操作趨勢的
所以如果把某些時刻的資料刪除
模型怎麼訓練都不知道這個操作趨勢
所以
不管是預測未來 還是 預測過去
都很困難
最好的方式是
用不同的公司來避免資料的重複
目前只想得到這樣做了
然後參考指標可以用 MCC指標
“MCC 指標(Matthews Correlation Coefficient,馬修斯相關係數)是機器學習中用來評估**二元分類(Binary Classification)**模型性能的一種指標。 它被認為是比「準確率(Accuracy)」或「F1-Score」更可靠的統計數值,特別是在處理**數據不平衡(Imbalanced Data)**的情況時。”
然後最好使用2分類模型
預測要抓平均價格比較好
# 該日期前5天的平均價格 (包含當天,往前數5天)
before_window = df.iloc[i-IMG_SCORE_AVG_DAYS_NOW:i+1]
if len(before_window) < IMG_SCORE_AVG_DAYS_NOW:
return -1
avg_price_before = before_window['Close'].mean()
# 該日期後1個月(20個交易日)內最後5天的平均價格
future_window_start = i + 1 + (IMG_SCORE_AHTER_DATE - IMG_SCORE_AVG_DAYS_PRE)
future_window_end = i + 1 + IMG_SCORE_AHTER_DATE
after_window = df.iloc[future_window_start:future_window_end]
if len(after_window) < IMG_SCORE_AVG_DAYS_PRE:
return -1
avg_price_after = after_window['Close'].mean()
盡量消除噪聲
然後也不要模型預測漲或是跌自己就買賣
有時候也要自己判斷
畢竟模型只是針對資料最大化預測
但是目前局勢 包含 新聞 國際問題 黃金 BTC … 都是影響因素
這邊只有看K線其實只是一個 “參考” 而已
可能你恐懼的時候可以參考
可能你貪婪的時候可以參考
也許會改變你的想法
以上
給大家參考囉

留言板
歡迎留下建議與分享!希望一起交流!感恩!