發表文章

目前顯示的是 8月, 2024的文章

[專題實作]以Yfinance之臺股資料進行市場寬度指標驗證-總結

圖片
這篇其實2023年初就該發了,但懶病拖了一年多,下面的回測資料基本上都是過去實作的複製貼上,想玩現在的小夥伴可以自己摳程式去執行。 另外還是要說明,這資料並沒有洗得很乾淨,後期才上市櫃的跟著滾也會和實際值有差異,大家只能當個參考哈。 背景 2020-2022因疫情、通膨與貨幣政策變動,導致股市出現明顯大幅漲跌,為尋找安全進場之點位,故本專題將實作市場慣用之「市場寬度」指標在臺灣加權指數上的市場樣態驗證。 目的 以市場寬度應用於辨識市場樣態的指標實作。 透過參數調整,與簡易的回測模型建立多空參考策略 市場寬度(Market Breadth) 指標功能 分析市場強弱的指標,通常指的是在某一特定時期內,市場中上漲股票的數量相對於下跌股票的數量的比率。 幫助投資者了解市場整體強弱,並且通過相應的投資策略來應對不同的市場狀況。 常用參考參數 漲跌家數百分比 漲跌家數差 均線家數百分比 均線家數差 創高家數比 成交漲跌量差 應用模組 爬蟲:Requests 資料處理:Pandas 金融資料:Yfinance 數據回測:Backtesting 視覺化圖表:Tableau、 Backtesting.plot 整體流程 20-200MA比較 可以觀察到重合底部,但無法判斷高檔鈍化 回測大盤 以這種白癡策略也沒有賺多少XD 結論 在市場寬度與臺灣加權股價指數對照圖中可以顯見該指標具辨識市場相對低點之功能,但尚無法以此2指標線觀察出市場相對高點。 建議 後續驗證者可參採其他天期之日均線家數百分比或選取不同的指標來驗證能否觀察出相對的市場高點。 本專題之回測乃以臺灣加權股價指數為標的物,非一般可供投資人交易之金融性商品,若有後續研究測試者可使用指數型商品如元大台灣50(0050)、富邦台灣50(006208)對比元大台灣中型100(0051)、富邦臺灣公司治理100(00692)之策略績效,來驗證大型權值股與中小型股之集合在市場寬度策略上的表現個別如何。

[專題實作]以Yfinance之臺股資料進行市場寬度指標驗證-Step4.匯入檔案以產生策略

  讀取和處理數據 讀取數據 python import pandas as pd '讀取之前處理好的數據檔案,並將日期格式處理乾淨:' path4 = r'D:\市場寬度 專題\2020-2024市場寬度與大盤指數.csv' # 從檔案讀取 MW = pd.read_csv(path4) 這段程式碼從指定路徑讀取之前處理好的市場寬度與大盤指數的數據。 處理日期格式 python MW[ 'Date' ] = MW[ 'Date' ].apply( lambda x: x[: 10 ]) MW[ 'Date' ] = pd.to_datetime(MW[ 'Date' ], format = "%Y-%m-%d" ) MW.columns = [ 'Date' , '20ma_p' , '200ma_p' , 'TWII' ] MW.set_index( 'Date' , inplace= True ) 由於原日期格式包含時區資訊,無法直接轉換,因此先提取前10個字元(日期部分),再使用 pd.to_datetime 進行轉換。最後,將欄位名稱重新命名並將 'Date' 設定為索引。 保存處理後的數據 python path5 = r'D:\市場寬度 專題\2020-2024市場寬度與大盤指數(DT).csv' MW.to_csv(path5, sep= ',' , na_rep= '' , float_format= '%.4f' , encoding= 'utf_8_sig' ) 將處理後的數據保存為新的 CSV 檔案。 準備回測數據 python from backtesting import Backtest, Strategy from backtesting.lib import crossover from backtesting.test import SMA '資料引入:' data = pd.DataFr...

[專題實作]以Yfinance之臺股資料進行市場寬度指標驗證-Step3.將數值處理並產出市場寬度資料

拖了很久最近台股又再大跌才想到要補一下這段,現在有ChatGPT很方便,程式碼餵給他,幫我分段說明就行了,如果有想到什麼缺的再另外補哈。 匯入模組 python import pandas as pd 首先,匯入 pandas 模組,用於資料處理。 從檔案匯入歷史股價並計算市場寬度 python path1 = r"D:\市場寬度 專題\2020-2024個股股價df.csv" close = pd.read_csv(path1) print (close) print (close.shape[ 0 ], close.shape[ 1 ]) close.set_index( 'Date' , inplace= True ) stock_totall_Count = (close.shape[ 1 ]) print (close) 這段程式碼從指定路徑讀取歷史股價資料,並設定 'Date' 欄為索引。 close.shape 用於查看資料的列數和欄數。 計算移動平均線 python '個股20日均線' ma20 = close.rolling( 20 , min_periods= 20 ).mean() '個股200日均線' ma200 = close.rolling( 200 , min_periods= 200 ).mean() 這裡計算了20日和200日的移動平均線(MA),分別用於短期和長期的市場趨勢分析。 計算市場寬度 python '市場寬度:大於20日均線家數百分比' close_B20 = (close > ma20) close_C20 = close_B20. sum (axis= 1 ) / (stock_totall_Count - close.isna(). sum (axis= 1 )) '市場寬度:大於200日均線家數百分比' close_B200 = (close > ma200) close_C200 = close_B200. sum (axis= 1 ) / (stock_totall_Count - close.isna(). sum (axis= 1 )) 這段程式碼計算了大於20...