本文的完成要感謝貓老大跟院長的協助,搞出超有效率的程式碼
院長的社團在這,歡迎加入,很多好東西
每到農曆年前,就會看到新聞在討論台股年後的上漲機率,不過,這些討論多集中在大盤,少有個股,有沒有個股在過去的上漲機率統計呢? 來看看吧
勝率統計表
下面表格為統計過去10年,每檔股票,年後第一個交易日開盤進場,持有不同天數的勝率,1勝率,代表的是年後第一個交易日收盤出場,2勝率代表的是年後第一個交易日收盤出場,其他依此類推
另外,要注意的是,總次數那邊的數字,如果是新股,總次數會<10,所以如果看到勝率100%的個股,先不要太高興,有可能是總次數沒有太多的關係
將不符合10次的股票去除後,上市櫃股只剩1317檔,將每檔個股勝率跟出場時間,做了一個統計,從下表可以看出,持股三天以上的且紅K的占比,比持股2天以內的占比高不少,似乎持股10天再出場,占比都比其他天還高,或可從在持股10天出場且佔九成以上勝率的個股去篩選接下來開紅盤要進場的股票
PS: 統計表的檔案,在下方,請自己匯入,可以自己調整要計算過去幾年,最多23年
100%勝率個股數統計
除了上面的統計外,這邊還用了幾個不同的條件做了交叉統計,在計算100%勝率出現的次數,這個統計的進出場及週期說明如下
- 進場日分為封關日當天收盤進場跟開紅盤當日開盤進場
- 出場則為開紅盤當天開盤出場、紅盤當天收盤出場,及年後第2、3、5、10、20個交易日的收盤出場
- 統計過去5、10、15、20年,100%賺錢的個股數量
從上面的表格可以看出來,統計超過15年以後,100%賺錢的個股數量急速的減少,而且多是要等到持股10天以上才會獲利,而統計過去20,則100%能賺錢的個股數量則為0,這樣是不是代表過去10年勝率100%的個股,之後出現賠的機率變大了!!! 不過這個數據每年都會變化,是不是這樣,需要再做更深入的研究,這邊就先暫不討論
封關日進場勝率較高嗎?
很多人應該每年都在糾結是不是該抱股過年,根據上面的比較表可以看出來,不管是統計過去幾年,不管是持股幾天出場,封關日收盤進場後,出現100%勝率的股票機率遠低於開紅盤再進場的方式
不過,這樣是不是代表,不應該封關日收盤進場呢? 應該也不一定,兩個進場方式,最終成為勝率高的股票是不同的,那如果封關日要進場,又該如何篩選股票呢?
以下表為例,統計的是過去10年的勝率,可以先把持股20天且勝率100%的股票列出,然後再看看其他持股天數的勝率,如果其他持股天數出現勝率較低的狀況,如和益、欣雄、達欣工,或許就可以不要列入考慮,只保留各持股天數勝率都比較高的個股,或許會比較有機會在前期就獲利先出場
上面篩選方式只是一個想法,沒有實證,大家可以自己調整,或再加入其他條件篩選
開紅盤進場賺的到錢嗎?
採用跟上面同樣的方式,先將持股20天,勝率100%的股票列出,再挑選其他持股天數勝率至少能達到七成以上的股票,原本34檔股票,最後挑出15檔,不過,這只是我想測試的方式,可以年後來驗證看看,大家也可以測試自己的方式,看看年後會有怎樣的表現
PS: 第1天的勝率我是忽略的
勝率高的一定賺錢嗎?
這也是個很有趣的問題,有沒有可能勝率高的股票是賺少賠多呢?這還真的是有可能的,院長也幫忙做了一個統計,用過去23年來看,有五檔股票紅K次數高達20次,但損益總和來看,有2檔依然是虧損的,如果把出場的停損利用的小點會不會好點呢? 那就有待大家試試了
程式碼
這個選股方式的程式碼,還滿值得討論的,原本我是先用陣列列出過去每年開紅盤後第20個交易日的日期,然後用getbaroffset去找出年後各相對應日期的開盤價或收盤價,不過,這樣的寫法,資料讀取筆數會需要比要取的陣列日期還要長才能正確抓到相關數值,也造成選股要花非常久的時間,甚至失敗
input: n(15,"計算幾期勝率"); if date <> date[1] then ret=1; Array: date20[23](0); //農曆年開盤後的第20個交易日 date20[1] = 20000306; date20[2] = 20010223; date20[3] = 20020318; date20[4] = 20030306; date20[5] = 20040223; date20[6] = 20050314; date20[7] = 20060303; date20[8] = 20070323; date20[9] = 20080311; date20[10] = 20090227; date20[11] = 20100319; date20[12] = 20110308; date20[13] = 20120223; date20[14] = 20130315; date20[15] = 20140305; date20[16] = 20150323; date20[17] = 20160314; date20[18] = 20170302; date20[19] = 20180321; date20[20] = 20190312; date20[21] = 20200226; date20[22] = 20210317; date20[23] = 20220307; value1=array_GetMaxIndex(date20); //取得陣列最大值 if n > value1 then raiseRunTimeError("期數設定超出範圍"); vars: i(0),j(0); i=0; j=0; For i = (value1 - n + 1) to value1 //For i = 22 to 23 begin value2 = close[getbarOffset(date20[i])] - open[getbarOffset(date20[i])+19]; if value2 >0 then i = 1 else i = 0; j = j + 1; outputField1(j, "20天勝率"); end;
不過,在貓大跟院長的大力協助下,花了一個下午的時間,終於找出了一個高效率的寫法,資料讀取只要2筆,全部的股票放進去選,大概3分鐘內就可以跑出結果來
這個寫法非常有趣,用到了一個getfieldstartoffset函數,運用getfieldstartoffset(“date”,”D”),抓到個股起始日期的K棒數,然後用迴圈開始比對日期是否跟陣列日期是否相符,並同時取得該日期距今的K棒數,就可用來取得所需要的開盤價或收盤價,真的是很神奇的寫法,推薦大家了解下,真的超高效率
var: TotalBars (0); TotalBars = GetFieldStartOffset ("Date", "D"); value3 = 0; var: i(0), j(0); for i = TotalBars downTo 0 begin for j = 1 to 23 begin if Date [i] = Date20 [j] then begin value2 = close[i - 19] - open[i]; if value2 >0 then value3 = value3 + 1; if j=23 then begin outputField3(open[i], "2022開盤價"); outputField4(date[i],"2022開盤日"); outputField5(close[i - 19], "2022收盤價"); outputField6(date[i - 19], "2022收盤日"); end; end; end; end;
檔案下載

檔案包含兩個選股策略,一個為封關收盤進場,一個為年後第一個交易日開盤進場
發佈留言
很抱歉,必須登入網站才能發佈留言。