0%

0050樂活大叔策略回測 | 用程式打造選股策略(2)

在打造策略之前,決定先參考看看別人的策略成果如何,
這次先選擇了樂活大叔 只買4支股,年賺18% 書中提到的選股方式來做個回測試試看。

策略說明

樂活大叔的策略是多頭市場時,
加權指數 K<20 買進 K>80 賣出,
為了方便起見本文就直接使用 0050 的K值
接著做一些假設,方便回測:

  1. 以本金100萬投入市場
  2. 當日 0050 K<20,以收盤價格買入1張,持續買進至沒錢為止
  3. 當日 0050 K>80,以收盤價格賣出1張,持續賣出至沒股票為止
  4. 計算期間 2019/01/01 - 2019/12/31

計算KD值

利用上一篇 用 C# .NET Core 自動爬取台股每日股價 得到的資料
直接從資料庫取得0050的股價並做KD計算

安裝套件

1
dotnet add package TA-Lib --version 0.5.0.3

這裡直接使用TA-Lib套件中的 Stoch 來計算 KD 值

程式部分

這裡直接使用台股一般選用的參數(9,3,3)
如果不了解參數的意義,可以參考 => 什麼是『KD』?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
IEnumerable<Stock> _stockList = _stockRepository.GetStocks(stockQuery); // 從資料庫抓資料,詳細內容省略
int _inFastK = 9;
int _inSlowK = 3;
int _inSlowD = 3;
int outBegIdx, outNBElement;

double outSlowK = new double[_stockList.Count() - (_inFastK + _inSlowK)]; // 用來存放K值計算後結果,前12天會沒資料
double outSlowD = new double[_stockList.Count() - (_inFastK + _inSlowK)]; // 用來存放D值計算後結果,前12天會沒資料
List<int> indexList = Enumerable.Range(0, _stockList.Count() - (_inFastK + _inSlowK)).ToList(); //篩選符合的index用
Core.Stoch(
0,
_stockList.Count()-1,
_stockList.Select(x => Convert.ToSingle(x.max)).ToArray(),
_stockList.Select(x => Convert.ToSingle(x.min)).ToArray(),
_stockList.Select(x => Convert.ToSingle(x.close)).ToArray(),
_inFastK,
_inSlowK,
Core.MAType.Sma,
_inSlowD,
Core.MAType.Sma,
out outBegIdx,
out outNBElement,
outSlowK,
outSlowD
);

這樣我們就可以得到計算後的KD值,不過這裡要注意的是 outSlowK、outSlowD 沒有前12天的資料,所以也不會進行交易

另外這邊算出來的KD值應該會和市面上的看盤軟體不太一樣,畢竟KD值還和前幾天的資料有關,開始計算的時間點不一樣,值應該也會不同,很合理!

接著我們要篩選出符合 K<20 和 K>80 的index

1
2
3
4
5
6
7
8
9
10
11
public List<int> K_BiggerThan(List<int> indexList, double value)
{
indexList.RemoveAll(index => outSlowK[index] <= value);
return indexList;
}

public List<int> K_SmallerThan(List<int> indexList, double value)
{
indexList.RemoveAll(index => outSlowK[index] >= value);
return indexList;
}

利用index篩選出買入和賣出的資料

1
2
var buyStockList = K_SmallerThan(indexList).Select(index => _stockList[index + 12]);
var sellStockList = K_BiggerThan(indexList).Select(index => _stockList[index + 12]);

接著我們直接來看看結果

結果

