[VBA] 穩穩獲利的交易策略 – 0050 布林通道 回測程式
目錄 :
0050 布林通道 回測程式
此篇文章也是 0050即時分析系統 的延伸,主要是藉由 BBand布林通道 的歷史資料,利用 下軌(超賣區)/上軌(超買區) 為 進/出場 的回測策略,同時與時下最夯的小資族 定時定額無腦存股法,再作比較,看其績效為何 ?
※ 所謂「 數據會說話 」,這就開始製作並解說 BBand布林通道 回測程式的操作步驟,讓大家了解 — 如何達成翻倍獲利 !
( PS. 若對 BBand布林通道 定義不了解的話,請先參考 : 布林通道 ( BBand )。
[ 操作步驟 ] :
1. 複製歷史資料 : 將 元大台灣50 工作表內的資料欄位複製到 BBand工作表。
( PS. 因為只針對 BBand布林通道 作回測,所以只複製基本欄位 : 時間 + 開 / 高 / 低 / 收 + 布林通道( UB2.0 / BBandMA20 / LB2.00 ) 的欄位資料,如下圖。)
2. 1 ~ 3列 插入空白列 : 為了做數據分析之用。
3. 填入需要的欄位名稱 : 依照下圖 — 紅框 / 桔框 位置,填入各欄位標題名稱。
4. 載入各項判別公式 : 依照上圖 — 紅/桔框,分成 : 兩個區塊 — (上) : 即時數據 + 策略分析 / (下) : 歷史資料分析,來載入相關的判別公式。
(下) : 歷史資料分析
※ 首先,先製作 台灣50布林通道回測程式 — (下) : 歷史資料分析 桔框部分,標題內,有一組雙向 : 買進/賣出 策略 :
◎ 做多交易 : ( 買進 ↘ LB2.00 ) — I 欄位 : 收盤價 跌破 LB2.00(負2倍標準差) / ( 賣出 ↗ MA20 ) — ( K 欄位 : 收盤價 突破 MA20(20日均線)。
◎ 做空交易 : ( 放空 ↗ UB2.00 ) — N 欄位 : 收盤價 突破 UB2.00(正2倍標準差) / ( 回補 ↘ MA20 ) — ( P 欄位 : 收盤價 跌破 MA20(20日均線)。
布林通道 策略
☆ 策略條件 : 參考上述 做多/做空 交易。
※ 為了跟 均線 及 KD指標 的策略條件設定,有所不同,這裡就採用 雙向買/賣 — 做多 + 做空 的方式,來做介紹。
布林通道 / 做多 交易策略
☆ 步驟一 : 設計 I欄 / 買進信號標示公式
[ 買進 – 策略條件 ] :
◎ 條件 : 收盤價 < LB2.0 ,意思是 : 收盤價 向下穿過 LB2.0值 — 買進。
——————————————————————————————————————————————
[ 公式設定與解說 ] :
☆ I5 儲存格 – 買進信號標示 公式 :
※ 收盤價 < LB2.0 公式 : =IF(G5=”N/A”,0,IF(I4=0,IF(E5<H5,1,0),IF(E5>G5,0,1))),這組公式內含雙層式的IF判斷式,用來判斷是否 跌破 LB2.0(下軌)。
◎ EXCLE函數寫法 : 如下 :
第 1 層 IF : =IF(G5=”N/A”,0,IF(I4=0,IF(E5<H5,1,0),IF(E5>G5,0,1))) :
※ 意思是判別 G5儲存格 BBandMA20 資料,是否正確。若為 N/A,I5欄/顯示 : 0,表示資料錯誤;非N/A,則進入 第 2 層 IF 判別式。
第 2 層 IF : IF(I4=0,IF(E5<H5,1,0),IF(E5>G5,0,1)) :
※ 意思是判別 I4(前一日信號)資料,是否為 0。 (可先參考 I欄 信號解說)。
◎ 若為 是 ( =0 ) : 進入 IF(E5<H5,1,0) 判別式,判別 E5欄 (收盤價) 是否 < H5欄 ( LB2.0 )。
* 若 是 : 表示 收盤價 跌入 下軌( LB2.0 ),觸發買進信號,I5欄/標記 : 1 (手上有多單了)。
* 若 否 : 觸發條件不成立,則顯示 0,維持空手信號。
◎ 若為 否 : 表示信號為 1 (有上有單),則進入 IF(E5>G5,0,1) 判別式,判別 E5欄 (收盤價) 是否 > G5欄 ( BBandMA20 )。
* 若 是 : 表示 收盤價 突破 20日均線( MA20 ),觸發賣出信號,I5欄/標記 : 0 (手上沒單了)。
* 若 否 : 觸發條件不成立,則顯示 1,維持有單信號。
☆ 步驟二 : 設計 J欄 / 買進價標示公式
☆ J5 儲存格 – 買進價標示 公式 : =IF(G5=”N/A”,””,IF(AND(I4=0,I5=1),E5,””)),意思是判別是否為 買進信號 (I4=0,I5=1)。
◎ EXCLE函數寫法 : 如下 :
第 1 層 IF : =IF(G5=”N/A”,“”,IF(AND(I4=0,I5=1),E5,””)) :
※ 意思是判別 G5儲存格 BBandMA20 資料,是否正確。若為 N/A,J5欄/顯示 : ” “,表示資料錯誤;非N/A,則進入 第 2 層 IF 判別式。
第 2 層 IF : IF(AND(I4=0,I5=1),E5,“”) :
※ 意思是 : 使用 AND邏輯函數,同時判別 I4(前一日信號),是否為 0 及 I5(今日信號),是否為 1。 (可先參考 I欄 買進信號解說)。
◎ 若為 是 : 表示今日 剛跌破 – 觸發買進信號,J5欄 標記 : 買進價 (E5-收盤價),方便計算買進總點數。
◎ 若為 否 : 條件不成立,便不做任何更動,標記 : ” “ (空白)。
★ 買進 信號標示條件 ★
☆ 買進信號標示 — I欄位中,會有三種信號標示 : 未跌破 / 剛跌破 / 已跌破。
◎ 未跌破 LB2.0 / I欄=0 : 表示手上沒單(空手)。
◎ 剛跌破 LB2.0 / I欄=1 , I欄-1=0 : 表示今日剛跌破 – 觸發買進信號。( 意思是 : I欄-1(前一日) =0 (空手),I欄(今日) =1 (有單),即 剛跌破。)
◎ 已跌破 LB2.0 / I欄=1 , I欄-1=1 : 表示手上有單。( 意思是 : I欄-1(前一日) =1 (有單),即使 I欄(今日) =1 (有單-跌破),也不會再觸發信號。)
☆ 步驟三 : 設計 K欄 / 賣出信號標示公式
[ 賣出 – 策略條件 ] :
◎ 條件 : 收盤價 > MA20 ,意思是 : 收盤價 向上穿過 MA20值 — 賣出。
——————————————————————————————————————————————
[ 公式設定與解說 ] :
☆ K5 儲存格 – 賣出信號標示 公式 :
※ 收盤價 > MA20 公式 : =IF(G5=”N/A”,””,IF(AND(I4=1,I5=0),1,””)),這也是雙層式的IF判斷式,用來判斷是否 突破 MA20(中線-20日均線)。
◎ EXCLE函數寫法 : 如下 :
第 1 層 IF : =IF(G5=”N/A”,“”,IF(AND(I4=1,I5=0),1,””)) :
※ 意思是判別 G5儲存格 BBandMA20 資料,是否正確。若為 N/A,K5欄/顯示 : 0,表示資料錯誤;非N/A,則進入 第 2 層 IF 判別式。
第 2 層 IF : IF(AND(I4=1,I5=0),1,“”) :
※ 意思是 : 使用 AND邏輯函數,同時判別 I4(前一日信號),是否為 1 及 I5(今日信號),是否為 0。 (可參考 I欄 買進信號解說)。
◎ 若為 是 : 表示今日 突破 MA20 黃金交叉 – 賣出,K5欄 標記 : 1,方便次數加總計算。
◎ 若為 否 : 條件不成立,便不做任何更動,標記 : ” “ (空白)。
☆ 步驟四 : 設計 L欄 / 賣出價標示公式
☆ L5 儲存格 – 賣出價標示 公式 : =IF(G5=”N/A”,””,IF(AND(I4=1,I5=0),E5,””)),意思是判別是否為 賣出信號 (I4=1,I5=0)。
◎ EXCLE函數寫法 : 如下 :
第 1 層 IF : =IF(G5=”N/A”,“”,IF(AND(I4=1,I5=0),E5,””)) :
※ 意思是判別 G5儲存格 BBandMA20 資料,是否正確。若為 N/A,L5欄/顯示 : ” “,表示資料錯誤;非N/A,則進入 第 2 層 IF 判別式。
第 2 層 IF : IF(AND(I4=1,I5=0),E5,“”) :
※ 意思是 : 使用 AND邏輯函數,同時判別 I4(前一日信號),是否為 1 及 I5(今日信號),是否為 0。 (可參考 I欄 買進信號解說)。
◎ 若為 是 : 表示今日 剛突破 – 觸發賣出信號,L5欄 標記 : 賣出價 (E5-收盤價),方便計算賣出總點數。
◎ 若為 否 : 條件不成立,便不做任何更動,標記 : ” “ (空白)。
布林通道 / 做空 交易策略
☆ 步驟一 : 設計 N欄 / 放空信號標示公式
[ 放空 – 策略條件 ] :
◎ 條件 : 收盤價 > UB2.0 ,意思是 : 收盤價 向上穿過 LB2.0值 — 放空(先賣出)。
——————————————————————————————————————————————
[ 公式設定與解說 ] :
☆ N5 儲存格 – 放空信號標示 公式 :
※ 收盤價 > UB2.0 公式 : =IF(G5=”N/A”,0,IF(N4=0,IF(E5>F5,1,0),IF(E5<G5,0,1))),這組公式內含雙層式的IF判斷式,用來判斷是否 突破 UB2.0(上軌)。
◎ EXCLE函數寫法 : 如下 :
第 1 層 IF : =IF(G5=”N/A”,0,IF(N4=0,IF(E5>F5,1,0),IF(E5<G5,0,1))) :
※ 意思是判別 G5儲存格 BBandMA20 資料,是否正確。若為 N/A,N5欄/顯示 : 0,表示資料錯誤;非N/A,則進入 第 2 層 IF 判別式。
第 2 層 IF : IF(N4=0,IF(E5>F5,1,0),IF(E5<G5,0,1)) :
※ 意思是判別 N4(前一日信號)資料,是否為 0。 (可參考 N欄 放空信號解說)。
◎ 若為 是 ( =0 ) : 進入 IF(E5>F5,1,0) 判別式,判別 E5欄 (收盤價) 是否 > F5欄 ( UB2.0 )。
* 若 是 : 表示 收盤價 突破 上軌( UB2.0 ),觸發放空信號,N5欄/標記 : 1 (手上有空單了)。
* 若 否 : 觸發條件不成立,則顯示 0,維持空手信號。
◎ 若為 否 : 表示信號為 1 (有上有單),則進入 IF(E5<G5,0,1) 判別式,判別 E5欄 (收盤價) 是否 < G5欄 ( BBandMA20 )。
* 若 是 : 表示 收盤價 跌破 20日均線( MA20 ),觸發回補信號,I5欄/標記 : 0 (手上沒單了)。
* 若 否 : 觸發條件不成立,則顯示 1,維持有單信號。
☆ 步驟二 : 設計 O欄 / 放空價標示公式
☆ O5 儲存格 – 放空價標示 公式 : =IF(G5=”N/A”,””,IF(AND(N4=0,N5=1),E5,””)),意思是判別是否為 放空信號 (N4=0,N5=1)。
◎ EXCLE函數寫法 : 如下 :
第 1 層 IF : =IF(G5=”N/A”,“”,IF(AND(N4=0,N5=1),E5,””)) :
※ 意思是判別 G5儲存格 BBandMA20 資料,是否正確。若為 N/A,O5欄/顯示 : ” “,表示資料錯誤;非N/A,則進入 第 2 層 IF 判別式。
第 2 層 IF : IF(AND(N4=0,N5=1),E5,“”) :
※ 意思是 : 使用 AND邏輯函數,同時判別 N4(前一日信號),是否為 0 及 N5(今日信號),是否為 1。 (可先參考 N欄 放空信號解說)。
◎ 若為 是 : 表示今日 剛突破 – 觸發放空信號,O5欄 標記 : 放空價 (E5-收盤價),方便計算放空總點數。
◎ 若為 否 : 條件不成立,便不做任何更動,標記 : ” “ (空白)。
★ 放空 信號標示條件 ★
☆ 放空信號標示 — N欄位中,會有三種信號標示 : 未突破 / 剛突破 / 已突破。( PS. 標示條件與 買進信號 相同。)
◎ 未突破 UB2.0 / N欄=0 : 表示手上沒單(空手)。
◎ 剛突破 UB2.0 / N欄=1 , N欄-1=0 : 表示今日剛突破 – 觸發放空信號。( 意思是 : N欄-1(前一日) =0 (空手),N欄(今日) =1 (有單),即 剛突破。)
◎ 已突破 UB2.0 / N欄=1 , N欄-1=1 : 表示手上有單。( 意思是 : I欄-1(前一日) =1 (有單),即使 I欄(今日) =1 (有單-突破),也不會再觸發信號。)
☆ 步驟三 : 設計 P欄 / 回補信號標示公式
[ 回補 – 策略條件 ] :
◎ 條件 : 收盤價 < MA20 ,意思是 : 收盤價 向下穿過 MA20值 — 回補。
——————————————————————————————————————————————
[ 公式設定與解說 ] :
☆ P5 儲存格 – 回補信號標示 公式 :
※ 收盤價 > MA20 公式 : =IF(G5=”N/A”,””,IF(AND(N4=1,N5=0),1,””)),這也是雙層式的IF判斷式,用來判斷是否 跌破 MA20(中線-20日均線)。
◎ EXCLE函數寫法 : 如下 :
第 1 層 IF : =IF(G5=”N/A”,“”,IF(AND(N4=1,N5=0),1,””)) :
※ 意思是判別 G5儲存格 BBandMA20 資料,是否正確。若為 N/A,P5欄/顯示 : 0,表示資料錯誤;非N/A,則進入 第 2 層 IF 判別式。
第 2 層 IF : IF(AND(N4=1,N5=0),1,“”) :
※ 意思是 : 使用 AND邏輯函數,同時判別 N4(前一日信號),是否為 1 及 N5(今日信號),是否為 0。 (可參考 N欄 放空信號解說)。
◎ 若為 是 : 表示今日 跌破 MA20 死亡交叉 – 回補,P5欄 標記 : 1,方便次數加總計算。
◎ 若為 否 : 條件不成立,便不做任何更動,標記 : ” “ (空白)。
☆ 步驟四 : 設計 Q欄 / 回補價標示公式
☆ Q5 儲存格 – 回補價標示 公式 : =IF(G5=”N/A”,””,IF(AND(N4=1,N5=0),E5,””)),意思是判別是否為 回補信號 (N4=1,N5=0)。
◎ EXCLE函數寫法 : 如下 :
第 1 層 IF : =IF(G5=”N/A”,“”,IF(AND(N4=1,N5=0),E5,””)) :
※ 意思是判別 G5儲存格 BBandMA20 資料,是否正確。若為 N/A,Q5欄/顯示 : ” “,表示資料錯誤;非N/A,則進入 第 2 層 IF 判別式。
第 2 層 IF : IF(AND(N4=1,N5=0),E5,“”) :
※ 意思是 : 使用 AND邏輯函數,同時判別 N4(前一日信號),是否為 1 及 N5(今日信號),是否為 0。 (可參考 N欄 放空信號解說)。
◎ 若為 是 : 表示今日 剛跌破 – 觸發回補信號,Q5欄 標記 : 回補價 (E5-收盤價),方便計算回補總點數。
◎ 若為 否 : 條件不成立,便不做任何更動,標記 : ” “ (空白)。
☆ 步驟五 : 公式延伸複製
※ 完成以上,買進/放空 的公式設定後,便可將公式往下延伸複製,複製到最新一筆資料。
[ 延伸複製方法 ] : 步驟如下 —
◎ 選取 I5 ~ Q5 欄位資料,滑鼠游標移到 Q5儲存格的右下角,此時游標會變成 + (十字),然後滑鼠左鍵點二下,公式便會往下延伸複製到最後一列。
[ 注意 ] : 上例會因為 M欄 沒有公式而導致延伸複製失敗,這時就要轉變個方式來處理,才能達到複製的效果。
◎ 首先,先嘗試延伸複製 I5 ~ L5 的欄位資料,結果還是失敗;只好先單行複製,先製作 I欄。
◎ 將 N欄公式 複製到 M欄,為了避免 M欄沒公式或資料,而造成延伸複製失敗。
◎ 選取 J5 ~ Q5 欄位資料,滑鼠游標移到 Q5儲存格的右下角,此時游標會變成 + (十字),然後滑鼠左鍵點二下,公式便會往下延伸複製到最後一列。
◎ 延伸複製後,資料如下 :
◎ 完成複製,再將 M欄 公式清除,即可。
[ 方法 ] : 點選 M5欄位,按鍵盤 CTRL + SHIFT + ↓,M5 ~ M4652欄 的資料會被選取,再按 DELETE 鍵,將選取的資料清除,即完成。
(上) : 即時數據 + 策略分析
( 1 ) : 即時數據
※ 即時數據 : 包含 — 時間 ( A欄 ) / 開高低收 ( B ~ E欄 ) / BBand值 ( F ~ H欄 ) 等部分。
( 一 ) : 時間 ( A欄 )
( 二 ) : 開高低收 ( B ~ E欄 )
( 三 ) : BBand值 ( 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語法與參數。
[ 布林通道 — 公式設定 ] :
※ 由於 布林通道(BBand) 的即時數據,必須先經過計算,求得 標準差,再演算出 UB2.0值(正2倍標準差) 與 LB2.0值(負2倍標準差)。
( 詳細介紹,請參考 : 布林通道 – 計算公式 )
[ EXCEL 公式解說 ] :
1. 首先製作 G2欄 MA20公式 : =AVERAGE( E2, E4634:E4652 ),這次直接使用 AVERAGE函數 來取得20日均價。
2. 公式內 E2 是 今日收盤價,資料由 RTD 連線 XQ 取得,所以是固定欄位。
3. 需要藉由下列 VBA公式,來轉變 前19日收盤價(E4634:E4652) 的資料,因為每天都會新增新的數據資料(含收盤價),所以列數會變。
4. F2欄(UB2.0) 公式 : =G2+STDEVP(E2,E4634:E4652)*2 ( 均價 + 2倍標準差 )
5. H2欄(LB2.0) 公式 : =G2-STDEVP(E2,E4634:E4652)*2 ( 均價 – 2倍標準差 )
◎ 以上,就是布林通道(BBand)的數據公式,為求每天即時更新數據,便採用 VBA公式來做設計,方便抓取歷史資料的最新列數。
[ 程式碼 / 台灣50_BBand數據更新 ]
Sub 台灣50_BBand數據更新()
Dim lastRow As Integer
Sheets("BBand").Select '選取MA工作表
lastRow = Range("A5").End(xlDown).Row ' 藉由 A5 往下搜尋,找出最後一列列號。
' BBandMA20 均線 :
[G2] = "=AVERAGE( E2, E" & lastRow - 18 & " : E" & lastRow & " )"
' UB2.0 上軌 :
[F2] = "=G2 + STDEVP( E2, E" & lastRow - 18 & " : E" & lastRow & " ) * 2"
' LB2.0 下軌 :
[H2] = "=G2 - STDEVP( E2, E" & lastRow - 18 & " : E" & lastRow & " ) * 2"
End Sub
[ 程式解說 ] :
0. 首先建立一個 : VBA模組。不了解如何建立,請參考 : 開啟 VBA 程式 – 插入模組。
1. Sub : 副程式名稱 : 台灣50_BBand數據更新 。
2. Dim : 宣告變數 lastRow 為整數 : Integer。
3. Sheets(“BBand”).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. BBandMA20 均價公式 : [G2] = “=AVERAGE( E2, E” & lastRow – 18 & ” : E” & lastRow & ” )” : 這是 文字組合 的用法。★ 請參考 VBA語法筆記 – 文字組合。
※ 意思是 : 將 公式文字( =AVERAGE( E2, E4634:E4652 ),從VBA轉換,貼到EXCEL工作表 G2欄 的位置,算出20日的平均收盤價。
6. UB2.0 上軌公式 : [F2] = “=G2 + STDEVP( E2, E” & lastRow – 18 & ” : E” & lastRow & ” ) * 2″ : 轉換成 =G2 + STDEVP( E2, E4634:E4652 ) * 2,算出上軌數值。
7. LB2.0 下軌公式 : [H2] = “=G2 – STDEVP( E2, E” & lastRow – 18 & ” : E” & lastRow & ” ) * 2″ : 轉換成 =G2 – STDEVP( E2, E4634:E4652 ) * 2,算出下軌數值。
( 2 ) : 策略分析
※ 策略分析 : 包含 —
( 一 ) : 做多交易 的信號標記 / 交易次數 / 買進賣出總點數。
( 二 ) : 做空交易 的信號標記 / 交易次數 / 買進賣出總點數。
( 三 ) : 做多/做空 的獲利總結算。
如下圖 :
[ 公式設定與解說 ] :
※ 首先我們已將歷史資料的回測數據,做了買/賣標記 : 1,也記錄了買/賣價位,現在只要將其加總,便可得知歷年來總買賣的次數/點數與策略績效。
( PS. 因為有牽扯到最新列數的加總問題,所以還是利用 VBA程式,來做處理。)
[ 程式碼 ] :
' 做多 / 策略分析 -- 加總次數/點數
[J2] = "=SUM(J5:J" & lastRow & ")" ' 買進點數 -- 加總
[K2] = "=SUM(K5:K" & lastRow & ")" ' 做多次數 -- 加總
[L2] = "=SUM(L5:L" & lastRow & ")" ' 賣出點數 -- 加總
[M2] = "=L2-J2" '做多總結算 -- 策略績效
' 做空 / 策略分析 -- 加總次數/點數
[O2] = "=SUM(O5:O" & lastRow & ")" ' 放空點數 -- 加總
[P2] = "=SUM(P5:P" & lastRow & ")" ' 做空次數 -- 加總
[Q2] = "=SUM(Q5:Q" & lastRow & ")" ' 回補點數 -- 加總
[R2] = "=Q2-O2" '總結算 -- 策略績效
[ 程式解說 ] :
1. ( J2欄 ~ L2欄 及 O2欄 ~ Q2欄 ) : 都是利用 SUM加總函數,將做多/做空策略的歷史回測數據做加總。
◎ J2欄 – 轉換而來的 EXCEL函式為 =SUM(J5:J4652) : 意思是將 J5 ~ J4652(最後一列lastRow) 的次數/點數,做加總(SUM)。
2. ( M2欄 及 R2欄 ) : 為 做多/做空 的結算績效。
◎ M2欄 – 函式為 =L2-J2,意思是將 賣出總點數(J2) 減去 買進總點數(L2),所得的數值,就是這個策略的績效。
[ 注意事項 ] :
1. 做好加總公式的計算後,你要了解一個關鍵點,那就是在初始回測的時候,數據是先觸發買進,還是賣出。
2. 還有你目前手上是空手,還是已經有進單;這些都關係到在計算總結算點數時,會不會出錯的問題。
◎ 這個程式剛好沒有 做多 – 先賣出 / 做空 – 先回補 的問題,但不保證你以後製作其他個股分析時,也如此順利。
◎ 另外,製作 做多/做空 策略時,湊巧下載的時間點,手上沒有進單,只需要手動在介質欄位,填寫 : 0,即可。
※ 若在製作其他程式時,有發生上述問題,請參考 : 台灣50KD指標回測程式 – 策略分析 的注意事項。
☆ 介質導入
※ 介質導入的目的 — 是為了避免將手上的進單,也一起加以結算,而產生錯誤,所以利用介質儲存格,來扣除內含數值,以確保結算資料準確無虞。
※ 目前需要考量的介質數據是 J2欄 及 O2欄,所以就利用 J3欄 及 O3欄,來做介質儲存格,記錄 : 進單價位;若手上無單,則顯示 : 0。
◎ 了解介質導入的目的,但沒有 VBA程式 自動判別當日是否有進單信號,也沒用。所以需要設計個 介質導入VBA程式,來辨識信號。
[ 程式碼 / 介質導入 ] :
' J3欄 / O3欄 -- 介質導入 :
If Range("I" & lastRow) = 0 And [E2] < [H2] Then [J3] = [E2]: [I3] = "手上有單": [I2] = 1 ' 買進成立 -- 做多進單
If Range("I" & lastRow) = 1 And [E2] > [G2] Then [J3] = 0: [I3] = "手上沒單": [I2] = 0 ' 賣出成立 -- 做多空手
If Range("N" & lastRow) = 0 And [E2] > [F2] Then [O3] = [E2]: [N3] = "手上有單": [N2] = 1 ' 買進成立 -- 做空進單
If Range("N" & lastRow) = 1 And [E2] < [G2] Then [O3] = 0: [N3] = "手上沒單": [N2] = 0 ' 賣出成立 -- 做空空手
[ 程式解說 ] :
※ ( J3欄 及 O3欄 ) : 為進單價位(介質)儲存格,其公式就是 剛突破/剛跌破 的判斷式。
☆ 目的是 : 方便將買進的總點數,直接扣除手上的進單點數,如此便能得知正確的結算數據。
[ J3欄 — 做多交易 ]
◎ 剛跌破 LB2.0 (買進) — VBA公式 : If Range(“I” & lastRow) = 0 And [E2] < [H2] Then [J3] = [E2]: [I3] = “手上有單”: [I2] = 1
意思是 : 判別前一日 I欄 的買進標記,是否為 0 且 是否 收盤價 ↘ LB2.0 (死亡交叉) 。
若 是 (兩條件皆成立) — 在 J3欄 顯示 : E2 (收盤價)資料;I3欄 顯示 : 手上有單;I2欄 : 標記 1。
◎ 剛突破 MA20 (賣出) — VBA公式 : If Range(“I” & lastRow) = 1 And [E2] > [G2] Then [J3] = 0: [I3] = “手上沒單”: [I2] = 0
意思是 : 判別前一日 I欄 的賣出標記,是否為 1 且 是否 收盤價 ↗ MA20 (黃金交叉)。
若 是 (兩條件皆成立) — 則 J3欄 顯示 : 0;I3欄 顯示 : 手上沒單;I2欄 : 標記 0。
——————————————————————————————————————————————
[ O3欄 — 做空交易 ]
◎ 剛突破 UB2.0 (放空) — VBA公式 : If Range(“N” & lastRow) = 0 And [E2] > [F2] Then [O3] = [E2]: [N3] = “手上有單”: [N2] = 1
意思是 : 判別前一日 N欄 的買進標記,是否為 0 且 是否 收盤價 ↗ UB2.0 (黃金交叉) 。
若 是 (兩條件皆成立) — 在 O3欄 顯示 : E2 (收盤價)資料;N3欄 顯示 : 手上有單;N2欄 : 標記 1。
◎ 剛跌破 MA20 (回補) — VBA公式 : If Range(“N” & lastRow) = 1 And [E2] < [G2] Then [O3] = 0: [N3] = “手上沒單”: [N2] = 0
意思是 : 判別前一日 I欄 的賣出標記,是否為 1 且 是否 收盤價 ↘ MA20 (死亡交叉)。
若 是 (兩條件皆成立) — 則 O3欄 顯示 : 0;N3欄 顯示 : 手上沒單;N2欄 : 標記 0。
★J2欄 / O2欄 — VBA公式修正 ★
[ 注意 ] :
※ 原 J2欄 及 O2欄 公式 : [J2] = “=SUM(J5:J” & lastRow & “)” 和 [O2] = “=SUM(O5:O” & lastRow & “)”,只做加總處理,現在加入介質判斷,其加總公式,也必須加以修正。
[ 修正VBA程式 ] :
[ 程式碼 / VBA公式修正 ] :
' 做多 / 策略分析 -- 加總次數/點數
[J2] = "=SUM(J5:J" & lastRow & ")-J3" ' 買進總點數 -- 加總
' 做空 / 策略分析 -- 加總次數/點數
[O2] = "=SUM(O5:O" & lastRow & ")-O3" ' 放空總點數 -- 加總
[ 程式解說 ] :
1. ( J2欄 買進總點數) — 原加總程式為 =SUM(J5:J4652),現修正為 : =SUM(J5:J4652)-J3。
◎ 增加了介質判斷,手上有進單時 : J3欄 會有進單點數,則將以扣除;空手時 : J3欄 的進單點數為 0,即使扣除,也無大礙。
2. ( O2欄 放空總點數) — 原加總程式為 =SUM(O5:O4652),現修正為 : =SUM(O5:O4652)-03。
◎ 增加了介質判斷,手上有進單時 : O3欄 會有進單點數,則將以扣除;空手時 : O3欄 的進單點數為 0,即使扣除,也無大礙。
※ 因為沒有 買進/放空次數 的設計,純粹只做 買進/放空信號 標示,所以這次就不做次數介質處理,直接以 做多/做空 的次數,來做結算,即可。
★ 手動資料修補 ★
因為載入的時間點 — 手上無單,結算資料不會有錯,介質儲存格也就無需特意的去標記進單價位,只要等待 買進/放空 信號觸發,程式會主動將資料,填入介質儲存格。
◎ 若你想事先標註好,也行。那就如下圖,將 I3 / J3 / N3 / O3欄 的資料,填寫上去,即可。
0050 布林通道 / 每日數據更新
※ 以上兩個區塊 (即時數據 + 策略分析 與 歷史資料分析) 的程式設定,都已完成。但少了每日更新數據的動作,等於沒用,所以要再製作一個 每日數據更新 的 VBA程式,才能達成自動化的目的。
[ 公式設定與解說 ] :
◎ 複製即時數據 : 選取 A2 ~ H2欄 的資料,複製到 A欄最後一列 的下一列(無資料的新列)。★ 提醒 : 複製成 數值 資料( xlPasteValues )。
◎ 複製策略分析 : 選取 I欄 ~ Q欄 最後一列的資料,複製到 I欄最後一列 的下一列(無資料的新列)。★ 提醒 : 複製成 公式 資料( xlPasteFormulas )。
[ 程式碼 / 複製今日數據 ] :
lastRow = Range("A5").End(xlDown).Row ' 藉由 A5 往下搜尋,找出最後一列列號。
' 複製今日數據 & KD數據
Range("A2:H2").Copy
Range("A" & lastRow + 1).Select
Selection.PasteSpecial Paste:=xlPasteValues
' 複製策略分析公式
Range("I" & lastRow & ":Q" & 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 & “:Q” & lastRow).Copy : 複製前一日的回測公式, I欄最後一列 ~ Q欄最後一列 的公式資料。
6. Range(“I” & lastRow + 1).Select : 選取要複製到的新欄位起點位置( I欄最後一列 再 +1 )。
7. Selection.PasteSpecial Paste:=xlPasteFormulas : 貼上複製資料,請注意看使用的參數 : xlPasteFormulas,此參數用法 : 依字面意思 — 貼成公式。
製作更新按鈕
※ 數據完成,程式也搞定,就在 下午:01:30 台股收盤後,一鍵完成 — 數據自動更新吧 !
[ 更新按鈕製作 ] :
1. 按鈕製作方法 : 請參考 — VBA 按鈕製作。( PS. 製作方式 – 同 台灣50MA回測程式。)
2. 指定巨集 : 游標移動到 更新數據 按鈕上,按 滑鼠右鍵,點選 : 指定巨集。
3. 確定巨集名稱 : 出現 指定巨集 視窗後,選取 : 台灣50_BBand數據更新 巨集名稱。
布林通道 策略回測分析
※ BBand 布林通道 策略回測 – 能不能賺錢 ?
◎ 以下,根據 幾組策略的回測數據,來說明其策略的可行性;同時,依照各策略進場買進方式,再做另一組定額存股的投資報告,以便比較其績效。
( PS. 擔心程式太多且複雜,所以只提供數據報告。若有興趣研究程式的朋友,請自行研究,有任何問題,歡迎您提問或私訊我。)
☆ 策略一 : 多/空 雙策略
[ 做多策略 ]
◎ 買進條件 : 收盤價 < LB2.0
◎ 賣出條件 : 收盤價 > MA20
☆ 獲利分析 : 2003/06/30 ~ 2022/04/27,做多次數 : 79 次,獲利 : 135.76 點 ( 不含歷年股息 )。
[ 做空策略 ]
◎ 放空條件 : 收盤價 > UB2.0
◎ 回補條件 : 收盤價 < MA20
☆ 獲利分析 : 2003/06/30 ~ 2022/04/27,做空次數 : 85 次,獲利 : 50.36 點 ( 不含歷年股息 )。
※ 定額存股 :
◎ 進場條件 : 做多策略 – 買進,只存不出。
☆ 獲利分析 : 2003/06/30 ~ 2022/04/15,獲利 : 4979.67 點 / 98.40 % ( 不含歷年股息 )。
☆ 策略二 : 多方 單邊策略
[ 做多策略 ]
◎ 買進條件 : 收盤價 < LB2.0
◎ 賣出條件 : 收盤價 > UB2.0
☆ 獲利分析 : 2003/06/30 ~ 2022/04/27,做多次數 : 48 次,獲利 : 12.18 點 ( 不含歷年股息 )。
※ 定額存股 :
◎ 進場條件 : 同上,只存不出。
☆ 獲利分析 : 2003/06/30 ~ 2022/04/15,獲利 : 2980.43 點 / 95.40 % ( 不含歷年股息 )。
完整程式碼
Sub 台灣50_BBand數據更新()
Dim lastRow As Integer
Sheets("BBand").Select '選取BBand工作表
lastRow = Range("A5").End(xlDown).Row ' 藉由 A5 往下搜尋,找出最後一列列號。
' J3欄 / O3欄 -- 介質導入 :
If Range("I" & lastRow) = 0 And [E2] < [H2] Then [J3] = [E2]: [I3] = "手上有單": [I2] = 1 ' 買進成立 -- 做多進單
If Range("I" & lastRow) = 1 And [E2] > [G2] Then [J3] = 0: [I3] = "手上沒單": [I2] = 0 ' 賣出成立 -- 做多空手
If Range("N" & lastRow) = 0 And [E2] > [F2] Then [O3] = [E2]: [N3] = "手上有單": [N2] = 1 ' 買進成立 -- 做空進單
If Range("N" & lastRow) = 1 And [E2] < [G2] Then [O3] = 0: [N3] = "手上沒單": [N2] = 0 ' 賣出成立 -- 做空空手
' -----------------------------------------------------------------------------
' 複製今日數據 & 布林通道數據
Range("A2:H2").Copy
Range("A" & lastRow + 1).Select
Selection.PasteSpecial Paste:=xlPasteValues
' 複製策略分析公式
Range("I" & lastRow & ":Q" & lastRow).Copy
Range("I" & lastRow + 1).Select
Selection.PasteSpecial Paste:=xlPasteFormulas
' -----------------------------------------------------------------------------
lastRow = Range("A5").End(xlDown).Row ' 藉由 A5,往下搜尋最後一列。)
' BBandMA20 均線 :
[G2] = "=AVERAGE( E2, E" & lastRow - 18 & " : E" & lastRow & " )"
' UB2.0 上軌 :
[F2] = "=G2 + STDEVP( E2, E" & lastRow - 18 & " : E" & lastRow & " ) * 2"
' LB2.0 下軌 :
[H2] = "=G2 - STDEVP( E2, E" & lastRow - 18 & " : E" & lastRow & " ) * 2"
' -----------------------------------------------------------------------------
' 做多 / 策略分析
[J2] = "=SUM(J5:J" & lastRow & ")-J3" ' 買進總點數 -- 加總
[K2] = "=SUM(K5:K" & lastRow & ")" ' 做多次數 -- 加總
[L2] = "=SUM(L5:L" & lastRow & ")" ' 賣出總點數 -- 加總
[M2] = "=L2-J2" '做多總結算 -- 策略績效
' 做空 / 策略分析
[O2] = "=SUM(O5:O" & lastRow & ")-O3" ' 放空總點數 -- 加總
[P2] = "=SUM(P5:P" & lastRow & ")" ' 做空次數 -- 加總
[Q2] = "=SUM(Q5:Q" & lastRow & ")" ' 回補總點數 -- 加總
[R2] = "=Q2-O2" '總結算 -- 策略績效
End Sub
[ 溫馨提醒 } :
完整程式碼的執行程序,跟文章敘述順序,有些不同。例如 : 介質導入 & 複製數據的部分。
主要的原因是 先判別介質條件,有助於簡化程式碼,方便於下一步複製的動作,也不會影響到後續建立策略分析的步驟。
結論
這篇 0050布林通道回測程式 的策略設計,主要針對0050的歷史資料,利用 布林通道技術指標,做多/做空 雙向進出來作數據回測,再加上每天的數據更新,以達到自動化分析的目的。
根據文章後段的策略獲利報告得知,以 技術指標 進場做多或放空的獲利,也不算理想。歷史數據分析得知,能賺錢的波段單,皆落在多頭行情;空頭洗刷時,便會吃掉該有的獲利,所以策略該如何改進,就由大家來思考。後續的文章也會針對不同個股,利用其他策略條件,來做運用與分析。
至於 定額存股法 的回測數據,同樣落在 95 ~ 98%。若不是因為新冠疫情擴大,導致台股大跌,不然應該也能測得翻倍利潤,這還不包含歷年股息發放。
每種投資法都有優缺點,端看你如何來操作。若你是上班族無法專心看盤,或者你是小資/存股族,想定額存股,上述的回測數據,提供你作參考。
[ 提醒 ] : 若你依照我的操作步驟來製作回測程式,絕不會有問題。問題會出在你的回測數據一定跟我的不同,因為你回測的日期一定跟我的不一樣,回測結果也就不一樣;若你有疑問,不知道數據是否正確,歡迎你來詢問,我可以跟你比對數據,這樣就不會有問題。
非常感謝您看到最後,若在閱讀的過程中,有任何疑問,歡迎您利用左下角 Messenger 直接提問或寫信給我,我會盡快回覆您,最後感謝您的閱讀,感恩 !
( PS. 如果喜歡 股小白 的文章,歡迎到 股小白臉書粉絲頁 點讚,衝人氣,目前不定期分析大盤趨勢,將來會有 每日公報 : 分析並公布跑分的個股資料,讓大家作為投資參考。 )
關 聯 文 章
1. 你知道0050怎樣買,賺最多? — 好用的 0050即時分析系統
- 大盤數據 及 股票資料擷取 是研究股市歷史脈動的必要程序,這可藉由EXCEL的表格設計,程式的撰寫,再透過DDE串接券商的資料源,就能針對財經數據做進一步的匯整與運算分析,大大節省許多抓取資料的時間,讓分析工作能更順利的進行。
- 0050均線回測程式 : 主要是利用均線策略,針對0050的歷史資料,作績效回測。
◎ 內文包含 : 黃金交叉買進/死亡交叉賣出的實際績效,小資族瘋投資–定時定額的存股績效,以及如何達到獲利翻倍的手把手策略教學 — 程式的概念 / 設計 / 操作步驟,皆在文中詳細說明。
3. 高達 114.60% 的獲利策略 – 0050KD指標回測程式
- 0050KD指標回測程式 : 主要是利用KD指標的進出場策略,針對0050的歷史資料,作績效回測。
◎ 內文 : 針對 KD指標 的 超買 / 超賣區,進行多組策略回測,同時也提供 定額存股 的投資績效,做為比較,文中對於 台灣50KD指標回測程式 的概念 / 設計 / 操作步驟,皆有詳盡的圖文說明。
4. 穩穩獲利的交易策略 – 0050布林通道回測程式
- 0050布林通道回測程式 : 主要是以布林通道(上/下軌)技術指標,當做進出場條件,針對0050的歷史資料,作績效回測。
◎ 內文 : 針對 布林通道 的 上軌/下軌 指標,進行 多/空 雙向策略回測,同時也提供 定額存股 的投資績效,做為比較,文中對於 台灣50布林通道回測程式 的概念 / 設計 / 操作步驟,皆有詳盡的圖文說明。
★ 這四篇文章,資料互相關聯,有興趣學習的朋友,請依照文章順序及內文的操作步驟,一步步完成,就能順利架起 大盤歷史資料自動儲存系統。
V B A 資 源
- EXCEL & VBA功能 筆記 : 將針對文章中所使用的 EXCEL 及 VBA公式 / 工具操作 / 巨集設定 / 控制項的運用,做個整合記錄,方便大家在學習當下的參考與使用。
- VBA 提供相當多的指令用法,VBA指令 彙整筆記,將會陸續記錄 VBA文章 中,所用過的 VBA指令,方便學員們對照運用。
- 語法就是程式的文法。 使用者要與電腦溝通,就必須遵守這些規則。VBA程式語法 筆記 : 將針對 VBA文章 中所使用的 VBA程式語法,做個整合記錄,方便大家在學習當下參考與使用。