[VBA] 讓你獲利翻倍的投資法 – 0050 均線 回測程式

0050 均線 回測程式

此篇文章是 0050即時分析系統 的延伸,主要是藉由 MA均線 的歷史資料,來分析 黃金/死亡交叉/出場 的回測策略,同時與時下最夯的小資族 定時定額無腦存股法,來作比較,看其績效為何 ?

※ 所謂「 數據會說話 」,這就開始製作並解說 MA均線 回測程式的操作步驟,讓大家了解 — 如何達成翻倍獲利 !
( PS. 若對 均線 定義不了解的話,請先參考 : 移動平均線 ( MA )

[ 操作步驟 ] :
1. 複製歷史資料 :元大台灣50 工作表內的資料欄位複製到 MA工作表
( PS. 因為只針對 MA均線 作回測,所以只複製基本欄位 : 時間 + 開 / 高 / 低 / 收 + SMA均線 的欄位資料,如下圖。)


2. 1 ~ 3列 插入空白列 : 為了做數據分析之用。


3. 填入需要的欄位名稱 : 依照下圖 — 紅框 / 桔框 位置,填入各欄位標題名稱。
台灣50均線回測程式

4. 載入各項判別公式 : 依照上圖 — /框,分成 : 兩個區塊 — () : 即時數據 + 策略分析 / () : 歷史資料分析,來載入相關的判別公式。

() : 歷史資料分析

※ 首先,先製作 台灣50均線回測程式 — () : 歷史資料分析 桔框部分,標題內,有兩組黃金交叉買進策略 :
( 一 ) : 5 ↗ 20 / I 欄位 : 5MA 向上穿過 20MA
( 二 ) : 股價 ↗ 60 / N 欄位 : 歷史收盤價 向上穿過 60MA

MA 均線 策略(一)

策略條件 :
( 一 ) : 買進 / 5MA20MA –黃金交叉
( 二 ) : 賣出 / 5MA20MA — 死亡交叉

買進 策略條件 : 5MA 向穿過 20MA (黃金交叉)。

[ 公式設定與解說 ] :
——————————————————————————————————————————————
[ I5 儲存格 – 突破(信號)標記 ]
突破 信號公式 : =IF(G5=”N/A”,0,IF(F5>G5,1,0)),這組公式內含雙層式的IF判斷式,用來判斷是否為突破

◎ EXCLE函數寫法 : 如下 :
台灣50均線回測程式

第 1 層 IF : =IF(G5=”N/A”,0,IF(F5>G5,1,0)) :
※ 意思是 : 先判別 G5 資料,是否正確。若為 N/AI5欄 顯示 : 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函數寫法 : 如下 :
台灣50均線回測程式

第 1 層 IF : =IF(G5=”N/A”,“”,IF(AND(I4=0,I5=1),1,””)) :
※ 同上,判別 G5SMA20資料,是否正確。若為 N/AJ5欄 顯示 : ” “ (空白),表示資料錯誤;非N/A,則進入 第 2 層 IF 判別式。

第 2 層 IF : IF(AND(I4=0,I5=1),1,“”) :
※ 意思是 : 使用 AND邏輯函數,同時判別 I4欄(前一日信號),是否為 0I5欄(今日信號),是否為 1。 ( 請先參考 I欄 信號解說 )。
◎ 若為 (I4=0,I5=1) : 表示今日剛突破,則 J5欄 顯示 1 (標記買進位置)。
◎ 若為 : 意思是 – 只要不是剛突破(I4=0,I5=1),J5欄 便顯示 ” “

——————————————————————————————————————————————
[ K5 儲存格 – 標記買進價 ]
買進價 標記公式 : =IF(J5=1,E5,””),用來判斷 J5欄 是否有 買進 標記 1

◎ EXCLE函數寫法 : 如下 :
台灣50均線回測程式

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函數寫法 : 如下 :
台灣50均線回測程式

第 1 層 IF : =IF(G5=”N/A”,0,IF(F5<G5,1,0)) :
※ 意思是 : 先判別 G5 資料,是否正確。若為 N/AL5欄 顯示 : 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函數寫法 : 如下 :
台灣50均線回測程式

第 1 層 IF : =IF(G5=”N/A”,“”,IF(AND(L4=0,L5=1),1,””)) :
※ 同上,判別 G5SMA20資料,是否正確。若為 N/AM5欄 顯示 : ” “ (空白),表示資料錯誤;非N/A,則進入 第 2 層 IF 判別式。

第 2 層 IF : IF(AND(L4=0,L5=1),1,“”) :
※ 意思是 : 使用 AND邏輯函數,同時判別 L4欄(前一日信號),是否為 0L5欄(今日信號),是否為 1。 ( 請參考 : 突破信號標示條件 )。
◎ 若為 (L4=0,L5=1) : 表示今日剛跌破,則 M5欄 顯示 1 (標記賣出位置)。
◎ 若為 : 意思是 – 只要不是剛跌破(L4=0,L5=1),M5欄 便顯示 ” “

——————————————————————————————————————————————
[ N5 儲存格 – 標記賣出價 ]
賣出價 標記公式 : =IF(M5=1,E5,””),用來判斷 J5欄 是否有 賣出 標記 1

◎ EXCLE函數寫法 : 如下 :
台灣50均線回測程式

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函數寫法 : 如下 :
台灣50均線回測程式

第 1 層 IF : =IF(H5=”N/A”,0,IF(E5>H5,1,0)) :
※ 意思是 : 先判別 H5 資料,是否正確。若為 N/AP5欄 顯示 : 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函數寫法 : 如下 :
台灣50均線回測程式

第 1 層 IF : =IF(H5=”N/A”,””,IF(AND(P4=0,P5=1),1,””)) :
※ 同上,判別 H5SMA60資料,是否正確。若為 N/AQ5欄 顯示 : ” “ (空白),表示資料錯誤;非N/A,則進入 第 2 層 IF 判別式。

第 2 層 IF : IF(AND(P4=0,P5=1),1,“”) :
※ 意思是 : 使用 AND邏輯函數,同時判別 P4欄(前一日信號),是否為 0P5欄(今日信號),是否為 1。 ( 請參考 : 突破信號標示條件 )
◎ 若為 (P4=0,P5=1) : 表示今日剛突破,則 Q5欄 顯示 1 (標記買進位置)。
◎ 若為 : 意思是 – 只要不是剛突破(P4=0,P5=1),Q5欄 便顯示 ” “

——————————————————————————————————————————————
[ R5 儲存格 – 標記買進價 ]
買進價 標記公式 : =IF(Q5=1,E5,””),用來判斷 Q5欄 是否有 買進 標記 1

◎ EXCLE函數寫法 : 如下 :
台灣50均線回測程式

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函數寫法 : 如下 :
台灣50均線回測程式

第 1 層 IF : =IF(H5=”N/A”,0,IF(E5<H5,1,0)) :
※ 意思是 : 先判別 H5 資料,是否正確。若為 N/AS5欄 顯示 : 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函數寫法 : 如下 :
台灣50均線回測程式

第 1 層 IF : =IF(H5=”N/A”,“”,IF(AND(S4=0,S5=1),1,””)) :
※ 同上,判別 H5SMA60資料,是否正確。若為 N/AT5欄 顯示 : ” “ (空白),表示資料錯誤;非N/A,則進入 第 2 層 IF 判別式。

第 2 層 IF : IF(AND(S4=0,S5=1),1,“”) :
※ 意思是 : 使用 AND邏輯函數,同時判別 S4欄(前一日信號),是否為 0S5欄(今日信號),是否為 1。 ( 請參考 : 突破信號標示條件 )。
◎ 若為 (S4=0,S5=1) : 表示今日剛跌破,則 T5欄 顯示 1 (標記賣出位置)。
◎ 若為 : 意思是 – 只要不是剛跌破(S4=0,S5=1),T5欄 便顯示 ” “

——————————————————————————————————————————————
[ U5 儲存格 – 標記賣出價 ]
賣出價 標記公式 : =IF(T5=1,E5,””),用來判斷 T5欄 是否有 賣出 標記 1

◎ EXCLE函數寫法 : 如下 :
台灣50均線回測程式

IF 判斷式 : =IF(T5=1,E5,“”) :
※ 主要目的是 : 判斷 T5欄 是否有標記 1 (賣出標記)。( PS. 公式也可以寫成 : =IF(T5<>””,E5,””),功能相同。)
◎ 若 : 表示觸發賣出,則 U5欄 顯示 E5 (收盤價)。
◎ 若 : U5欄 則顯示 ” “

公式延伸複製

※ 完成 策略一 / 策略二 的公式設定後,便可將公式往下延伸複製,複製到最新一筆資料。

延伸複製方法 ] : 步驟如下 —
◎ 選取 I5 ~ U5 欄位資料,將滑鼠游標移到 U5儲存格的右下角,此時游標會變成 (十字),然後滑鼠左鍵點二下,公式便會往下延伸複製到最後一列。
台灣50均線回測程式