日期價格訊號實際持有股票資產現金資產
2019/01/1875.95賣出001000000
2019/01/2176.5賣出001000000
2019/01/2474.05買進買進1張174050925950
2019/01/2575買進買進1張2150000850950
2019/02/1475.25賣出賣出1張175250926200
2019/02/2076.35賣出賣出1張001002550
2019/02/2177.1賣出001002550
2019/02/2276.95賣出001002550
2019/02/2577.5賣出001002550
2019/02/2677.7賣出001002550
2019/02/2777.65賣出001002550
2019/03/0476.95賣出001002550
2019/03/1176.15買進買進1張176150926400
2019/03/1878.1賣出賣出1張001004500
2019/03/1978.4賣出001004500
2019/03/2078.5賣出001004500
2019/03/2179.15賣出001004500
2019/03/2279.35賣出001004500
2019/04/0380.15賣出001004500
2019/04/0880.9賣出001004500
2019/04/0981.4賣出001004500
2019/04/1081.5賣出001004500
2019/04/1181.15賣出001004500
2019/04/1281.1賣出001004500
2019/04/1581.85賣出001004500
2019/04/1682.1賣出001004500
2019/04/1782.75賣出001004500
2019/04/1882.7賣出001004500
2019/04/1982.8賣出001004500
2019/04/2583.4賣出001004500
2019/05/1380.15買進買進1張180150924350
2019/05/1479.65買進買進1張2159300844700
2019/05/1579.75買進買進1張3239250764950
2019/05/1679.05買進買進1張4316200685900
2019/05/1778.25買進買進1張5391250607650
2019/05/2078.2買進買進1張6469200529450
2019/05/2178.4買進買進1張7548800451050
2019/05/2278.4買進買進1張8627200372650
2019/05/2376.95買進買進1張9692550295700
2019/05/2477.35買進買進1張10773500218350
2019/05/2777.15買進買進1張11848650141200
2019/05/2877.1買進買進1張1292520064100
2019/05/2976.75買進1292100064100
2019/06/0478.05賣出賣出1張11858550142150
2019/06/0578.3賣出賣出1張10783000220450
2019/06/1179.4賣出賣出1張9714600299850
2019/06/1279.7賣出賣出1張8637600379550
2019/06/1379.05賣出賣出1張7553350458600
2019/06/2080.85賣出賣出1張6485100539450
2019/06/2180.85賣出賣出1張5404250620300
2019/06/2481.2賣出賣出1張4324800701500
2019/06/2580.75賣出賣出1張3242250782250
2019/06/2781.5賣出賣出1張2163000863750
2019/07/0182.65賣出賣出1張182650946400
2019/07/0282.45賣出賣出1張001028850
2019/07/1583.2賣出001028850
2019/07/1683.35賣出001028850
2019/07/1782.8賣出001028850
2019/07/2383.6賣出001028850
2019/07/2483.55賣出001028850
2019/07/2583.8賣出001028850
2019/08/0280.95買進買進1張180950947900
2019/08/0580.15買進買進1張2160300867750
2019/08/0680.1買進買進1張3240300787650
2019/08/0779.7買進買進1張4318800707950
2019/08/2081賣出賣出1張3243000788950
2019/08/2181.1賣出賣出1張2162200870050
2019/08/2280.9賣出賣出1張180900950950
2019/08/2381賣出賣出1張001031950
2019/09/0281.9賣出001031950
2019/09/0381.2賣出001031950
2019/09/0482.15賣出001031950
2019/09/0583賣出001031950
2019/09/0683.5賣出001031950
2019/09/0983.8賣出001031950
2019/09/1083.4賣出001031950
2019/09/1183.45賣出001031950
2019/09/1283.9賣出001031950
2019/09/1684.4賣出001031950
2019/09/1784.25賣出001031950
2019/09/1884.95賣出001031950
2019/09/1984.45賣出001031950
2019/10/1487.55賣出001031950
2019/10/1587.7賣出001031950
2019/10/1688.1賣出001031950
2019/10/1788.15賣出001031950
2019/10/1887.95賣出001031950
2019/10/2187.85賣出001031950
2019/10/2288.7賣出001031950
2019/10/2388.45賣出001031950
2019/10/2488.8賣出001031950
2019/10/2588.8賣出001031950
2019/10/2889.2賣出001031950
2019/10/2989.45賣出001031950
2019/10/3089.85賣出001031950
2019/10/3190.1賣出001031950
2019/11/0190.1賣出001031950
2019/11/0492.2賣出001031950
2019/11/0592.9賣出001031950
2019/11/0693.35賣出001031950
2019/11/0792.85賣出001031950
2019/11/0892.55賣出001031950
2019/11/2093.25賣出001031950
2019/11/2192.5賣出001031950
2019/12/0993.65賣出001031950
2019/12/1193.75賣出001031950
2019/12/1295.85賣出001031950
2019/12/1396.9賣出001031950
2019/12/1696.85賣出001031950
2019/12/1798.15賣出001031950
2019/12/1898.2賣出001031950
2019/12/1997.65賣出001031950
2019/12/2096.95賣出001031950
2019/12/2397.15賣出001031950

心得

從結果來看,最後的本金大概是103萬多一些,大約是3%的報酬率,
我嘗試將本金下降到50萬,結果報酬率更差,
又嘗試將本金調升到200萬,對績效也幾乎沒有什麼太大的影響。
也許分批買進的方式可以再調整,但個人認為對於提升報酬率的效果應該有限。

回顧一下歷史線圖,2019年應該算是有一波大多頭行情,此策略並沒有辦法在大多頭行情中得到太多好處,
不過樂活大叔提倡的是用最簡單的方式來交易,比起績效,樂活人生可能比較重要一些,
如果是要追求更高的報酬率,應該可以找出更好的策略才對!

↓↓↓ 如果喜歡我的文章,可以幫我按個Like! ↓↓↓
>> 或者,請我喝杯咖啡,這樣我會更有動力唷! <<<
街口支付

街口支付

街口帳號: 901061546

歡迎關注我的其它發布渠道