最近嘗試用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線其實只是一個 “參考” 而已

可能你恐懼的時候可以參考

可能你貪婪的時候可以參考

也許會改變你的想法

 

以上

給大家參考囉