◎ 延伸複製後,資料如下 :
台灣50均線回測程式

[ 圖例 ] : 進/出場 收盤價標記

5MA/20MA股價/60MA /場 收盤價標記 :
台灣50均線回測程式

() : 即時數據 + 策略分析

※ 製作完 () : 歷史資料分析 回測部分,便繼續製作 () : 即時數據 + 策略分析

( 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儲存格 欄位中,公式如下 :
台灣50均線回測程式

[ 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 ↗ 205 ↘ 20 買進/賣出 (次數/結算點數/總結算)
( 二 ) : 股價 ↗ 60股價 ↘ 60 買進/賣出 (次數/結算點數/總結算)

如下圖 :
台灣50均線回測程式

[ 公式設定與解說 ] :
※ 首先我們已將歷史資料的回測數據,做了買/賣標記 : 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
台灣50均線回測程式


[ 程式碼 / 介質導入 ] :
' 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欄 顯示 : 1K3欄 顯示 : 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欄 顯示 : 1R3欄 顯示 : 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),所以它不會去觸發變更條件。
台灣50均線回測程式

※ 原本想以程式 [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 )。
台灣50均線回測程式


[ 程式碼 / 複製今日數據 ] :
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點。
台灣50均線回測程式

2. 策略二 : 股價 ↗ 60 突破次數 ( 買進 ) / 股價 ↘ 60 跌破次數 ( 賣出 ) : 總結算 — 獲利 : 51.78點。
台灣50均線回測程式

※ 以上兩種策略方法 : 回測時間 20年,均有獲利,只是少了些,即使再加上歷年除息 : 41.6點(參考:下圖),也不到百點(不到台幣10萬元);若是再扣掉 : 149次手續費,哪就 …… !


☆ 既然 均線進場策略 獲利不算理想,哪就再試試 無腦存股法均線策略存股法 的回測績效。

無腦存股法 回測數據

無腦存股法 : 意思是 不必理會漲跌,採取 固定時間 / 固定金額 的方式,買進0050,當成存股,每年固定領股息;因台股有長期多頭的趨勢,同時能享有利差。

[ 無腦存股法 回測總結算 ] : 2003 ~ 2022年,約莫 : 20年。
固定時間 : 為了方便回測,所以設定在 交換月的第一天 為買進時間。
台灣50均線回測程式

[ 疑問 ] : 為何不設定 5日/10日領薪日 為買進日期?
※ 因為有可能這兩天為休假日,股市沒交易,就不會有歷史資料,而造成回測錯誤。( PS. 避免程式複雜,就以簡單的判斷式來處理。)

固定金額 : 為了方便計算,以每月定時買進一張0050,是最方便的。但一張的金額太高,以現在的股價,每個月要支付10幾萬,這不合乎小資族需求,所以再加上一個回測參數 : 每月買進 5000元 或 3000元台幣(可依照需求更改金額),來計算實際獲利。
台灣50均線回測程式

[ 操作步驟 ] :
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點。)
台灣50均線回測程式

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股( =18542股 ),總獲利 : 1331.52點(相當於133.15萬元)。
( PS. 以上兩組策略,皆有將近一倍的獲利,均不含歷年股息發放。)

製作 定時定額 更新數據按鈕

[ 更新數據_按鈕製作 ] :
◎ 同 均線_策略分析 更新數據按鈕 的製作一樣。
1. 按鈕製作方法 : 請參考 — VBA 按鈕製作
台灣50均線回測程式

2. 指定巨集 : 游標移動到 更新數據 按鈕上,按 滑鼠右鍵,點選 : 指定巨集
3. 確定巨集名稱 : 出現 指定巨集 視窗後,選取 : 台灣50_定時定額_更新數據 巨集名稱 ,即可。

均線 策略存股法 回測數據

均線 策略存股法 : 為了避免投資人擔心定時定額買進,會有買在高檔的疑慮,便將 無腦存股法 改以 技術分析 的進場條件,為 固定金額 買進的訊號,當作存股策略。

[ 均線 策略存股法 / 回測總結算 ] : 2003 ~ 2022年,約莫 : 20年。
◎ 依據策略進場條件( 5 ↗ 20股價 ↗ 60 )的方式,進場買進,當作存股,來回測其獲利績效。
台灣50均線回測程式

[ 操作步驟 ] :
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指標回測程式 的概念 / 設計 / 操作步驟,皆有詳盡的圖文說明。

4. 穩穩獲利的交易策略 – 0050布林通道回測程式

  • 0050布林通道回測程式 : 主要是以布林通道(上/下軌)技術指標,當做進出場條件,針對0050的歷史資料,作績效回測。
    ◎ 內文 : 針對 布林通道 的 上軌/下軌 指標,進行 多/空 雙向策略回測,同時也提供 定額存股 的投資績效,做為比較,文中對於 台灣50布林通道回測程式 的概念 / 設計 / 操作步驟,皆有詳盡的圖文說明。

★ 這四篇文章,資料互相關聯,有興趣學習的朋友,請依照文章順序及內文的操作步驟,一步步完成,就能順利架起 大盤歷史資料自動儲存系統

V B A 資 源

EXCEL & VBA功能 – 綜合筆記

  • EXCEL & VBA功能 筆記 : 將針對文章中所使用的 EXCEL 及 VBA公式 / 工具操作 / 巨集設定 / 控制項的運用,做個整合記錄,方便大家在學習當下的參考與使用。

VBA指令 – 彙整筆記

  • VBA 提供相當多的指令用法,VBA指令 彙整筆記,將會陸續記錄 VBA文章 中,所用過的 VBA指令,方便學員們對照運用。

VBA程式語法 – 彙整筆記

  • 語法就是程式的文法。 使用者要與電腦溝通,就必須遵守這些規則。VBA程式語法 筆記 : 將針對 VBA文章 中所使用的 VBA程式語法,做個整合記錄,方便大家在學習當下參考與使用。