[VBA] 讓你獲利翻倍的投資法 – 0050 均線 回測程式
目錄 :
0050 均線 回測程式
此篇文章是 0050即時分析系統 的延伸,主要是藉由 MA均線 的歷史資料,來分析 黃金/死亡交叉 為 進/出場 的回測策略,同時與時下最夯的小資族 定時定額無腦存股法,來作比較,看其績效為何 ?
※ 所謂「 數據會說話 」,這就開始製作並解說 MA均線 回測程式的操作步驟,讓大家了解 — 如何達成翻倍獲利 !
( PS. 若對 均線 定義不了解的話,請先參考 : 移動平均線 ( MA )。
[ 操作步驟 ] :
1. 複製歷史資料 : 將 元大台灣50 工作表內的資料欄位複製到 MA工作表。
( PS. 因為只針對 MA均線 作回測,所以只複製基本欄位 : 時間 + 開 / 高 / 低 / 收 + SMA均線 的欄位資料,如下圖。)
2. 1 ~ 3列 插入空白列 : 為了做數據分析之用。
3. 填入需要的欄位名稱 : 依照下圖 — 紅框 / 桔框 位置,填入各欄位標題名稱。
4. 載入各項判別公式 : 依照上圖 — 紅/桔框,分成 : 兩個區塊 — (上) : 即時數據 + 策略分析 / (下) : 歷史資料分析,來載入相關的判別公式。
(下) : 歷史資料分析
※ 首先,先製作 台灣50均線回測程式 — (下) : 歷史資料分析 桔框部分,標題內,有兩組黃金交叉買進策略 :
( 一 ) : 5 ↗ 20 / I 欄位 : 5MA 向上穿過 20MA
( 二 ) : 股價 ↗ 60 / N 欄位 : 歷史收盤價 向上穿過 60MA
MA 均線 策略(一)
☆ 策略條件 :
( 一 ) : 買進 / 5MA↗20MA –黃金交叉
( 二 ) : 賣出 / 5MA↘20MA — 死亡交叉
◎ 買進 – 策略條件 : 5MA 向上穿過 20MA (黃金交叉)。
[ 公式設定與解說 ] :
——————————————————————————————————————————————
[ I5 儲存格 – 突破(信號)標記 ]
※ 突破 信號公式 : =IF(G5=”N/A”,0,IF(F5>G5,1,0)),這組公式內含雙層式的IF判斷式,用來判斷是否為突破。
◎ EXCLE函數寫法 : 如下 :
第 1 層 IF : =IF(G5=”N/A”,0,IF(F5>G5,1,0)) :
※ 意思是 : 先判別 G5 資料,是否正確。若為 N/A,I5欄 顯示 : 0 (表示:未突破);非N/A,則進入 第 2 層 IF 判別式。
第 2 層 IF : IF(F5>G5,1,0) :
※ 意思是 : 判別 F5(SMA5) 是否大於 G5(SMA20)。
◎ 若為 是 : 則 I5欄 顯示 : 1 (表示 : 突破)。
◎ 若為 否 : 則 I5欄 顯示 : 0 (表示 : 未突破)。
——————————————————————————————————————————————
[ J5 儲存格 – 買進標記 ] :
※ 觸發買進 標記公式 : =IF(G5=”N/A”,””,IF(AND(I4=0,I5=1),1,””)),同 I5 作法,雙層IF判斷式,用來標記買進信號,其目的是為了方便加總,計算突破的交易次數。
◎ EXCLE函數寫法 : 如下 :
第 1 層 IF : =IF(G5=”N/A”,“”,IF(AND(I4=0,I5=1),1,””)) :
※ 同上,判別 G5欄 SMA20資料,是否正確。若為 N/A,J5欄 顯示 : ” “ (空白),表示資料錯誤;非N/A,則進入 第 2 層 IF 判別式。
第 2 層 IF : IF(AND(I4=0,I5=1),1,“”) :
※ 意思是 : 使用 AND邏輯函數,同時判別 I4欄(前一日信號),是否為 0 及 I5欄(今日信號),是否為 1。 ( 請先參考 I欄 信號解說 )。
◎ 若為 是 (I4=0,I5=1) : 表示今日剛突破,則 J5欄 顯示 1 (標記買進位置)。
◎ 若為 否 : 意思是 – 只要不是剛突破(I4=0,I5=1),J5欄 便顯示 ” “。
——————————————————————————————————————————————
[ K5 儲存格 – 標記買進價 ]
※ 買進價 標記公式 : =IF(J5=1,E5,””),用來判斷 J5欄 是否有 買進 標記 1。
◎ EXCLE函數寫法 : 如下 :
IF 判斷式 : =IF(J5=1,E5,“”) :
※ 主要目的是 : 判斷 J5欄 是否有標記 1 (買進標記)。( PS. 公式也可以寫成 : =IF(J5<>””,E5,””),功能相同。)
◎ 若 是 : 表示觸發買進,則 K5欄 顯示 E5 (收盤價)。
◎ 若 否 : K5欄 則顯示 ” “。
★ 突破信號標示條件 ★
☆ 突破信號標示 — I欄位中,會有三種信號標示 : 未突破 / 剛突破 / 已突破。( PS. 適用於 — I欄 / L欄 / P欄 / S欄 )
◎ 未突破 / I欄=0 : 表示手上沒單(空手)。
◎ 剛突破 / I欄=1 , I欄-1=0 : 表示今日剛突破 – 觸發買進信號。( 意思是 : I欄-1(前一日) =0 (空手),I欄(今日) =1 (有單),即 剛突破。)
◎ 已突破 / I欄=1 , I欄-1=1 : 表示手上有單。( 意思是 : I欄-1(前一日) =1 (有單),即使 I欄(今日) =1 (有單-突破),也不會再觸發信號。)
◎ 出場 – 策略條件 : 5MA 向下穿過 20MA (死亡交叉)。
[ 出場 – 策略條件 ] :
◎ 條件 : 5MA 向下穿過 20MA — 賣出。
[ 公式設定與解說 ] :
——————————————————————————————————————————————
[ L5 儲存格 – 跌破(信號)標記 ]
※ 跌破 信號公式 : =IF(G5=”N/A”,0,IF(F5<G5,1,0)),這組公式內含雙層式的IF判斷式,用來判斷是否為跌破。
◎ EXCLE函數寫法 : 如下 :
第 1 層 IF : =IF(G5=”N/A”,0,IF(F5<G5,1,0)) :
※ 意思是 : 先判別 G5 資料,是否正確。若為 N/A,L5欄 顯示 : 0 (表示:未突破);非N/A,則進入 第 2 層 IF 判別式。
第 2 層 IF : IF(F5<G5,1,0) :
※ 意思是 : 判別 F5(SMA5) 是否小於 G5(SMA20)。
◎ 若為 是 : 則 L5欄 顯示 : 1 (表示 : 突破)。
◎ 若為 否 : 則 L5欄 顯示 : 0 (表示 : 未突破)。
——————————————————————————————————————————————
[ M5 儲存格 – 賣出標記 ] :
※ 觸發賣出 標記公式 : =IF(G5=”N/A”,””,IF(AND(L4=0,L5=1),1,””)),同 L5 作法,雙層IF判斷式,用來標記賣出信號,其目的是為了方便加總,計算跌破的交易次數。
◎ EXCLE函數寫法 : 如下 :
第 1 層 IF : =IF(G5=”N/A”,“”,IF(AND(L4=0,L5=1),1,””)) :
※ 同上,判別 G5欄 SMA20資料,是否正確。若為 N/A,M5欄 顯示 : ” “ (空白),表示資料錯誤;非N/A,則進入 第 2 層 IF 判別式。
第 2 層 IF : IF(AND(L4=0,L5=1),1,“”) :
※ 意思是 : 使用 AND邏輯函數,同時判別 L4欄(前一日信號),是否為 0 及 L5欄(今日信號),是否為 1。 ( 請參考 : 突破信號標示條件 )。
◎ 若為 是 (L4=0,L5=1) : 表示今日剛跌破,則 M5欄 顯示 1 (標記賣出位置)。
◎ 若為 否 : 意思是 – 只要不是剛跌破(L4=0,L5=1),M5欄 便顯示 ” “。
——————————————————————————————————————————————
[ N5 儲存格 – 標記賣出價 ]
※ 賣出價 標記公式 : =IF(M5=1,E5,””),用來判斷 J5欄 是否有 賣出 標記 1。
◎ EXCLE函數寫法 : 如下 :
IF 判斷式 : =IF(M5=1,E5,“”) :
※ 主要目的是 : 判斷 M5欄 是否有標記 1 (賣出標記)。( PS. 公式也可以寫成 : =IF(M5<>””,E5,””),功能相同。)
◎ 若 是 : 表示觸發賣出,則 N5欄 顯示 E5 (收盤價)。
◎ 若 否 : N5欄 則顯示 ” “。
MA 均線 策略(二)
☆ 策略條件 :
( 一 ) : 買進 / 股價↗60MA –黃金交叉
( 二 ) : 賣出 / 股價↘60MA — 死亡交叉
◎ 買進 – 策略條件 : 股價(收盤價) 向上穿過 60MA (黃金交叉)。
[ 公式設定與解說 ] :
——————————————————————————————————————————————
[ P5 儲存格 – 突破(信號)標記 ]
※ 突破 信號公式 : =IF(H5=”N/A”,0,IF(E5>H5,1,0)),這組公式作法同 I5欄,內含雙層式的IF判斷式,用來判斷是否為 : 突破。
◎ EXCLE函數寫法 : 如下 :
第 1 層 IF : =IF(H5=”N/A”,0,IF(E5>H5,1,0)) :
※ 意思是 : 先判別 H5 資料,是否正確。若為 N/A,P5欄 顯示 : 0 (表示:未突破);非N/A,則進入 第 2 層 IF 判別式。
第 2 層 IF : IF(E5>H5,1,0) :
※ 意思是 : 判別 E5(收盤價) 是否大於 H5(SMA60)。
◎ 若為 是 : 則 P5欄 顯示 : 1 (表示 : 突破)。
◎ 若為 否 : 則 P5欄 顯示 : 0 (表示 : 未突破)。
——————————————————————————————————————————————
[ Q5 儲存格 – 買進標記 ] :
※ 觸發買進 標記公式 : =IF(H5=”N/A”,””,IF(AND(P4=0,P5=1),1,””)),用來標記買進信號,其目的是為了方便加總,計算突破的交易次數。
◎ EXCLE函數寫法 : 如下 :
第 1 層 IF : =IF(H5=”N/A”,””,IF(AND(P4=0,P5=1),1,””)) :
※ 同上,判別 H5欄 SMA60資料,是否正確。若為 N/A,Q5欄 顯示 : ” “ (空白),表示資料錯誤;非N/A,則進入 第 2 層 IF 判別式。
第 2 層 IF : IF(AND(P4=0,P5=1),1,“”) :
※ 意思是 : 使用 AND邏輯函數,同時判別 P4欄(前一日信號),是否為 0 及 P5欄(今日信號),是否為 1。 ( 請參考 : 突破信號標示條件 )
◎ 若為 是 (P4=0,P5=1) : 表示今日剛突破,則 Q5欄 顯示 1 (標記買進位置)。
◎ 若為 否 : 意思是 – 只要不是剛突破(P4=0,P5=1),Q5欄 便顯示 ” “。
——————————————————————————————————————————————
[ R5 儲存格 – 標記買進價 ]
※ 買進價 標記公式 : =IF(Q5=1,E5,””),用來判斷 Q5欄 是否有 買進 標記 1。
◎ EXCLE函數寫法 : 如下 :
IF 判斷式 : =IF(Q5=1,E5,“”) :
※ 主要目的是 : 判斷 Q5欄 是否有標記 1 (買進標記)。( PS. 公式也可以寫成 : =IF(Q5<>””,E5,””),功能相同。)
◎ 若 是 : 表示觸發買進,則 R5欄 顯示 E5 (收盤價)。
◎ 若 否 : R5欄 則顯示 ” “。
◎ 出場 – 策略條件 : 股價(收盤價) 向下穿過 60MA (死亡交叉)。
[ 公式設定與解說 ] :
——————————————————————————————————————————————
[ S5 儲存格 – 跌破(信號)標記 ]
※ 跌破 信號公式 : =IF(H5=”N/A”,0,IF(E5<H5,1,0)),這組公式內含雙層式的IF判斷式,用來判斷是否為 : 跌破。
◎ EXCLE函數寫法 : 如下 :
第 1 層 IF : =IF(H5=”N/A”,0,IF(E5<H5,1,0)) :
※ 意思是 : 先判別 H5 資料,是否正確。若為 N/A,S5欄 顯示 : 0 (表示:未突破);非N/A,則進入 第 2 層 IF 判別式。
第 2 層 IF : IF(E5<H5,1,0) :
※ 意思是 : 判別 E5(收盤價) 是否小於 H5(SMA60)。
◎ 若為 是 : 則 S5欄 顯示 : 1 (表示 : 突破)。
◎ 若為 否 : 則 S5欄 顯示 : 0 (表示 : 未突破)。
——————————————————————————————————————————————
[ T5 儲存格 – 賣出標記 ] :
※ 觸發賣出 標記公式 : =IF(H5=”N/A”,””,IF(AND(S4=0,S5=1),1,””)),用來標記賣出信號,其目的是為了方便加總,計算跌破的交易次數。
◎ EXCLE函數寫法 : 如下 :
第 1 層 IF : =IF(H5=”N/A”,“”,IF(AND(S4=0,S5=1),1,””)) :
※ 同上,判別 H5欄 SMA60資料,是否正確。若為 N/A,T5欄 顯示 : ” “ (空白),表示資料錯誤;非N/A,則進入 第 2 層 IF 判別式。
第 2 層 IF : IF(AND(S4=0,S5=1),1,“”) :
※ 意思是 : 使用 AND邏輯函數,同時判別 S4欄(前一日信號),是否為 0 及 S5欄(今日信號),是否為 1。 ( 請參考 : 突破信號標示條件 )。
◎ 若為 是 (S4=0,S5=1) : 表示今日剛跌破,則 T5欄 顯示 1 (標記賣出位置)。
◎ 若為 否 : 意思是 – 只要不是剛跌破(S4=0,S5=1),T5欄 便顯示 ” “。
——————————————————————————————————————————————
[ U5 儲存格 – 標記賣出價 ]
※ 賣出價 標記公式 : =IF(T5=1,E5,””),用來判斷 T5欄 是否有 賣出 標記 1。
◎ EXCLE函數寫法 : 如下 :
IF 判斷式 : =IF(T5=1,E5,“”) :
※ 主要目的是 : 判斷 T5欄 是否有標記 1 (賣出標記)。( PS. 公式也可以寫成 : =IF(T5<>””,E5,””),功能相同。)
◎ 若 是 : 表示觸發賣出,則 U5欄 顯示 E5 (收盤價)。
◎ 若 否 : U5欄 則顯示 ” “。
★ 公式延伸複製 ★
※ 完成 策略一 / 策略二 的公式設定後,便可將公式往下延伸複製,複製到最新一筆資料。
[ 延伸複製方法 ] : 步驟如下 —
◎ 選取 I5 ~ U5 欄位資料,將滑鼠游標移到 U5儲存格的右下角,此時游標會變成 + (十字),然後滑鼠左鍵點二下,公式便會往下延伸複製到最後一列。
◎ 延伸複製後,資料如下 :
[ 圖例 ] : 進/出場 收盤價標記
※ 5MA/20MA 和 股價/60MA — 進/出場 收盤價標記 :
(上) : 即時數據 + 策略分析
※ 製作完 (下) : 歷史資料分析 回測部分,便繼續製作 (上) : 即時數據 + 策略分析。
( 1 ) : 即時數據
※ 即時數據 : 包含 —
( 一 ) : 時間 ( A欄 )
( 二 ) : 開高低收 ( B ~ E欄 )
( 三 ) : SMA均線 ( F ~ H欄 ) 等部分。
◎ 如下圖 :
[ 公式設定與解說 ] :
( A2欄 ) : 時間 — 利用 RTD語法 連結 XQ,取得交易時間。公式 : =RTD(“xqrtd.rtdserverxqlite”,,”TSE.TW-TradingDate”)
( B2欄 ) : 開盤價 — 同上法,取得開盤價。公式 : =RTD(“xqrtd.rtdserverxqlite”,,”0050.TW-Open”)
( C2欄 ) : 最高價 — 同上法,取得最高價。公式 : =RTD(“xqrtd.rtdserverxqlite”,,”0050.TW-High”)
( D2欄 ) : 最低價 — 同上法,取得最低價。公式 : =RTD(“xqrtd.rtdserverxqlite”,,”0050.TW-Low”)
( E2欄 ) : 收盤價 — 同上法,取得收盤價。公式 : =RTD(“xqrtd.rtdserverxqlite”,,”0050.TW-Price”)
◎ 若忘記 RTD語法的使用方式,請參考 : DDE/RTD語法與參數。
[ SMA均線 — 公式設定 ] :
※ 由於 SMA均線 的即時數據,必須每天更新歷史資料的採樣位置。所以最方便的方式,就是採用 VBA公式來設計。
※ SMA均線 公式原理 : 以 日 為單位。
☆ SMA5 ( 5日均線 ) = ( 今日收盤價 + 前4日收盤價 ) / 5
☆ SMA20 ( 20日均線 ) = ( 今日收盤價 + 前19日收盤價 ) / 20
☆ SMA60 ( 60日均線 ) = ( 今日收盤價 + 前59日收盤價 ) / 60
◎ 以 SMA5 為例 : EXCEL F2儲存格 欄位中,公式如下 :
[ EXCEL 公式解說 ] :
1. F2欄位公式 : =( E2 + SUM( E4628:E4631 )) / 5
2. 公式內 E2 是 今日收盤價,資料由 RTD 連線 XQ 取得,所以是固定欄位。
3. 需要藉由下列 VBA公式,來轉變 前4日收盤價(E4628:E4631) 的資料,因為每天都會新增新的數據資料(含收盤價),所以列數會變。
[ 程式碼 / 台灣50_MA數據更新 ] :
Sub 台灣50_MA數據更新()
Dim lastRow As Integer
Sheets("MA").Select ' 選取:MA工作表,是為了避免當前頁面,不在MA工作表上,而造成數據上的錯誤。
lastRow = Range("A5").End(xlDown).Row ' 藉由 A5 往下搜尋,找出最後一列列號。
' SMA5 均線 :
[F2] = "=( E2 + SUM( E" & lastRow - 3 & " : E" & lastRow & " )) / 5"
' SMA20 均線 :
[G2] = "=( E2 + SUM( E" & lastRow - 18 & " : E" & lastRow & " )) / 20"
' SMA60 均線 :
[H2] = "=( E2 + SUM( E" & lastRow - 58 & " : E" & lastRow & " )) / 60"
[ 程式解說 ] :
0. 首先建立一個 : VBA模組。不了解如何建立,請參考 : 開啟 VBA 程式 – 插入模組。
1. Sub : 副程式名稱 : 台灣50_MA數據更新 。
2. Dim : 宣告變數 lastRow 為整數 : Integer。
3. Sheets(“MA”).Select : 選取:MA工作表。
4. lastRow = Range(“A5”).End(xlDown).Row : 這是 Range指令的用法 。End(xlDown) 參數 — 是EXCEL的快速鍵 : Ctrl + ↓。Row : 是 列 的位置。
※ 意思是 : 點 A5欄,按下 Ctrl + ↓,游標從 A5欄 往下移動,停止在收盤價最後一列的位置 : A4631。參數 Row = 4631。( PS. 值(4631) 再帶給 變數 lastRow 。)
★ 主要目的 : 找出最後一列的位置(lastRow),才能帶進均線公式,計算出 SMA5/SMA20/SMA60 的平均值。
★ Range指令用法 : 請參考 : VBA語法筆記 – Range/End指令。
5. [F2] = “=( E2 + SUM( E” & lastRow – 3 & ” :E” & lastRow & ” )) / 5″ : 這是 文字組合 的用法。意思是 : 將 公式文字 貼到工作表 F2欄 的位置。
※ 工作表 F2 (SMA5) 的 資料編輯列 公式 : =( E2 + SUM( E4628:E4631 )) / 5,這是由上面的程式,轉換過來的,功能是算出收盤價的5日平均值(SMA5)。
★ 文字組合用法 : 請參考 VBA語法筆記 – 文字組合。
6. SMA20 / SMA60 : 同步驟5,只是修改均線數值。
( 2 ) : 策略分析
※ 策略分析 : 包含二部分 —
( 一 ) : 5 ↗ 20 及 5 ↘ 20 買進/賣出 (次數/結算點數/總結算)
( 二 ) : 股價 ↗ 60 及 股價 ↘ 60 買進/賣出 (次數/結算點數/總結算)
如下圖 :
[ 公式設定與解說 ] :
※ 首先我們已將歷史資料的回測數據,做了買/賣標記 : 1,也記錄了買/賣價位,現在只要將其加總,便可得知歷年來總買賣的次數/點數與策略績效。
( PS. 因為有牽扯到最新列數的加總問題,所以還是利用 VBA程式,來做處理。)
[ 程式碼 ] :
' 策略分析 -- 5MA/20MA 次數/點數(加總)
[J2] = "=SUM(J5:J" & lastRow & ")" ' 5 ↗ 20 買進次數(加總)
[K2] = "=SUM(K5:K" & lastRow & ")" ' 5 ↗ 20 買進點數(加總)
[M2] = "=SUM(M5:M" & lastRow & ")" ' 5 ↘ 20 賣出次數(加總)
[N2] = "=SUM(N5:N" & lastRow & ")" ' 5 ↘ 20 賣出點數(加總)
[O2] = "=N2-K2" ' 5MA / 20MA 總結算
' 策略分析 -- 股價/60MA 加總次數/點數(加總)
[Q2] = "=SUM(Q5:Q" & lastRow & ")" ' 股價 ↗ 60 買進次數(加總)
[R2] = "=SUM(R5:R" & lastRow & ")" ' 股價 ↗ 60 買進點數(加總)
[T2] = "=SUM(T5:T" & lastRow & ")" ' 股價 ↘ 60 賣出次數(加總)
[U2] = "=SUM(U5:U" & lastRow & ")" ' 股價 ↘ 60 賣出點數(加總)
[V2] = "=U2-R2" ' 股價 / 60MA 總結算
[ 程式解說 ] :
1. ( J2欄~K2欄 ) / ( M2欄~N2欄 ) / ( Q2欄~R2欄 ) / ( T2欄~U2欄 ) :
◎ 以上欄位,都是利用 SUM加總函數,將買進/賣出的歷史回測數據做加總。J2欄 – 轉換而來的 EXCEL函式為 =SUM(J5:J4645) : 意思是將 J5 ~ J4645(最後一列lastRow) 的次數/點數,做加總(SUM)。
2. ( O2欄 ) / ( V2欄 ) : 結算績效。
◎ O2欄 – 函式為 =N2-K2,意思是將 賣出總點數(N2) 減去 買進總點數(K2),所得的數值,就是這個策略的績效。
[ 注意事項 ] :
※ 做好加總公式的計算後,你要了解一個關鍵點,那就是在初始回測的時候,數據是先觸發買進,還是賣出;還有你目前手上是空手,還是已經有進單;這些都關係到在計算總結算點數時,會不會出錯的問題。
[ 圖例解說 ] :
※ 以下圖為例 ,買進點數(K2欄) : 9882.33點 / 賣出點數(N2欄) : 9784.60點,賣出點數 減去 買進點數 = -97.73點(總結算(O2欄)),但這是錯的,為何?
[解] : 因為次數不同。買進次數(J2欄) : 150次 / 賣出次數(M2欄) : 149次,表示手上還有進單;但上圖數據,直接賣出點數 減去 買進點數,等於是把手上的進單,也一起結算,這樣數據一定錯,所以必須有一個判別的儲存格,來當介質,買進點數先扣除掉手上進單點數(介質),這樣的結算數據,才是正確的。
★ 介質導入 ★
※ 進入重點,目前需要考量介質的數據是 K2欄 跟 R2欄,所以就利用 K3欄 跟 R3欄,來做介質儲存格,記錄進單價位;若手上無單,則顯示 : 0。
[ 程式碼 / 介質導入 ] :
' K3欄 / R3欄 -- 介質導入 :
If [F2] > [G2] And Range("I" & lastRow) = 0 Then [I3] = "進單": [J3] = 1: [K3] = [E2] ' 5 ↗ 20 進單/手上有單 ( K3 顯示:進價 )
If [F2] < [G2] And Range("L" & lastRow) = 1 Then [I3] = "空手": [J3] = 0: [K3] = 0 ' 5 ↘ 20 出單/手上無單 : ( K3 顯示:0 )
If [E2] > [H2] And Range("P" & lastRow) = 0 Then [P3] = "進單": [Q3] = 1: [R3] = [E2] ' 股價 ↗ 60 進單/手上有單 : ( R3 顯示 : 進價 )
If [E2] < [H2] And Range("S" & lastRow) = 1 Then [P3] = "空手": [Q3] = 0: [R3] = 0 ' 股價 ↘ 60 出單/手上無單 : ( R3 顯示 : 0 )
[ 程式解說 ] :
※ ( K3欄 / R3欄 ) : 均為 進單價位(介質)儲存格,其公式就是 剛進單 的判斷式。目的是 : 方便將買進的總點數,直接扣除手上的進單點數,如此便能得知正確的結算數據。
1. ( K3欄 ) : 5 ↗ 20 介質儲存格 — 只有剛進單/剛空手,才會更換顯示資料。所以直接以 VBA語法 來寫,較為方便;否則又得多個 EXCEL 判別欄位。
◎ 剛進單 — VBA公式 : If [F2] > [G2] And Range(“I” & lastRow) = 0 Then [I3] = “進單”: [J3] = 1: [K3] = [E2]
意思是 : 判別是否黃金交叉( 5MA > 20MA ) 及 前一日 I欄 的突破情況,是否為 0。
若 是 (兩條件皆成立) — 在 I3欄 顯示 : 進單,J3欄 顯示 : 1,K3欄 顯示 : E2 (收盤價)資料。
◎ 剛空手 — VBA公式 : If [F2] < [G2] And Range(“L” & lastRow) = 1 Then [I3] = “空手”: [J3] = 0: [K3] = 0
意思是 : 判別是否死亡交叉( 5MA < 20MA ) 及 前一日 L欄 的跌破情況,是否為 1。
若 是 (兩條件皆成立) — 則 I3欄 顯示 : 空手,J3欄 顯示 : 0,K3欄 顯示 : 0。
2. ( N3欄 ) : 股價 ↗ 60 介質儲存格 — 同 5 ↗ 20 介質儲存格 的判別方式。
◎ 剛進單 — VBA公式 : If [E2] > [H2] And Range(“P” & lastRow) = 0 Then [P3] = “進單”: [Q3] = 1: [R3] = [E2]
意思是 : 判別是否黃金交叉( 股價 > 60MA ) 及 前一日 P欄 的突破情況,是否為 0。
若 是 (兩條件皆成立) — 在 P3欄 顯示 : 進單,Q3欄 顯示 : 1,R3欄 顯示 : E2 (收盤價)資料。
◎ 剛空手 — VBA公式 : If [E2] < [H2] And Range(“S” & lastRow) = 1 Then [P3] = “空手”: [Q3] = 0: [R3] = 0
意思是 : 判別是否死亡交叉( 股價 < 60MA ) 及 前一日 S欄 的跌破情況,是否為 1。
若 是 (兩條件皆成立) — 則 P3欄 顯示 : 空手,Q3欄 顯示 : 0,R3欄 顯示 : 0。
★ J2 / K2 / Q2 / R2 欄 — VBA公式修正 ★
[ 注意 ] :
※ 原 J2 / K2 / Q2 / R2 欄 公式,先以加總作處理,現在加入介質判斷,其VBA加總公式,也必須加以修正。
[ 修正 VBA程式 ] :
[ 程式碼 / VBA公式修正 ] :
' 策略分析 -- 5↗20 加總次數/點數 :
[J2] = "=SUM(J5:J" & lastRow & ")-J3" ' 加總買進次數 減去 J3 (標記)
[K2] = "=SUM(K5:K" & lastRow & ")-K3" ' 加總買進點數 減去 K3 (標記點數)
' 策略分析 -- 股價↗60 加總次數/點數 :
[Q2] = "=SUM(Q5:Q" & lastRow & ")-Q3" ' 加總買進次數 減去 Q3 (標記)
[R2] = "=SUM(R5:R" & lastRow & ")-R3" ' 加總買進點數 減去 R3 (標記點數)
[ 程式解說 ] :
☆ 5 ↗ 20 策略 :
1. ( J2欄 )買進次數 — 原加總程式為 =SUM(J5:J4640),現修正為 : =SUM(J5:J4640)-J3。
2. ( K2欄 )買進點數 — 原加總程式為 =SUM(K5:K4640),現修正為 : =SUM(K5:K4640)-K3。
◎ 增加了介質判斷,手上有進單時 : K3欄 會有進單標記 : 1,則將以扣除;空手時 : J3欄 的進單標記為 0,即使扣除,也無大礙。
☆ 股價 ↗ 60 策略 :
1. ( Q2欄 )買進次數 — 原加總程式為 =SUM(Q5:Q4640),現修正為 : =SUM(Q5:Q4640)-Q3。
2. ( R2欄 )買進點數 — 原加總程式為 =SUM(R5:R4640),現修正為 : =SUM(R5:R4640)-R3。
◎ 因為增加了介質判斷,所以以上的公式後端多加個 扣除 買進次數標記(J3欄/Q3欄) 及 買進點數標記(K3欄/R3欄) 的指令,即可達成目的。
( 舉例 : 手上有進單時 : J3欄 會有進單次數,則將以扣除;空手時 : J3欄 的數值為 0,即使扣除,也無大礙。)
★ 手動資料修補 ★
[ 注意 ] :
☆ 這件事很重要,當你完成以上步驟後,你會發現(下圖桔框內)沒有資料,但程式並沒有問題,問題是出在你下載歷史資料的時間點(2022/04/07),已經過了買進觸發日(2022/03/23),所以它不會去觸發變更條件。
※ 原本想以程式 [K65536].End(xlUp).Value 自動抓取 剛突破 : 138.10點的資料,但會卡住。因為我為了教學方便,將公式與資料,以全複製的方式來處理,導致使用 CTRL + ↑,游標會停止在有公式的最後一列,而抓不到 138.10點,所以 …… ,請手動處理了。 ^_^
◎ 當你製作此程式時,要注意二種情況 :
1. 買進次數(J2欄) 比 買出次數(M2欄) 大1 : 表示 : 手上有進單。
此時,就從 K欄最後一列,往上找,找到 : 138.10,這就是 觸發買進 的價位,請手動將 138.10 的數值,填寫或複製到 K3欄,並在 I3欄 – 填上文字 : 進單 / J3欄 – 填上數值 : 1。( PS. 紫框內數值 : 150,會自動變更為 149。)
2. 買進次數(Q2欄) 等於 買出次數(T2欄) : 表示 : 手上沒單(空手)。
此時,資料是正確的,只是 P3 / Q3 / R4欄 沒有資料。 想增加也行,P3欄 – 填上 : 空手 / Q3欄 – 填上 : 0 / R3欄 – 填上 : 0。
◎ PS. 以上兩種情況,若不想處理也沒關係,只是要等到再觸發一次 觸發買進 的指令,介質資料才會正常。
每日數據更新
※ 以上兩個區塊的程式設定,已完成。但少了每日更新數據的動作,等於沒用,所以要再製作一個 每日數據更新 的 VBA程式,才能達成自動化的目的。
[ 公式設定與解說 ] :
◎ 複製即時數據 : 選取 A2 ~ H2欄 的資料,複製到 A欄最後一列 的下一列(無資料的新列)。★ 提醒 : 複製成 數值 資料( xlPasteValues )。
◎ 複製策略分析 : 選取 I欄 ~ U欄 最後一列的資料,複製到 I欄最後一列 的下一列(無資料的新列)。★ 提醒 : 複製成 公式 資料( xlPasteFormulas )。
[ 程式碼 / 複製今日數據 ] :
lastRow = Range("A5").End(xlDown).Row ' 藉由 A5 往下搜尋,找出最後一列列號。
' 複製今日數據 & MA數據
Range("A2:H2").Copy
Range("A" & lastRow + 1).Select
Selection.PasteSpecial Paste:=xlPasteValues
' 複製策略分析公式
Range("I" & lastRow & ":U" & lastRow).Copy
Range("I" & lastRow + 1).Select
Selection.PasteSpecial Paste:=xlPasteFormulas
[ 程式解說 ] :
1. 首先,藉由 A5 往下搜尋出歷史資料的最後一列列號,其值帶給 變數 lastRow。
————————————————————————————————–
2. Range(“A2:H2”).Copy : 複製 A2欄 ~ H2欄 的資料。
3. Range(“A” & lastRow + 1).Select : 選取要複製到的新欄位起點位置( A欄最後一列 再 +1 )。
4. Selection.PasteSpecial Paste:=xlPasteValues : 貼上複製資料,請注意看使用的參數 : xlPasteValues,此參數用法 : 依字面意思 — 貼成數值。
————————————————————————————————–
5. Range(“I” & lastRow & “:U” & lastRow).Copy : 複製前一日的回測公式, I欄最後一列 ~ U欄最後一列 的公式資料。
6. Range(“I” & lastRow + 1).Select : 選取要複製到的新欄位起點位置( I欄最後一列 再 +1 )。
7. Selection.PasteSpecial Paste:=xlPasteFormulas : 貼上複製資料,請注意看使用的參數 : xlPasteFormulas,此參數用法 : 依字面意思 — 貼成公式。
製作 更新數據 按鈕
※ 數據完成,程式也搞定,就在 下午:01:30 台股收盤後,一鍵完成 — 數據自動更新吧 !
[ 更新數據_按鈕製作 ] :
1. 按鈕製作方法 : 請參考 — VBA 按鈕製作。
2. 指定巨集 : 游標移動到 更新數據 按鈕上,按 滑鼠右鍵,點選 : 指定巨集。
3. 確定巨集名稱 : 出現 指定巨集 視窗後,選取 : 台灣50_MA數據更新 巨集名稱 。
均線 策略回測分析
關於「 回測 」– 意思是 : 根據歷史資料來驗證投資人的進場策略,是否可行。講白就是「 能不能賺錢 」。
哪 …… ? 能賺錢嗎 ?
◎「 口說無憑 」– 最好是以回測數據,來證明策略的可行性。
既然如此,便針對以下三組策略( 均線進場策略 / 無腦存股法 / 均線策略存股法 ),來作回測分析。
均線 進場策略回測數據
[ 均線 進場策略 / 回測總結算 ] : 2003/06/30 ~ 2022/04/20,約莫 : 20年。
1. 策略一 : 5 ↗ 20 突破次數 ( 買進 ) / 5 ↘ 20 跌破次數 ( 賣出 ) : 總結算 — 獲利 : 36.82點。
2. 策略二 : 股價 ↗ 60 突破次數 ( 買進 ) / 股價 ↘ 60 跌破次數 ( 賣出 ) : 總結算 — 獲利 : 51.78點。
※ 以上兩種策略方法 : 回測時間 20年,均有獲利,只是少了些,即使再加上歷年除息 : 41.6點(參考:下圖),也不到百點(不到台幣10萬元);若是再扣掉 : 149次手續費,哪就 …… !
☆ 既然 均線進場策略 獲利不算理想,哪就再試試 無腦存股法 跟 均線策略存股法 的回測績效。
無腦存股法 回測數據
※ 無腦存股法 : 意思是 不必理會漲跌,採取 固定時間 / 固定金額 的方式,買進0050,當成存股,每年固定領股息;因台股有長期多頭的趨勢,同時能享有利差。
[ 無腦存股法 回測總結算 ] : 2003 ~ 2022年,約莫 : 20年。
◎ 固定時間 : 為了方便回測,所以設定在 交換月的第一天 為買進時間。
[ 疑問 ] : 為何不設定 5日/10日領薪日 為買進日期?
※ 因為有可能這兩天為休假日,股市沒交易,就不會有歷史資料,而造成回測錯誤。( PS. 避免程式複雜,就以簡單的判斷式來處理。)
◎ 固定金額 : 為了方便計算,以每月定時買進一張0050,是最方便的。但一張的金額太高,以現在的股價,每個月要支付10幾萬,這不合乎小資族需求,所以再加上一個回測參數 : 每月買進 5000元 或 3000元台幣(可依照需求更改金額),來計算實際獲利。
[ 操作步驟 ] :
1. 首先將 X1欄 ~ AB1欄 及 X4 ~ AB4欄 的標題,依照上圖填寫。
2. 依照標題所示,分成兩組策略進行 :
◎ 策略一/定時買進一張 : 顯示欄位 : X欄 ~ Z欄。
◎ 策略二/定時買進5000 : 顯示欄位 : AA欄 ~ AB欄。
3. 回測0050歷史資料 : 定時觸發(交換月的第一天)買進動作。
[ 程式碼 / 0050_定時定額_更新數據 ] :
Sub 0050_定時定額_更新數據()
Dim lastRow As Integer
Sheets("MA").Select '選取MA工作表
lastRow = Range("A5").End(xlDown).Row ' 藉由 A5 往下搜尋,找出最後一列列號。
For I = 5 To lastRow
If Mid(Format(Range("A" & I), "yyyy/mm/dd"), 6, 2) <> Mid(Format(Range("A" & I - 1), "yyyy/mm/dd"), 6, 2) Then
If I <> 5 Then
Range("X" & I) = 1 ' X欄位標記 : 買進位置
Range("Y" & I) = Range("E" & I) ' Y欄位標記 : 收盤價 (買進)
Range("AA" & I) = "=AA4 / X" & I ' 計算股數 -- 定額(5000) / 當日收盤價
Range("AB" & I) = "=(E2-X" & I & ")*" & "AA" & I & "/1000" ' 計算獲利點數 -- (今日收盤價 - 當日收盤價) * 買進股數 / 1000
End If
End If
Next
[X2] = "=SUM(X5:X" & lastRow & ")" ' 定時一張 : 買進總張數
[Y2] = "=SUM(Y5:Y" & lastRow & ")" ' 定時一張 : 買進總點數
[Z2] = "=E2 * X2 - Y2" ' 定時一張 : 獲利總點數"
[AA2] = "=SUM(AA5:AA" & lastRow & ")" ' 定額 : 買進總股數
[AB2] = "=SUM(AB5:AB" & lastRow & ")" ' 定額 : 獲利總點數
End Sub
[ 程式解說 ] :
0. 首先建立一個 : VBA模組。不了解如何建立,請參考 : 開啟 VBA 程式 – 插入模組。
1. Sub : 副程式名稱 : 台灣50_定時定額_更新數據()。
2. Dim : 宣告變數 lastRow 為整數 : Integer。
3. Sheets(“MA”).Select : 選取 MA工作表。
4. lastRow = Range(“A5”).End(xlDown).Row : 找出最後一列的位置(lastRow)。
5. For I = 5 To lastRow : 使用 For迴圈 — 從第5列執行到最後一列。
★ [ 判斷式 ] : 條件觸發 : 交換月的第一天 — 買進 ★
[ For迴圈內的操作步驟 ] :
A. 交換月判別 : 作法是 今天的日期 跟 前一天的日期 做比較;若不同,表示 : 剛換月。
◎ IF 判斷式,則寫成 — If Mid(Format(Range(“A” & I), “yyyy/mm/dd”), 6, 2) <> Mid(Format(Range(“A” & I – 1), “yyyy/mm/dd”), 6, 2) Then
※ 首先,為了判斷月份的不同,須將日期格式統一,使用語法 : Format(Range(“A” & I), “yyyy/mm/dd”)。
意思是將 A欄的日期,設定成 “yyyy/mm/dd”(例:2003/06/30)格式,再利用處理字串的 MID函式,擷取出 mm 的月份資料,來做前/後月份的比較。
◎ MID函式用法 : Mid(Format(Range(“A” & I), “yyyy/mm/dd”), 6, 2) 意思是從日期字串(2003/06/30)中的第 6 個字元開始擷取(抓到 0),抓取 2 個字元,所以會擷取出 06 兩個字元。
B. If I <> 5 Then : 這是避免錯誤的判別式。
◎ 目的是 : 開頭第5列不要做換月的判斷。因為若少了這行判別指令,第5列日期就會跟第4列標題文字(時間)做比較,答案肯定是不同,既然不同,Y5欄就會列出買進資料,這樣就錯了。
C. 經過上列判別式,若 剛換月 條件成立,則執行以下動作 :
[ 定時 1 張 ] :
◎ Range(“X” & I) = 1 : 意思是 在X欄,標記 : 數值 1,為了最後做加總,計算總買進張數。
◎ Range(“Y” & I) = Range(“E” & I) : 意思是 將E欄(收盤價) 複製並標記到 X欄(買進欄位),這就是定時買進的價位。
[ 定額5000 ] :
◎ Range(“AA” & I) = “=AA4 / Y” & I : 因為是定時定額(5000元)買進,所以要根據當日收盤價來計算,實際買進多少股數的0050。
( PS. 為了不把程式寫死,能夠隨意變更 定額 資料,所以將程式寫成 EXCEL公式( “=AA4 / X” & I ),黏貼至當日的AA欄,隨後只要更改 AA4欄(定額買進)的金額,歷史回測的資料也會一同更新。)
◎ Range(“AB” & I) = “=(E2-Y” & I & “)*” & “AA” & I & “/1000” : 標記 獲利點數 = (今日收盤價 – 當日收盤價) * 買進股數 / 1000。
( PS. 以 AB6欄位 的公式為例 : =(E2-X6)*AA6/1000,則計算出的獲利點數 = 12.44點。)
6. For迴圈結束,進行最後總結。參考上圖 —
[ 定時 1 張 ] :
◎ [X2] = “=SUM(X5:X” & lastRow & “)” : 計算 — 買進總張數 ( 加總 X5 ~ X欄最後一列 的買進次數 : 1次1張 )
◎ [Y2] = “=SUM(Y5:Y” & lastRow & “)” : 計算 — 買進總點數 ( 加總 Y5 ~ Y欄最後一列 的買進點數 )
◎ [Z2] = “=E2 * Y2 – X2” : 獲利總點數 = 今日收盤價(E2) * 買進總張數(Y2) - 買進總點數(X2)
[ 定額5000 ] :
◎ [AA2] = “=SUM(AA5:AA” & lastRow & “)” : 計算 — 買進總股數 ( 加總 AA5 ~ AA欄最後一列 的買進股數 ),上圖AA2欄位 : 18542.52股 / 1000股 = 18.542張。
◎ [AB2] = “=SUM(AB5:AB” & lastRow & “)” : 計算 — 獲利總點數 ( 加總 AB5 ~ AB欄最後一列 的獲利點數 )
[ 無腦存股法 回測績效 ] : 0050 以 2022/04/21 收盤價 : 132.75元計算 —
※ 定時 1 張 : 經20年結算,總買進點數 : 15176.52點(投資成本 : 1517.6萬元),總買進張數 : 226張,總獲利 : 14824.98點(相當於1482.5萬元)。
※ 定額5000 : 經20年結算,總買進股數 : 18542.52股( =18張542股 ),總獲利 : 1331.52點(相當於133.15萬元)。
( PS. 以上兩組策略,皆有將近一倍的獲利,均不含歷年股息發放。)
製作 定時定額 更新數據按鈕
[ 更新數據_按鈕製作 ] :
◎ 同 均線_策略分析 更新數據按鈕 的製作一樣。
1. 按鈕製作方法 : 請參考 — VBA 按鈕製作。
2. 指定巨集 : 游標移動到 更新數據 按鈕上,按 滑鼠右鍵,點選 : 指定巨集。
3. 確定巨集名稱 : 出現 指定巨集 視窗後,選取 : 台灣50_定時定額_更新數據 巨集名稱 ,即可。
均線 策略存股法 回測數據
※ 均線 策略存股法 : 為了避免投資人擔心定時定額買進,會有買在高檔的疑慮,便將 無腦存股法 改以 技術分析 的進場條件,為 固定金額 買進的訊號,當作存股策略。
[ 均線 策略存股法 / 回測總結算 ] : 2003 ~ 2022年,約莫 : 20年。
◎ 依據策略進場條件( 5 ↗ 20 及 股價 ↗ 60 )的方式,進場買進,當作存股,來回測其獲利績效。
[ 操作步驟 ] :
1. 首先將 AD1欄 ~ AI1欄 的標題,依照上圖填寫。
2. 依照 AE4欄 及 AH4欄 的標題所示,分成兩組策略進行 :
◎ 策略一 / 5 ↗ 20 : 顯示欄位 : AD欄 ~ AF欄。
◎ AD2欄(總張數) : 填入公式 ( =J2 ),等同於 5 ↗ 20 策略的 J2欄(買進總張數)。
◎ AE2欄(買進總點數) : 填入公式 ( =K2 ),直接以 5 ↗ 20 策略的 K2欄(買進總點數),拿來當作買進成本。
◎ AD2欄(獲利總點數) : 填入公式 ( =E2 * AD2 – AE2 )。意思是 : 今日收盤價 * 買進總張數 – 買進成本(總點數) = 獲利點數。參考上圖 — 獲利 : 10030.17點。
◎ 策略二 / 股價 ↗ 60 : 顯示欄位 : AG欄 ~ AI欄。
◎ AG2欄(總張數) : 填入公式 ( =Q2 ),等同於 股價 ↗ 60 策略的 Q2欄(買進總張數)。
◎ AH2欄(買進總點數) : 填入公式 ( =R2 ),直接以 股價 ↗ 60 策略的 R2欄(買進總點數),拿來當作買進成本。
◎ AI2欄(獲利總點數) : 填入公式 ( =E2 * AG2 – AH2 )。意思是 : 今日收盤價 * 買進總張數 – 買進成本(總點數) = 獲利點數。參考上圖 — 獲利 : 9805.62點。
[ 均線 策略存股法 / 回測績效 ] : 0050 以 2022/04/21 收盤價 : 132.75元計算 —
※ 5 ↗ 20 買進 : 經20年結算,總買進點數 : 9882.33點(投資成本 : 988.23萬元),總買進張數 : 150張,總獲利 : 10030.17點(相當於1003.02萬元)。
※ 股價 ↗ 60 買進 : 經20年結算,總買進點數 : 10637.88點(投資成本 : 1063.79萬元),總買進張數 : 154張,總獲利 : 9805.62點(相當於980.56萬元)。
( PS. 以上兩組策略,皆有一倍上下的獲利,均不含歷年股息發放。)
完整程式碼
Sub 台灣50_MA數據更新()
Dim lastRow As Integer
Sheets("MA").Select '選取MA工作表
lastRow = Range("A5").End(xlDown).Row ' 藉由 A5 往下搜尋,找出最後一列列號。
' K3欄 / R3欄 -- 介質導入 :
If [F2] > [G2] And Range("I" & lastRow) = 0 Then [I3] = "進單": [J3] = 1: [K3] = [E2] ' 5 ↗ 20 進單/手上有單 ( K3 顯示:進價 )
If [F2] < [G2] And Range("L" & lastRow) = 1 Then [I3] = "空手": [J3] = 0: [K3] = 0 ' 5 ↘ 20 出單/手上無單 : ( K3 顯示:0 )
If [E2] > [H2] And Range("P" & lastRow) = 0 Then [P3] = "進單": [Q3] = 1: [R3] = [E2] ' 股價 ↗ 60 進單/手上有單 : ( R3 顯示 : 進價 )
If [E2] < [H2] And Range("S" & lastRow) = 1 Then [P3] = "空手": [Q3] = 0: [R3] = 0 ' 股價 ↘ 60 出單/手上無單 : ( R3 顯示 : 0 )
' 複製今日數據 & MA數據
Range("A2:H2").Copy
Range("A" & lastRow + 1).Select
Selection.PasteSpecial Paste:=xlPasteValues
' 複製策略分析公式
Range("I" & lastRow & ":U" & lastRow).Copy
Range("I" & lastRow + 1).Select
Selection.PasteSpecial Paste:=xlPasteFormulas
' 當日收盤,資料複製完畢後,重新建置分析公式,以應付明日開盤。
lastRow = Range("A5").End(xlDown).Row
' SMA5 均線 :
[F2] = "=( E2 + SUM( E" & lastRow - 3 & " : E" & lastRow & " )) / 5"
' SMA20 均線 :
[G2] = "=( E2 + SUM( E" & lastRow - 18 & " : E" & lastRow & " )) / 20"
' SMA60 均線 :
[H2] = "=( E2 + SUM( E" & lastRow - 58 & " : E" & lastRow & " )) / 60"
' 策略分析 -- 5MA/20MA 次數/點數(加總)
[J2] = "=SUM(J5:J" & lastRow & ")" ' 5 ↗ 20 買進次數(加總)
[K2] = "=SUM(K5:K" & lastRow & ")" ' 5 ↗ 20 買進點數(加總)
[M2] = "=SUM(M5:M" & lastRow & ")" ' 5 ↘ 20 賣出次數(加總)
[N2] = "=SUM(N5:N" & lastRow & ")" ' 5 ↘ 20 賣出點數(加總)
[O2] = "=N2-K2" ' 5MA / 20MA 總結算
' 策略分析 -- 股價/60MA 加總次數/點數(加總)
[Q2] = "=SUM(Q5:Q" & lastRow & ")" ' 股價 ↗ 60 買進次數(加總)
[R2] = "=SUM(R5:R" & lastRow & ")" ' 股價 ↗ 60 買進點數(加總)
[T2] = "=SUM(T5:T" & lastRow & ")" ' 股價 ↘ 60 賣出次數(加總)
[U2] = "=SUM(U5:U" & lastRow & ")" ' 股價 ↘ 60 賣出點數(加總)
[V2] = "=U2-R2" ' 股價 / 60MA 總結算
[A2].Select
End Sub
[ 溫馨提醒 } :
完整程式碼的執行程序,跟文章敘述順序,有些不同。例如 : 介質導入 & 複製數據的部分。
主要的原因是 先判別介質條件,有助於簡化程式碼,方便於下一步複製的動作,也不會影響到後續建立策略分析的步驟。
結論
這篇 0050 均線 回測程式 的策略設計,主要針對0050的歷史資料,利用 均線進場策略(技術分析) / 無腦存股法(定時定額) 及 均線策略存股法(技術分析定額投資)等策略,來作數據回測,計算並比較各自績效,再加上每天的數據更新,以達到自動化分析的目的。
雖說 均線進場策略 的獲利,不算理想。但策略是活的,可以隨自己的想法,設定 進/出場 參數,修正獲利的 %數,直到試出 高獲利 的交易策略為止。
而且它只需要一組資金來操作,資金運作上會較為靈活。
至於 無腦存股法,回測數據實在誘人,四組存股策略都有翻倍的獲利績效,還不包含歷年股息發放。但你想要有這樣的績效,也要有過人之處,哪就是頻創歷史新高之際,你不為所動,堅決不賣;黑天鵝漫天飛舞,你也無所畏懼,持續加碼,就這樣堅持20年,你能嗎 ?
每種投資法都有優缺點,端看你如何來操作。若你是上班族無法專心看盤,或者你是小資/存股族,想定時定額存股,上述的回測數據,提供你作參考。
[ 提醒 ] : 若你依照我的操作步驟來製作回測程式,絕不會有問題。問題在於你的回測數據一定跟我的不同,因為你回測的日期一定跟我的不一樣,回測結果也就不一樣;若你有疑問,不知道數據是否正確,歡迎你來詢問,我可以跟你比對數據,這樣就不會有問題。
非常感謝您看到最後,若在閱讀的過程中,有任何疑問,歡迎您利用左下角 Messenger 直接提問或寫信給我,我會盡快回覆您,最後感謝您的閱讀,感恩 !
( PS. 如果喜歡 股小白 的文章,歡迎到 股小白臉書粉絲頁 點讚,衝人氣,目前不定期分析大盤趨勢,將來會有 每日公報 : 分析並公布跑分的個股資料,讓大家作為投資參考。 )
關 聯 文 章
1. 你知道0050怎樣買,賺最多? — 好用的 台灣50即時分析系統
- 大盤數據 及 股票資料擷取 是研究股市歷史脈動的必要程序,這可藉由EXCEL的表格設計,程式的撰寫,再透過DDE串接券商的資料源,就能針對財經數據做進一步的匯整與運算分析,大大節省許多抓取資料的時間,讓分析工作能更順利的進行。
2. 讓你獲利翻倍的投資法 – 0050均線回測程式
- 0050均線回測程式 : 主要是利用均線策略,針對0050的歷史資料,作績效回測。
◎ 內文包含 : 黃金交叉買進/死亡交叉賣出的實際績效,小資族瘋投資–定時定額的存股績效,以及如何達到獲利翻倍的手把手策略教學 — 程式的概念 / 設計 / 操作步驟,皆在文中詳細說明。
3. 高達 114.60% 的獲利策略 – 0050KD指標回測程式
- 0050KD指標回測程式 : 主要是利用KD指標的進出場策略,針對0050的歷史資料,作績效回測。
◎ 內文 : 針對 KD指標 的 超買 / 超賣區,進行多組策略回測,同時也提供 定額存股 的投資績效,做為比較,文中對於 台灣50KD指標回測程式 的概念 / 設計 / 操作步驟,皆有詳盡的圖文說明。
- 0050布林通道回測程式 : 主要是以布林通道(上/下軌)技術指標,當做進出場條件,針對0050的歷史資料,作績效回測。
◎ 內文 : 針對 布林通道 的 上軌/下軌 指標,進行 多/空 雙向策略回測,同時也提供 定額存股 的投資績效,做為比較,文中對於 台灣50布林通道回測程式 的概念 / 設計 / 操作步驟,皆有詳盡的圖文說明。
★ 這四篇文章,資料互相關聯,有興趣學習的朋友,請依照文章順序及內文的操作步驟,一步步完成,就能順利架起 大盤歷史資料自動儲存系統。
V B A 資 源
- EXCEL & VBA功能 筆記 : 將針對文章中所使用的 EXCEL 及 VBA公式 / 工具操作 / 巨集設定 / 控制項的運用,做個整合記錄,方便大家在學習當下的參考與使用。
- VBA 提供相當多的指令用法,VBA指令 彙整筆記,將會陸續記錄 VBA文章 中,所用過的 VBA指令,方便學員們對照運用。
- 語法就是程式的文法。 使用者要與電腦溝通,就必須遵守這些規則。VBA程式語法 筆記 : 將針對 VBA文章 中所使用的 VBA程式語法,做個整合記錄,方便大家在學習當下參考與使用。