[系列活動] 使用 r 語言建立自己的演算法交易事業

211
資資資資資資資資— 資資 R 資資資資資資資資資資資資資資 Speaker: 資資資 Date: 2016.01.15( 資 ) 2017/01 1

Post on 24-Jan-2017

3.002 views

Category:

Data & Analytics


2 download

TRANSCRIPT

Page 1: [系列活動] 使用 R 語言建立自己的演算法交易事業

1

資料科學系列活動—使用 R 語言建立自己的演算法交易事業

Speaker: 吳牧恩Date: 2016.01.15( 日 )

2017/01

Page 2: [系列活動] 使用 R 語言建立自己的演算法交易事業

2

你為何要交易 ?• 難道我學過如來神掌,也要告訴你 ?

• https://www.youtube.com/watch?v=i5uCWL0nsFA

• 初入市場的第一階段:花大錢遍尋名師 ~ 尋找聖盃 ~• 初入市場的第二階段:果然是百年難得一見的 ..• 初入市場的第三階段:受傷慘重 !? or 陣亡出場 !?

2017/01

出局 留下

Page 3: [系列活動] 使用 R 語言建立自己的演算法交易事業

3

這門課跟過去的課有什麼不一樣 ?• Q: 為何是演算法交易 ?

• Q: 演算法交易是程式交易嗎 ?

• Q: 為何要當事業來做 ?

• Q: 需要什麼背景 ?2017/01

Page 4: [系列活動] 使用 R 語言建立自己的演算法交易事業

4

這一切從這個時間點開始 !!

先自我介紹一下• 大家好,我是牧恩 !

• 部落格 (Bituzi)

• 筆名:牧清華• 數學 • 資金管理 理論模擬策略回測2017/01

Page 5: [系列活動] 使用 R 語言建立自己的演算法交易事業

5

課堂練習 http://zuv.io/1556148a00

2017/01

你修過幾門投資交易相關課程 ?

Page 6: [系列活動] 使用 R 語言建立自己的演算法交易事業

6

你是百年難得一見的交易奇才嗎 !?•主觀交易

• 市場上的眾多老師• 傑西李佛摩• 過去:得民心者得天下 !!

•計量交易• 西蒙斯 (Jame Simons)• 現在:得“計量”者得天下 !?

2017/01

Page 7: [系列活動] 使用 R 語言建立自己的演算法交易事業

72017/01

買 買 買 買

賣 賣 賣

+14

+15

+13

+10

+7

Page 8: [系列活動] 使用 R 語言建立自己的演算法交易事業

8

過去股市名嘴喊盤,現在資料科學說話

2017/01

Page 9: [系列活動] 使用 R 語言建立自己的演算法交易事業

9

加上量放大的條件 ?

2017/01

Page 10: [系列活動] 使用 R 語言建立自己的演算法交易事業

10

烏雲罩頂 : n 天後的機率分佈

2017/01

Page 11: [系列活動] 使用 R 語言建立自己的演算法交易事業

11

空頭吞噬 : n 天後的漲跌分佈

2017/01

Page 12: [系列活動] 使用 R 語言建立自己的演算法交易事業

12

今天想帶給大家的內容• 建構自己的演算法交易策略

• 下載資料、讀取資料、畫 K 線、簡單回測• 婆婆媽媽都能懂的交易統計學

• 績效:勝率、賠率、 MDD 、獲利因子• 策略:濾網、動量、加碼• 穩固性測試

• 股票、期貨策略開發實務• 理論:凱利賭徒、最佳化比例、槓桿空間模型• 實務:固定分數、固定比例

• 選擇權交易策略開發• 選擇權介紹• 實做凱利精神運用於台指選擇權策略開發

2017/01

Page 13: [系列活動] 使用 R 語言建立自己的演算法交易事業

13

哪裡下載 R 語言 ?

2017/01

免費

開源

好用

Page 14: [系列活動] 使用 R 語言建立自己的演算法交易事業

14

R Basic: 向量、四則運算、畫圖• 加減乘除四則運算: 1+2^3• 向量產生的幾種方式:

• a=1:100• b=100:1• c=rep(3,5)• d=seq(3,51,2)

• 向量運算: a=a+1,a+b,a*b

• 和: sum(a)• 累積和: cumsum(a)

• 畫圖: plot(cumsum(a),col="red",type="l")2017/01

Page 15: [系列活動] 使用 R 語言建立自己的演算法交易事業

15

R Basic: 迴圈• a=0• for (i in 1:100){a=a+1}

• a=0• while (a<=100){a=a+1}

• a=0• for (i in seq(1,99,by=2)){a=a+i}

2017/01

1+1+1+…+1=?

1+1+1+…+1=?

1+3+5+…+97+99=?

Page 16: [系列活動] 使用 R 語言建立自己的演算法交易事業

16

安裝 quantmod• install.packages("quantmod")• library(quantmod)

參考網站:• http://www.quantmod.com/

2017/01

Page 17: [系列活動] 使用 R 語言建立自己的演算法交易事業

17

下載資料 getSymbols• 下載資料 ( 預設 Yahoo Finance)

• 蘋果 : getSymbols("AAPL")• 台積電 : STK=get(getSymbols("2330.tw"))

• 不同的資料源 :• getSymbols('MSFT',src='google')• getSymbols("DEXJPUS",src="FRED")

• 資料格式• 使用 head 、 tail• 五個欄位:開高低收 (OHLC) 、量 (Vol) 、還原權值 (Adjusted)

2017/01

Page 18: [系列活動] 使用 R 語言建立自己的演算法交易事業

18

畫 K 線圖 : chartSeries• 時間週期

• 日 K: Default• 週 K: STK_week=to.weekly(STK)• 月 K: STK_mon=to.monthly(STK)• 自行定義 ? 週三 K

• 時間範圍• STK["2013"]• to.weekly(STK["2013::2015"])• STK["2013-01-01::2013-03-02"]

• 畫圖 (Charting)• barChart(STK["2015-01-01::2015-02-03"]) • chartSeries(STK, subset="2015-12-1::2016-03-21",theme="white")

2017/01

Page 19: [系列活動] 使用 R 語言建立自己的演算法交易事業

19

技術分析指標• 均線

• SMA(Cl(STK))• addTA(SMA(Cl(STK)), on=1, col="blue") ## default: n=10• addTA(SMA(Cl(STK),n=20), on=1, col="red")

• MACD• addMACD()

• 不靈通道 (Bollinger band)• addBBands()

2017/01

Page 20: [系列活動] 使用 R 語言建立自己的演算法交易事業

20

回測前置作業• 獲取台積電資料

• STK=get(getSymbols("2330.tw"))• 轉換成周 K ,矩陣類別

• STK=as.matrix(to.weekly(STK))

2017/01

Page 21: [系列活動] 使用 R 語言建立自己的演算法交易事業

21

回測前置作業• STK 的列名稱 (Week)

• rownames(STK)• 有多少個日期 ?

• length(rownames(STK))• 產生紀錄每筆交易損益的向量

• numeric(length(rownames(STK)))• 產生紀錄每筆交易損益的向量,並附上日期

• profit=setNames(numeric(length(rownames(STK))), rownames(STK))

2017/01

Page 22: [系列活動] 使用 R 語言建立自己的演算法交易事業

22

• 每周損益:周 K 收盤價 - 周 K 開盤價• profit[m]=STK[m,4]-STK[m,1]• profit[m]=Cl(STK)[m]-Cl(STK)[m]

• 每週都要計算 !• for (m in rownames(STK)) {

• profit[m]=STK[m,4]-STK[m,1]• }

• 檢查 !?• head(cbind(STK[,c(1,4)],profit),10)

台積電 : 週一開盤買,週五收盤賣

2017/01

Page 23: [系列活動] 使用 R 語言建立自己的演算法交易事業

23

損益績效• 損益向量

• profit

• 總損益• sum(profit)

• 累計損益• cumsum(profit)

• 畫出累計損益• plot(cumsum(profit), type="l",col="red",lwd=2)• abline(h=0,col="green")

2017/01

Page 24: [系列活動] 使用 R 語言建立自己的演算法交易事業

24

練習•1. 若是開盤賣,收盤買 ?•2. 日 K 價購損益績效如何 ?•3. 月 K 架構損益績效如何 ?•4. 其他股票 ?

2017/01

Page 25: [系列活動] 使用 R 語言建立自己的演算法交易事業

25

婆婆媽媽都能懂的交易的統計學勝率、賠率、回檔、最大回檔、獲利因子動量策略、加碼、穩固性測試

2017/01

Page 26: [系列活動] 使用 R 語言建立自己的演算法交易事業

26

勝率• profit= c(-10,15,-20,-16,20,-8,-10,30,-10,25)

• 贏的次數• length(profit[profit>0])

• 總交易次數• length(profit[profit!=0])

• 勝率• length(profit[profit>0])/length(profit[profit!=0])

2017/01

Page 27: [系列活動] 使用 R 語言建立自己的演算法交易事業

27

賺賠比• profit= c(-10,15,-20,-16,20,-8,-10,30,-10,25)

• 平均賺• mean(profit[profit>0])

• 平均賠• mean(profit[profit<0])

• 賺賠比• mean(profit[profit>0])/abs(mean(profit[profit<0]))

2017/01

Page 28: [系列活動] 使用 R 語言建立自己的演算法交易事業

28

• Total Profit: 118.1855 • Trading Days: 508 • Profit Per Trade: 0.2402144 • # of Win: 261 • Win Rate: 53.04878 % • Winning Average: 2.336493 • Losing Average: -2.128308 • Maximum Draw Down: 31.8 • The Periods of MDD: 16 18 20 48 282 • Profit Factor: 1.240391 • Total Profit/MDD: 3.716525

台積電 : 週一開盤買,週五收盤賣 !績效模組 : performance.R

2017/01

Page 29: [系列活動] 使用 R 語言建立自己的演算法交易事業

29

最大回檔 (maximum drawdown, MDD)• 回檔 (DD)

• 最好不要有回檔 ( 虧損、風險 )• 如果有一個策略,天天都在創新高 (No DD)

• 絕對最大回檔 (MDD)• 距離上次高點的最大回檔距離

• 比例最大回檔 (MDD%)• 回檔距離 / 前波高點高度

• 穩定度的表現:總獲利 /MDD

2017/01

Page 30: [系列活動] 使用 R 語言建立自己的演算法交易事業

30

獲利因子 (profit factor, PF)• profit= c(-10,15,-20,-16,20,-8,-10,30,-10,25)

• 賺的和 / | 賠的和 |• sum(profit[profit>=0])/abs(sum(profit[profit<0]))

• 意義:每輸 1 單位,必可再換來 PF 單位的獲利• 勝率低無所謂 ? • 賺賠比低無所謂 ? • 交易次數很少無所謂 ?

2017/01

Page 31: [系列活動] 使用 R 語言建立自己的演算法交易事業

31

課堂練習 http://zuv.io/1556148a00

2017/01

試計算損益向量 profit= c(-5,15,-20,-16,15,-18)的 MDD 與 PF 分別為多少 ?

Page 32: [系列活動] 使用 R 語言建立自己的演算法交易事業

32

台積電這幾年都在多頭,每週開盤買當然賺 !考慮多空 : 開低買,開高賣

2017/01

Page 33: [系列活動] 使用 R 語言建立自己的演算法交易事業

33

週一開低買,開高賣,週五收盤前出• 第一週是否可以交易 ?

• 先紀錄第一週收盤• lastC=STK[1,4] ## 或 lastC=Cl(STK)[1]

• 交易邏輯回測• for (m in rownames(STK)[-1]) {

if(STK[m,1]<=lastC){profit[m]=STK[m,4]-STK[m,1]}else(profit[m]=STK[m,1]-STK[m,4])

lastC=STK[m,4] }

2017/01

Page 34: [系列活動] 使用 R 語言建立自己的演算法交易事業

34

TSMC: 開低買,開高賣• Total Profit: 130.2388 • Trading Days: 508 • Profit Per Trade: 0.3192127 • # of Win: 222 • Win Rate: 54.41176 % • Winning Average: 2.361101 • Lossing Average: -2.11788 • Maximum Draw Down: 25 • The Periods of MDD: 28 30 31 45 107 • Profit Factor: 1.330618 • Total Profit/MDD: 5.209552

2017/01

Page 35: [系列活動] 使用 R 語言建立自己的演算法交易事業

35

練習:開低 1% 買,開高 1% 賣,收盤前空手lastC=STK[1,4] for (m in rownames(STK)[-1]) {

if(STK[m,1]<=lastC*0.99){profit[m]=STK[m,4]-STK[m,1]}

if (STK[m,1]>=lastC*1.01){profit[m]=STK[m,1]-STK[m,4]} lastC=STK[m,4]}

• Q: ( 最佳化參數 ) 開低 ?% 買,開高 ?% 賣,收盤前空手2017/01

該 如 何 修 改 ?

Page 36: [系列活動] 使用 R 語言建立自己的演算法交易事業

36

當然你也可以試試其他股票中鋼、中華電、鴻海、統一、國泰金、

甚至… ..宏 達 電 !><

2017/01

Page 37: [系列活動] 使用 R 語言建立自己的演算法交易事業

37

HTC: 開高賣,開低買• Total Profit: 37470• Trading Days: 488 • Profit Per Trade: 79.55541 • # of Win: 228 • Win Rate: 48.40764 % • Winning Average: 21658.89 • Lossing Average: -20167.72 • Maximum Draw Down: 591000 • The Periods of MDD: 5 7 19 41 151 • Profit Factor: 1.007646 • Total Profit/MDD: 0.06340203

2017/01

Page 38: [系列活動] 使用 R 語言建立自己的演算法交易事業

38

扣掉交易成本• 股票手續費

• 成交金額 *0.1425% • 買賣各一次

• 證券交易稅: 0.3%• fee=STK[m,4]*0.006

• 期貨滑價 + 手續費扣 5 點• 傳統回測: 2+2+1?• 經驗平均滑價約 1.5 點

2017/01

Page 39: [系列活動] 使用 R 語言建立自己的演算法交易事業

39

台積電:沒扣手續費 v.s.扣手續費

2017/01

聖盃

靠盃

Page 40: [系列活動] 使用 R 語言建立自己的演算法交易事業

40

練習• 試用 par(mfrow=c(2,2)) 畫出下面四種 cases 比較

• fee=STK[m,4]*0.006• fee=STK[m,4]*0.005• fee=STK[m,4]*0.004• fee=0

• par(mfrow=c(2,2))• for (f in c(0.006,0.005,0.004,0)){

fee=STK[m,1]*f }

2017/01

該 如 何 修 改 ?

Page 41: [系列活動] 使用 R 語言建立自己的演算法交易事業

41

練習 : 尋找 0050成份股哪隻股票最會獲利 ?• 你可以考慮下面規則 ?

• 1. 周 K 架構 or 月 K 架構哪個好 ?• 2. 開高 (?%) 賣,開低 (?%) 買• 3. 開低 (?%) 買,開高 (?%) 賣• 4. 是否可做到停損 & 停利 ?

• 停損不停利• 停利不停損

•請扣掉手續費: fee=STK[m,4]*0.006

• 試找出 2007 年至今,誰的 “ profit” 最高 ? 或是誰的 PF 最大 ?

2017/01

Page 42: [系列活動] 使用 R 語言建立自己的演算法交易事業

42

沒轍了嗎 ?開始發揮人類愛賭的天性!!

凹~ 再凹~~~ 無止境的凹 !!!

2017/01

Page 43: [系列活動] 使用 R 語言建立自己的演算法交易事業

43

馬丁格爾的聖盃 !? (以輪盤為例 ~)贏 : 翻倍;輸 : 賠光勝率 18/37 ,賠率為 1 (1:1)

2017/01https://www.youtube.com/watch?v=RldNUWT2pyY

Page 44: [系列活動] 使用 R 語言建立自己的演算法交易事業

442017/01

Page 45: [系列活動] 使用 R 語言建立自己的演算法交易事業

45

一種天真浪漫的賭法 ~( 勝率 18/37 ,賠率1)• Martingale: 贏了下注 1 單位,輸了就加倍。

•只要贏一次,就能賺一個單位。•輸衝贏縮,賺小賠大。

連輸次數

第一次

第二次

第三次

第四次

第五次

第六次

第七次

第八次

第九次

第十次

第十一次

投注 1 2 4 8 16 32 64 128 256 512 ???已輸金額 -1 -3 -7 -15 -31 -63 -127 -255 -511 -

1023

2017/01

Page 46: [系列活動] 使用 R 語言建立自己的演算法交易事業

46

記得當時…PM 06:00進賭場, AM 11:00 出賭場10枚籌碼進去, 50枚籌碼出來 !

假設每 3~4 分鐘可玩 1 局,1小時約玩 16 局, 5小時大約玩 80 局

2017/01

Page 47: [系列活動] 使用 R 語言建立自己的演算法交易事業

47

Beginner’s Luck!?我們就用 R 語言來模擬…10枚籌碼,最多玩 80 次,超過 50枚的機率 ?

2017/01

Page 48: [系列活動] 使用 R 語言建立自己的演算法交易事業

48

(馬丁格爾模擬 ) 100枚籌碼,最多玩 1000次

2017/01http://www.letyourmoneygrow.com/2016/09/04/mystery-and-misery-of-the-martingale-betting-system-why-it-will-not-make-you-rich/

Page 49: [系列活動] 使用 R 語言建立自己的演算法交易事業

49

10枚籌碼,最多玩 80 次,最後超過 50枚的機率 !

2017/01

輸錢離場的機率為 81.106%賺超過 50枚的機率為 5.322%

Beginner’s Luck 確認 !

模擬 10000 次

Page 50: [系列活動] 使用 R 語言建立自己的演算法交易事業

50

現在,我們開始 ”玩” 策略…馬丁格爾 : 贏了交易一張,輸了加倍交易

2017/01

Page 51: [系列活動] 使用 R 語言建立自己的演算法交易事業

51

交易的馬丁格爾• 產生一個計算每次部位大小的向量

• PZ=setNames(rep(1,length(profit)),names(profit))

• 如果上次輸,下次加倍買• if (sign(profit)[m-1]<0){PZ[m]=2*PZ[m-1]}

• 如果上次贏,下次買一張• If (sign(profit)[m-1]<0){PZ[m]=1}

2017/01

Page 52: [系列活動] 使用 R 語言建立自己的演算法交易事業

52

交易的馬丁格爾• 產生一個計算每次部位大小的向量

• PZ=setNames(rep(1,length(profit)),names(profit))

• 計算每一次的 PZ• for (m in 2:length(profit)){

if (sign(profit)[m-1]<0){PZ[m]=2*PZ[m-1]} if (sign(profit)[m-1]>0){PZ[m]=1} If (sign(profit)[m-1]==0){PZ[m]=PZ[m-1]}

}2017/01

Page 53: [系列活動] 使用 R 語言建立自己的演算法交易事業

53

將 PZ 前與 PZ 後畫在一起比較• source("performance.R")

• par(mfrow=c(1,3)) ## 三張圖畫同一個畫面• performance(profit) ##PZ 前• performance(profit*PZ) ##PZ後• ProfitBar(PZ) ##PZ 大小• max(PZ) ## 最大使用部位• mean(PZ) ##平均使用部位2017/01

Page 54: [系列活動] 使用 R 語言建立自己的演算法交易事業

54

馬丁格爾:輸了加倍買,贏了買 1張

2017/01

Page 55: [系列活動] 使用 R 語言建立自己的演算法交易事業

55

類馬丁格爾 (1234) :輸了多交易 1張,贏了只交易 1張

2017/01

Page 56: [系列活動] 使用 R 語言建立自己的演算法交易事業

56

練習 PZ 大法:輸縮贏衝•練習:類馬丁格爾 (1234…)

• if (sign(profit)[m-1]<0){PZ[m]=PZ[m-1]+1} else • if (sign(profit)[m-1]>0){PZ[m]=1} else • if (sign(profit)[m-1]==0){PZ[m]=PZ[m-1]}

•練習:贏了交易一張,輸了交易兩張• if (sign(profit)[m-1]<0){PZ[m]=2} else • if (sign(profit)[m-1]>0){PZ[m]=1} else • if (sign(profit)[m-1]==0){PZ[m]=PZ[m-1]}

2017/01

該 如 何 修 改 ?

該 如 何 修 改 ?

Page 57: [系列活動] 使用 R 語言建立自己的演算法交易事業

57

為了控制風險 : 輸了交易 2張,贏了交易1張

2017/01 輸了“多”買 1張

Page 58: [系列活動] 使用 R 語言建立自己的演算法交易事業

58

濾網:去蕪存菁,拆解成…輸了買 2張,贏了買 1張 = 買 1張 + 輸了才買 1張

2017/01

Total Profit: 33.8907 Trading Days: 508 Profit Per Trade: 0.1653205 # of Win: 112 Win Rate: 54.63415 % Winning Average: 2.207289 Lossing Average: -2.293824 Maximum Draw Down: 32.972 The Periods of MDD: 28 36 38 45 85 Profit Factor: 1.158868 Total Profit/MDD: 1.027863

輸了“才”買 1張

Page 59: [系列活動] 使用 R 語言建立自己的演算法交易事業

59

輸贏濾網好不好 ? 會不會是OverFitting?

2017/01

Page 60: [系列活動] 使用 R 語言建立自己的演算法交易事業

60

練習 : 尋找最適合的輸贏濾網 ?•連輸系列

• 輸贏 ?• 輸輸贏 ?• 輸輸輸贏 ?

• 尋找輸贏 pattern• 輸贏輸贏 ?• 輸輸贏輸贏 ?

2017/01

Page 61: [系列活動] 使用 R 語言建立自己的演算法交易事業

61

動量策略 v.s. 均值回歸• 動量策略 (順勢交易,買高賣低,違反人性 )

• 因為過去漲,所以現在買進;因為過去跌,所以賣出• 均值回歸 (逆勢交易,買低賣高,大家都愛 )

•漲多了該回跌,跌深了該反彈•牛頓第二運動定律 : 動者恆動,靜者恆靜 ?

• 股價漲未來是否會繼續漲 ? 股價跌未來是否會繼續跌 ?2017/01

Page 62: [系列活動] 使用 R 語言建立自己的演算法交易事業

62

課堂練習 http://zuv.io/1556148a00

2017/01

停損、停利 屬於哪一種策略 ?動量 or 均值回歸 ?

在交易裡,大部分違反人性的事,都是好事 ! 不正常的人才會獲利 !!!

Page 63: [系列活動] 使用 R 語言建立自己的演算法交易事業

63

我們使用“隨機交易”概念 !度量停損停利帶來的影響~

策略:開盤隨機交易,停損 ?停利 ?。2017/01

Page 64: [系列活動] 使用 R 語言建立自己的演算法交易事業

64

開盤隨機交易,不停損不停利,收盤平倉

2017/01

開盤隨機交易,停損30, 停利 30 ,收盤平倉

Page 65: [系列活動] 使用 R 語言建立自己的演算法交易事業

65

隨機交易,停損 30 ,停利 60 ,收盤平倉

2017/01

隨機交易,停損30 , 不停利,收盤平倉

Page 66: [系列活動] 使用 R 語言建立自己的演算法交易事業

66

台指期貨隨機交易統計• 不停損,停利 30 點•停損 145 點,停利 35 點•停損 140 點,停利 40 點• …•停損 35 點,停利 145 點•停損 30 點,不停利

2017/01

順勢、動量、違反人性 !

Page 67: [系列活動] 使用 R 語言建立自己的演算法交易事業

672017/01

隨機交易,停損 30 , 不停利,收盤平倉隨機交易,不停損,停利 30 ,收盤平倉

Page 68: [系列活動] 使用 R 語言建立自己的演算法交易事業

68

隨機交易,其他股票如何 ?

1%停損,不停利 v.s.

1%停利,不停損2017/01

Page 69: [系列活動] 使用 R 語言建立自己的演算法交易事業

69

Momentum v.s. Mean Reverse

2017/01

Page 70: [系列活動] 使用 R 語言建立自己的演算法交易事業

70

進場的動量策略突破 n 日高點、跌破 n 日低點黃金交叉、死亡交叉箱型突破、箱型跌破均線糾結後多頭排列,空頭排列

2017/01

Page 71: [系列活動] 使用 R 語言建立自己的演算法交易事業

71

課堂練習 http://zuv.io/1556148a00

2017/01

下列何者為動量順勢交易策略 ?

Page 72: [系列活動] 使用 R 語言建立自己的演算法交易事業

72

“突破” 10 日高點買進, 3 日後賣出• 何謂突破 ?

• Cl(STK)[m]>max(Hi(STK)[(m-10):(m-1)]) ##今天收盤 > 前 10 日高點• Cl(STK)[(m-1)]<max(Hi(STK)[(m-10-1):(m-2)])

##昨天收盤 <昨天前 10 日高點

2016/09

Page 73: [系列活動] 使用 R 語言建立自己的演算法交易事業

73

“突破” 10 日高點買進, 3 日後賣出• 前 10 日跟最後 3 日是否可交易 ?

• for (m in (10+1):(length(rownames(STK))-3)){

profit[m]=Cl(STK)[m+3]-Cl(STK)[m]-fee }

•停損• SL=0.95 #5%停損• if (min(Lo(STK)[m:(m+3)])<Cl(STK)[m]*SL){profit[m]=Cl(STK)[m]*(SL-1)-fee}

2016/09

0 500 1000 1500 2000

-25

-20

-15

-10

-50

2007-12-31 ~ 2017-01-11

Trading Days

Cum

ulat

ive

Pro

fit &

Dra

wD

own

0 500 1000 1500 2000

-25

-20

-15

-10

-50

2007-12-31 ~ 2017-01-11

Trading Days

Cum

ulat

ive

Pro

fit &

Dra

wD

own

Trading Days

Cum

ulat

ive

Pro

fit &

Dra

wD

own

29.5

35.5

41.5

47.5

53.5

59.5

65.5

71.5

何時突破 10 日高點

Page 74: [系列活動] 使用 R 語言建立自己的演算法交易事業

74

策略改進,使用波動濾網:金融市場,什麼都是假的 !只有大小波動是真的 !!

2017/01

Page 75: [系列活動] 使用 R 語言建立自己的演算法交易事業

75

最簡單的波動… . 如果這是股價的波動 ?

2017/01

Page 76: [系列活動] 使用 R 語言建立自己的演算法交易事業

76

20 日標準差

2017/01

Page 77: [系列活動] 使用 R 語言建立自己的演算法交易事業

77

日波動:每日開盤與收盤的漲跌幅

2017/01

Page 78: [系列活動] 使用 R 語言建立自己的演算法交易事業

78

將目前的策略,增加波動濾網•採用 10 日標準差當波動,門檻值設為平均

• if (sd(Cl(STK)[(m-10):(m-1)])<mean(sd(Cl(STK)))){

}

2017/01 0 500 1000 1500 2000

-25

-20

-15

-10

-50

2007-12-31 ~ 2017-01-11

Trading Days

Cum

ulat

ive

Pro

fit &

Dra

wD

own

0 500 1000 1500 2000

-25

-20

-15

-10

-50

2007-12-31 ~ 2017-01-11

Trading Days

Cum

ulat

ive

Pro

fit &

Dra

wD

own

Trading Days

Cum

ulat

ive

Pro

fit &

Dra

wD

own

29.5

35.5

41.5

47.5

53.5

59.5

65.5

71.5

原策略

Page 79: [系列活動] 使用 R 語言建立自己的演算法交易事業

79

思考:當你研發順勢策略時• Q: 波動小策略品質好 ? 還是波動大策略品質好 ?

• Q: 要用什麼當波動 ?

• Q: 找出最好的波動、門檻 ?

2017/01

Page 80: [系列活動] 使用 R 語言建立自己的演算法交易事業

80

天下之大 : 合久必分,分久必合金融市場 : 波大必小,波小必大世間萬物都是遵循此道 !

2017/01

Page 81: [系列活動] 使用 R 語言建立自己的演算法交易事業

81

拿廢話當濾網… ..

2017/01

Page 82: [系列活動] 使用 R 語言建立自己的演算法交易事業

822017/01

順勢策略:波動大小決定策略品質好壞 ?

波動 <100 波動介在 100~150 波動 >150

Page 83: [系列活動] 使用 R 語言建立自己的演算法交易事業

83

亂入策略波小當濾網輸了才交易

2017/01

Page 84: [系列活動] 使用 R 語言建立自己的演算法交易事業

84

加碼的奧義成也加碼,敗也加碼 !!

2017/01

Page 85: [系列活動] 使用 R 語言建立自己的演算法交易事業

85

加碼的奧義 : 成也加碼,敗也加碼 !!

• 摩天大樓 (1,1,1,1….)• 海龜

• 金字塔 (5,4,3,2,1)• 正常人

•倒金字塔 (1,2,3,4,5)• 瘋子

• 投票表決一下你覺得哪個加碼法好 ?

2017/01

Page 86: [系列活動] 使用 R 語言建立自己的演算法交易事業

86

課堂練習 http://zuv.io/1556148a00

2017/01

投票表決一下你覺得哪個加碼法好 ?

Page 87: [系列活動] 使用 R 語言建立自己的演算法交易事業

87

考慮台指期動量策略 : 開盤 + 門檻值突破( 用了濾網,採用順勢 )

2017/01

Buy

Page 88: [系列活動] 使用 R 語言建立自己的演算法交易事業

88

原始策略 ( 單口當沖 ) 績效與累計損益 :X

2017/01

損益 : 1670 總交易天數 : 1375實際交易次數 : 199 平均每次損益 : 8.434343獲利次數 : 80勝率 : 40.40404 % 平均賺 : 56.175平均賠 : -23.9322 最大連續虧損 : 250最大連續虧損區間 ( 天 ): 108 114 197 254 302 獲利因子 : 1.59136總獲利 /MDD: 6.68 

Page 89: [系列活動] 使用 R 語言建立自己的演算法交易事業

89

加碼規則:進場後 5 分鐘後仍有獲利,加碼 1 口 !

2017/01

Page 90: [系列活動] 使用 R 語言建立自己的演算法交易事業

90

加碼第一口後 : X+X1

2017/01

損益 : 1670 2951總交易天數 : 1375實際交易次數 : 199 平均每次損益 : 14.82915獲利次數 : 75 勝率 : : 40.40 % 37.69% 平均賺 : 92.96平均賠 : -32.42742最大連續虧損 : 375最大連續虧損區間 ( 天 ): 75 94 197 261 313獲利因子 : 1.59136 1.733897總獲利 /MDD: 6.68  7.869333 

Page 91: [系列活動] 使用 R 語言建立自己的演算法交易事業

91

加碼第二口後 : X+X1+X2

2017/01

損益 : 29513880總交易天數 : 1375實際交易次數 : 199 平均每次損益 : 19.49獲利次數 : 75 勝率 : 37.69%  37.64 % 平均賺 : 111.68平均賠 : -36.25最大連續虧損 : 425最大連續虧損區間 ( 天 ): 79 93 96 197 257獲利因子 : 1.733897 1.862989總獲利 /MDD: 7.869333  9.129412 

Page 92: [系列活動] 使用 R 語言建立自己的演算法交易事業

92

加碼第三口後 : X+X1+X2+X3

2017/01

損益 : 3880 4439總交易天數 : 1375 實際交易次數 : 199 平均每次損益 : 22.30653獲利次數 : 75 勝率 : 37.64 % 37.68 % 平均賺 : 120.8平均賠 : -37.26613 最大連續虧損 : 425最大連續虧損區間 ( 天 ): 89 93 94 200 257 獲利因子 : 1.862989 1.960615總獲利 /MDD: 9.129412 10.4447

Page 93: [系列活動] 使用 R 語言建立自己的演算法交易事業

93

一口一口加碼,你就滿足嗎 ?策略拆解 : 分別”獨立”看每次的加碼 !

2017/01

Page 94: [系列活動] 使用 R 語言建立自己的演算法交易事業

94

第一次加碼 : X1

2017/01

損益 : 1281總交易天數 : 1375實際交易次數 : 103 平均每次損益 : 12.43689獲利次數 : 47 勝率 : 45.63107 % 平均賺 : 55.12766 平均賠 : -23.39286 最大連續虧損 : 215最大連續虧損區間 ( 天 ): 93 96 98 114 345 獲利因子 : 1.977863總獲利 /MDD: 5.95814

Page 95: [系列活動] 使用 R 語言建立自己的演算法交易事業

95

第二次加碼 :X2

2017/01

損益 : 1281 929總交易天數 : 1375 實際交易次數 : 46 平均每次損益 : 20.19565獲利次數 : 24 勝率 : 45.63107 %  52.17391 % 平均賺 : 60.66667平均賠 : -23.95455 最大連續虧損 : 102最大連續虧損區間 ( 天 ): 93 96 110 269 305 獲利因子 : 1.977863 2.762808總獲利 /MDD: 5.59  9.107843

Page 96: [系列活動] 使用 R 語言建立自己的演算法交易事業

96

第三次加碼 : X3

2017/01

損益 : 929 559總交易天數 : 1375 實際交易次數 : 24 平均每次損益 : 23.29167獲利次數 : 14 勝率 : 52.17391 % 58.33333 % 平均賺 : 56.21429 平均賠 : -22.8 最大連續虧損 : 100最大連續虧損區間 ( 天 ): 56 63 91 110 871 獲利因子 : 2.762808 3.451754總獲利 /MDD: 9.107843 5.59 

Page 97: [系列活動] 使用 R 語言建立自己的演算法交易事業

97

觀察:越加碼 品質越好 !等差加碼 (1234 神經病 !)等比加碼 (1248瘋子 !)

2017/01

Page 98: [系列活動] 使用 R 語言建立自己的演算法交易事業

98

等差加碼 1234

2017/01

損益 : 9255總交易天數 : 1375 實際交易次數 : 199 平均每次損益 : 46.50754獲利次數 : 72 勝率 : 36.1809 % 平均賺 : 229.7083平均賠 : -57.35433 最大連續虧損 : 858最大連續虧損區間 ( 天 ): 93 94 98 114 257 獲利因子 : 2.270593總獲利 /MDD: 10.78671 

Page 99: [系列活動] 使用 R 語言建立自己的演算法交易事業

99

等比加碼 1248

2017/01

損益 : 12420 總交易天數 : 1375 實際交易次數 : 199 平均每次損益 : 62.41206獲利次數 : 72 勝率 : 36.1809 % 平均賺 : 289.1389平均賠 : -66.12598 最大連續虧損 : 1079最 大連續虧損區間 ( 天 ): 93 94 114 157 257 獲利因子 : 2.478924總獲利 /MDD: 11.51066

Page 100: [系列活動] 使用 R 語言建立自己的演算法交易事業

100

結論:加碼是放大器,同時放大”風險”與”利潤”

好的原始策略加碼更好;壞的原始策略加碼就完蛋 !!! (overfitting)2017/01

Page 101: [系列活動] 使用 R 語言建立自己的演算法交易事業

101

股票、期貨策略開發實務

2017/01

Page 102: [系列活動] 使用 R 語言建立自己的演算法交易事業

102

均線策略• 月線黃金交叉季線買近, 20 日後賣出• 月線黃金交叉季線買近,死亡交叉賣出• 月線黃金交叉季線買近,死亡交叉反手放空

2017/01

Trading Days: 2499 Profit Per Trade: 3.184475 # of Win: 11 Win Rate: 55 % Winning Average: 9.077436 Lossing Average: -4.018033 Maximum Draw Down: 10.9981 The Periods of MDD: 228 277 373 541 638 Profit Factor: 2.761213 Total Profit/MDD: 5.790954

Page 103: [系列活動] 使用 R 語言建立自己的演算法交易事業

103

考慮策略 (檢查方式 )•指標: 20ma,60ma•訊號:黃金交叉、死亡交叉•規則:黃金交叉買進,死亡交叉賣出

2017/01

Page 104: [系列活動] 使用 R 語言建立自己的演算法交易事業

104

這個策略到底好不好 ?把他丟到台灣 50 成分股

2017/01

Page 105: [系列活動] 使用 R 語言建立自己的演算法交易事業

105

思考一個問題• 股價 50元,你買一張• 股價快 200元,你還是買一張 ??? 這樣對嗎 ?

•部位控管 + 投資組合 + 資金管理 !2017/01

Page 106: [系列活動] 使用 R 語言建立自己的演算法交易事業

106

天下武功 無堅不破 唯快不破• https://www.youtube.com/watch?v=yVQWJeLUxSk

•許多人都在追求絕世武功,卻忽略了內功的修為 !

•許多人都在追求交易聖盃,卻忽略了資金管裡的重要 !

2017/01

翻倍可以很多次,破產只需要 1 次 !

Page 107: [系列活動] 使用 R 語言建立自己的演算法交易事業

107

交易的聖盃 : 資金管理的理論與實務凱利、最佳化比例、槓桿空間模型固定分數、固定比例、 Ranking 賭小一點交易 v.s. 賭局 是否一樣 ? 哪裡一樣 ? 哪裡不一樣 ?何謂賭局 ? 何謂交易 ?

2017/01

Page 108: [系列活動] 使用 R 語言建立自己的演算法交易事業

108

給你一枚銅板,人頭輸,數字贏 2倍 !• 勝率 50%• 賠率 (odds)=贏的淨賺 / 輸的淨賠

• 賠率為 2

2017/01

賠光WIN

LOSE

Page 109: [系列活動] 使用 R 語言建立自己的演算法交易事業

109

期望淨利• 勝率 * 賺的錢 +(100%- 勝率 )* 賠的錢

• 50%*2 + (100%-50%)*(-1) = 0.5• p*b + (1-p)*(-1) = p*(1+b)-1

• 你有 100元,可以玩無限多次,你會怎麼賭 ?• 如果連這麼好的賭局,你都不會賭,你憑什麼在交易上獲利 ?• 你可能會有其他說法,交易跟賭局不一樣 ?• 交易勝率不固定,賠率不固定• 交易次數有限次,賭局無限次

2017/01

Page 110: [系列活動] 使用 R 語言建立自己的演算法交易事業

110

課堂練習 http://zuv.io/1556148a00

2017/01

下面賭局何者期望淨利最大 ?

Page 111: [系列活動] 使用 R 語言建立自己的演算法交易事業

111

要玩 “期望淨利 > 0”的賭局,這個大家都知道 !

但這樣就夠了嗎 ?

2017/01

Page 112: [系列活動] 使用 R 語言建立自己的演算法交易事業

112

做個賭徒模擬實驗就知道… .• 勝率 50% ,賠率為 2

• 1. 玩 40 次下注多少比例 f會最好 ?• 不同下注比例 10%,20%,…,60%

• 2. 玩很多次下注多少比例 f會最好 ?• 玩 100 次、 500 次、 1000 次、 5000 次

• 用 R 語言模擬一下 ~

• Input: 勝率、賠率、下注比例• Output: 資金成長曲線 !2017/01

Page 113: [系列活動] 使用 R 語言建立自己的演算法交易事業

113

考慮 勝率 50% ,賠率為 2 的賭局

2017/01

資金 100元100元

Page 114: [系列活動] 使用 R 語言建立自己的演算法交易事業

114

考慮 勝率 50% ,賠率為 2 的賭局

2017/01

資金 100元,如果下注 20元80元

20元

Page 115: [系列活動] 使用 R 語言建立自己的演算法交易事業

115

考慮 勝率 50% ,賠率為 2 的賭局

2017/01

資金 100元,如果下注 20元贏: 100*(1+2*20%) 80元

20元20元20元

Page 116: [系列活動] 使用 R 語言建立自己的演算法交易事業

116

考慮 勝率 50% ,賠率為 2 的賭局

2017/01

資金 100元,如果下注 20元贏: 100*(1+2*20%) 100元

20元20元

140元20元

Page 117: [系列活動] 使用 R 語言建立自己的演算法交易事業

117

考慮 勝率 50% ,賠率為 2 的賭局

2017/01

資金 100元,如果下注 20元贏: 100*(1+2*20%)輸: 100*(1-20%)

100元

20元

80元

Page 118: [系列活動] 使用 R 語言建立自己的演算法交易事業

118

賭局設定 :• nbet=40 ## 賭幾局 ?• Odds=2 ## odds ( 賠率 )• Pwin=0.5 ## win rate ( 勝率 )• initM=100 ## initial capital ( 初始資金 )• f=0.3 ## bidding fraction ( 下注比例 )

• capital=rep(initM,1) ## current capital ( 紀錄每一局資產 )

2017/01

Page 119: [系列活動] 使用 R 語言建立自己的演算法交易事業

119

銅板賭局模擬• 開始賭 !

• for(i in 2:nbet){ ## 每一局dice=sample(0:1,size=1,prob=c(0.5,0.5),replace=T)

## 模擬賭局輸贏capital[i]=dice*capital[i-1]*f*(1+odds)+capital[i-

1]*(1-f) ## 資金成長}

2017/01

Page 120: [系列活動] 使用 R 語言建立自己的演算法交易事業

120

銅板賭局模擬• 畫累計損益

• plot(capital,type="l",col="red",lwd=3,font=2,xlab="The # of Bidding", ylab="The Growth of Capital",main=paste("WinRate",pwin*100,"%,","Odds",odds,", Play",nbet,"Games, ","Bidding",f*100,"%"))

• abline(h=initM,col="green",lty=2,lwd=3)

2017/01

Page 121: [系列活動] 使用 R 語言建立自己的演算法交易事業

1212017/01

Page 122: [系列活動] 使用 R 語言建立自己的演算法交易事業

122

身為一個賭徒 ( 交易員 )“ 賭” 最佳化 !

身為一個數學家“資金管理” 最佳化 !

2017/01

Page 123: [系列活動] 使用 R 語言建立自己的演算法交易事業

123

凱利賭徒 “理論上”的最佳下注比例理論、模擬、分析

2017/01

Page 124: [系列活動] 使用 R 語言建立自己的演算法交易事業

124

定義問題 !!• 勝率 50% ,賠率 2 的賭局• 初始資金 100元,玩無限多次

•假設人生可以天長地久• 每次決定下注比例 f (0% < f < 100%)

•假設資金可以無限分割•問題: f選多少可讓資金成長最快速 !2017/01

Page 125: [系列活動] 使用 R 語言建立自己的演算法交易事業

125

凱利公式推導• 勝率為 50% ,賠率為 2 的賭局

• 賭 1元,輸了賠光,贏了拿回 3(=1+2)元。•假設每次下注為 f 比例

• 如果贏: At= At-1(1+2f)• 如果輸: At= At-1 (1-f)

•假設在 T 次的賭局中,一共贏了W 次,輸了 L 次 (W+L=T)• 結論: AT= A1(1+bf)W(1-f)L

• 我們想要最大化 AT

• 如果玩無限多次會怎樣 ?2017/01

Page 126: [系列活動] 使用 R 語言建立自己的演算法交易事業

126

求 f 使得 AT= A1(1+bf)W(1-f)L 最大 ?• Rearranging:

• As , we have

• 什麼時候 f=1? (Showhand!)• 勝率 99% ,賠率 10000 的賭局,要你全壓,你賭不賭 ?

2017/01

Page 127: [系列活動] 使用 R 語言建立自己的演算法交易事業

1272017/01

Page 128: [系列活動] 使用 R 語言建立自己的演算法交易事業

128

課堂練習 http://zuv.io/1556148a00

2017/01

下面賭局你會選哪一種玩法 ?

Page 129: [系列活動] 使用 R 語言建立自己的演算法交易事業

129

凱利騙局•到底是誰騙了誰 ?• Kelly• Thorp• Larry William• Ralph Vince

2017/01

Page 130: [系列活動] 使用 R 語言建立自己的演算法交易事業

130

不同的部位配置 (position sizing, PZ) ,會造成不同的報酬損益 !!

不是老師帶你上天堂、住套房,而是” 資金管理” 帶你上天堂、住套房 !!2017/01

一句話談交易:用風險換報酬

Page 131: [系列活動] 使用 R 語言建立自己的演算法交易事業

131

原始策略 : 想要 Fitting ,又怕OverFitting然而,這些都不是最重要的… .

交易聖盃 : 資金管理 !! https://www.youtube.com/watch?v=yVQWJeLUxSk

2017/01

Page 132: [系列活動] 使用 R 語言建立自己的演算法交易事業

132

• 勝率固定 (50%) ,賠率固定 (2) 的賭局• 不管如何 Sample (10 個取, 20 個取, 50 個取, 100 個取 ) 都一樣 !!

• 我以為的交易是上面這樣…•實際的交易損益是:不知道機率、不知道賠率 !?

博弈理論 v.s. 交易實務

2017/01

-1

Page 133: [系列活動] 使用 R 語言建立自己的演算法交易事業

133

交易賭局:機率未知,但可 “預估”… .???•賭局給定機率、賠率• 交易回測給定”歷史損益” (Ralph Vince’s Optimal F)

2017/01

In Sample Out Sample

Page 134: [系列活動] 使用 R 語言建立自己的演算法交易事業

134

Review Kelly Again• 勝率 50% ,賠率為 2

• 抽到紅球,叫做贏,壓的翻 2倍• 抽到紅球,叫做輸,壓的賠光

•贏的機率 50% ,輸的機率 50%• 賠率為 (2,-1)

2017/01

AT= A1(1+2f)1(1-1f)1

Page 135: [系列活動] 使用 R 語言建立自己的演算法交易事業

135

Extend Kelly Criterion•抽到紅球為贏,翻 2倍•抽到籃球為贏,翻 1倍•抽到綠球為輸,賠光•機率 (20%, 20%, 20%, 20%, 20%)• 賠率 (2,2,1,-1,-1)

2017/01

AT = A1(1+2f)1(1+2f)1 (1+1f)1(1-1f)1(1-1f)1

= A1(1+2f)2 (1+1f)1(1-1f)2

Page 136: [系列活動] 使用 R 語言建立自己的演算法交易事業

136

HPR: Holding Period Return

• Idea: HPR= 1 + f (-profit/biggest loss)• Example: 16 、 -8 、 -8 、 +4 、 +4 、 +4• TWR (f) = HPR1 * HPR2 * HPR3 * HPR4* HPR5* HPR6

= [1 + f (-16/-8)] * [1 + f (-(-8)/-8)] * [1 + f (-(-8)/-8)] * [1 + f (-4/-8)] * [1 + f (-4/-8)]* [1 + f (-4/-8)]

= (1 + 2f )1 * (1 – f)2 * (1 + 0.5f)3

• How to find optimal f to maximize TWR(f)?• Brute method: from f=1%, f=2%, f=3%,…,f=98%,f=100%

2017/01

Page 137: [系列活動] 使用 R 語言建立自己的演算法交易事業

137

HPR 理論 (玩 1 次的損益期望值 v.s.下注比例 )

2017/01

Page 138: [系列活動] 使用 R 語言建立自己的演算法交易事業

138

然而,人生並不像銅板賭局那麼簡單…交 易 也 是 !沒有連續,只有離散沒有永恆 (無限 ) ,只有曾經 ( 有限 )

2017/01

Page 139: [系列活動] 使用 R 語言建立自己的演算法交易事業

1392017/01

一場勝率 50% 、賠率為 2 的賭局,賭起來天南地北 ! 10次50%

500 次24%

40次31%

100 次21%

1000 次26%

5000 次25%

Page 140: [系列活動] 使用 R 語言建立自己的演算法交易事業

1402017/01

TWR 模擬:從 (16,-8,4) 取樣也天南地北 !10次52%

500 次38%

40次35%

100 次46%

1000 次36%

5000 次38%

Page 141: [系列活動] 使用 R 語言建立自己的演算法交易事業

141

三個層級的先知• 第一層 ( 神 ) :不用知道勝率,因為他知道下一場會贏還是會輸 !

• 可以梭哈 (ShowHands)

• 第二層 (半仙 ) :知道未來 10 次,”一定會贏 5 次,輸 5 次“• 可以下最佳比例 (Optimal f)

• 第三層 (智者 ) :知道未來 10 次發生的機率“確實是 50%”。 ( 不容易 )• 一旦遇到偏差,錯誤的下注比例很有可能讓你受傷慘重。•賭小一點 (1%~2%)

2017/01

再來我才要解釋這件事 !

Page 142: [系列活動] 使用 R 語言建立自己的演算法交易事業

下面策略,你選哪一個 ?

2017/01 142100萬 230萬 100萬 1642萬

Page 143: [系列活動] 使用 R 語言建立自己的演算法交易事業

143

最基本的資金管理:固定分數 (Fixed Fraction)

•凱利賭局的勝率已知,賠率已知 控制虧損• 交易的勝率未知,賠率未知 但…

唯一能控制的還是虧損 !!

2017/01

Page 144: [系列活動] 使用 R 語言建立自己的演算法交易事業

1442017/01

1% 3% 5% 8%

單口 風險比例

Page 145: [系列活動] 使用 R 語言建立自己的演算法交易事業

145

開盤突破昨日波動 (高低 )*k1• 開盤突破昨日波動 *k1 買進• 20 點停損,收盤平倉• 回測標的:台指期貨• 回測時間: 2010.05.25~2015.09.10

2017/01程式碼: 7_TX_HL.R

Total Profit: 1140 Trading Days: 1543 Profit Per Trade: 2.76699 # of Win: 161 Win Rate: 39.07767 % Winning Average: 43.81366 Lossing Average: -23.56175 Maximum Draw Down: 312 The Periods of MDD: 107 112 171 188 254 Profit Factor: 1.192763 Total Profit/MDD: 3.653846

Page 146: [系列活動] 使用 R 語言建立自己的演算法交易事業

146

輸贏濾網:輸了一次再進場 !

2017/01

Total Profit: 1140 # of Win: 161 Win Rate: 39.07767 % Maximum Draw Down: 312 Profit Factor: 1.192763 Total Profit/MDD: 3.653846

Total Profit: 1427 # of Win: 106 Win Rate: 42.23108 % Maximum Draw Down: 235 Profit Factor: 1.419582 Total Profit/MDD: 6.07234

Page 147: [系列活動] 使用 R 語言建立自己的演算法交易事業

147

固定分數 (以台指期貨為例,固定風險比例2%)• 每口最大損失 : 200*(20+5)=5,000

• loss=5000

• 初始資金 : 1000,000• initM=1000000

• 風險比例 : 2% = 0.02• risk=0.02

• 設定目前總資金• capital=initM

• 計算第 m 天的下單口數• PZ.FF=floor(capital*risk/loss)• 初始下單口數: floor(1000000*0.02/7000)• 如果資金成長到 1500,000 ,下單口數 ??2017/01

程式碼: 8_Fixed_Fraction.R

每次交易最多損失總資金的 2%

假設你有 100萬,每次交易最多可損失100萬 *2%=20000

則你最多下 ( 下高斯 20000/5000) =4 口

Page 148: [系列活動] 使用 R 語言建立自己的演算法交易事業

148

• 設定固定分數向量• PZ.FF=setNames(rep(1,length(profit)),names(profit))• PZ.FF[1]=floor(capital*risk/loss)

• 計算每一時期的固定分數• for (m in 2:length(profit)){PZ.FF[m]=floor(capital*risk/loss)capital=capital+PZ.FF[m]*profit[m]*200 }

• 程式碼檢查• head(cbind(profit,PZ.FF,"P&L"=profit*PZ.FF,"Cap"=initM+cumsum(profit*PZ.FF*20

0)),1000)

2017/01

Page 149: [系列活動] 使用 R 語言建立自己的演算法交易事業

1492017/01

Total Profit: 4173 Trading Days: 1543 Win Rate: 39.07767 % Maximum Draw Down: 2473 The Periods of MDD: 123 188 204 260 297 Profit Factor: 1.121308 Total Profit/MDD: 1.687424

Total Profit: 1140 # of Win: 161 Win Rate: 39.07767 % Maximum Draw Down: 312 The Periods of MDD: 107 112 171 188 254 Profit Factor: 1.192763 Total Profit/MDD: 3.653846

Page 150: [系列活動] 使用 R 語言建立自己的演算法交易事業

150

課堂練習 http://zuv.io/1556148a00

2017/01

若小明想要用資金 150萬,風險比例2% ,操作某檔股票。買進價位 30元 / 股,預計 25元停損,則小明該買進多少張 ?

Page 151: [系列活動] 使用 R 語言建立自己的演算法交易事業

151

再來看一下 Kelly 是不是真的那麼神 ?• 勝率 : 39.07 %• 賠率 :平均賺 /平均賠

• 平均賺 : 43.8 • 平均賠 : -23.56

• 凱利比例 : 11.5 %

2017/01

Page 152: [系列活動] 使用 R 語言建立自己的演算法交易事業

152

固定分數• 初始資金 100萬• 風險比例 2%• 策略停損 NT5000元。• 100萬 4口• 125萬 5口• 150萬 6口• 175萬 7口• …..

2017/01

資金 *2%/5000 = 口數最小口數 = 資金 *25萬

越到後面口數增加越快 ? WHY?

Page 153: [系列活動] 使用 R 語言建立自己的演算法交易事業

153

固定比例 (Fixed Ratio)•瑞恩 .瓊斯 ( 交易的遊戲 ,1999)

• 固定分數的缺點:最初合約的增速很慢,一但累積到一定數額後,合約的速度會突然增加很快。• 固定比例

• 試圖平等對待每份合約,使資金的增長速率相同。• 1. 假設資金 X ,從一個單位做起,例如 1口。• 2. 固定每份合約的增長量 (Delta)2017/01

Page 154: [系列活動] 使用 R 語言建立自己的演算法交易事業

154

初始資金 100萬,做 1口;Delta = 3萬。• 做 2口的資金 = 做 1口的資金 + 1*Delta = 103萬。• 做 3口的資金 = 做 2口的資金 + 2*Delta = 109萬。• 做 4口的資金 = 做 3口的資金 + 3*Delta = 118 萬。• 做 5口的資金 = 做 4口的資金 + 4*Delta = 130 萬。• 做 6口的資金 = 做 5口的資金 + 5*Delta = 145 萬。… .

2017/01

固定每份合約的增長量

Page 155: [系列活動] 使用 R 語言建立自己的演算法交易事業

固定比例公式推導•做 n口的資金 = 做 n-1口的資金 + (n-1)*Delta• = 做 n-2口的資金 + (n-2)*Delta + (n-1)*Delta• = 做 n-3口的資金 + (n-3)*Delta + (n-2)*Delta + (n-1)*Delta

...

• = 做 2口的資金 + 2*Delta + 3*Delta +... + (n-1)*Delta• = 做 1口的資金 + 1*Delta + 2*Delta + 3*Delta +... + (n-1)*Delta• = 初始資金 + (n(n-1)/2)*Delta 2017/01 155

Page 156: [系列活動] 使用 R 語言建立自己的演算法交易事業

固定比例公式推導•作 n口的資金 = 初始資金 + (n(n-1)/2)*Delta

2017/01 156

Page 157: [系列活動] 使用 R 語言建立自己的演算法交易事業

157

實做固定比例,並與固定分數比較• 初始資金 100萬• 策略停損 NT 5000• 固定分數

• 風險比例 2%

• 固定比例• Delta=2萬

2017/01

程式碼:9_Fixed_Fraction_Ratio.R

Page 158: [系列活動] 使用 R 語言建立自己的演算法交易事業

158

固定比例 :Delta=3萬• Total Profit: 1516 • Trading Days: 1543 • Win Rate: 39.07767 % • Maximum Draw Down: 1836 • Profit Factor: 1.070508 • Total Profit/MDD: 0.8257081

2017/01

程式碼:9_Fixed_Fraction_Ratio.R

Page 159: [系列活動] 使用 R 語言建立自己的演算法交易事業

159

選擇權交易策略開發

2017/01

Page 160: [系列活動] 使用 R 語言建立自己的演算法交易事業

160

買房子附訂金• 買總價 900萬房子,於 2017 年 1 月 15 日付了 10萬元的訂金 ( 不含房價 )。• 預計 2018 年 1 月 15號交屋。•如果交屋前,房價漲到了 1000萬元。• 則這份訂金 (合約 ) ,價值多少 ?2017/01

Page 161: [系列活動] 使用 R 語言建立自己的演算法交易事業

161

買房子附訂金• 買總價 900萬房子,於 2017 年 1 月 15 日付了 10萬元的訂金 ( 不含房價 )。• 預計 2018 年 1 月 15號交屋。•如果交屋前,房價跌到了 800萬元。• 則這份訂金 (合約 ) ,價值多少 ?2017/01

Page 162: [系列活動] 使用 R 語言建立自己的演算法交易事業

1622017/01

1000萬900萬

100萬合約價值

房價

Page 163: [系列活動] 使用 R 語言建立自己的演算法交易事業

1632017/01

-10萬 1000萬900萬

910萬

100萬 90萬

合約價值

房價

Page 164: [系列活動] 使用 R 語言建立自己的演算法交易事業

164

付訂金 = 買 “買的權利” = 買 “買權”=Long Call•房價 台股加權指數•訂金 台指買權• Q1: 訂金該收多少才叫合理 ?• Q2: 能不能當房地產商,賣 “買的權利” ?• Q3: 有沒有 “賣的權利” ?

2017/01

Page 165: [系列活動] 使用 R 語言建立自己的演算法交易事業

165

台指選擇權 @2017.01.13

2017/01

Call Put履約價

Page 166: [系列活動] 使用 R 語言建立自己的演算法交易事業

損益報酬

大盤指數9450 9463-13

Long 9450Call@13

Page 167: [系列活動] 使用 R 語言建立自己的演算法交易事業

看錯一定賠! 看對不一定賺!

損益報酬

大盤指數9450

9463

-13

9378

看大對才會賺 !

日期 : 2017 年 01月 13 日賭大漲 (看多 ) :買進 9450CALL@13結算日: 2017 年 01月 18 日

大盤現在指數 : 9378點

損益兩平點

Page 168: [系列活動] 使用 R 語言建立自己的演算法交易事業

看對一定賺! 看錯不一定賠!

損益報酬

大盤指數9450

9463

+13

9378

看大錯才會賠 !

日期 : 2017 年 01月 13 日賭不漲 (看空 ) :賣出 9450CALL@13結算日: 2017 年 01月 18 日

大盤現在指數 : 9378點 損益兩平點

Page 169: [系列活動] 使用 R 語言建立自己的演算法交易事業

169

買權買方 v.s. 買權賣方

買買權Long Call

賣買權Short Call

賭大漲 ! 賭不會漲 !

2017/01

Page 170: [系列活動] 使用 R 語言建立自己的演算法交易事業

170

賣權買方 v.s. 賣權賣方

買賣權Long Put

賣賣權Short Put

賭大跌 ! 賭不會跌 !

2017/01

Page 171: [系列活動] 使用 R 語言建立自己的演算法交易事業

171

課堂練習 http://zuv.io/1556148a00

2017/01

賣出 9100 [email protected]放置結算,若大盤結算在 9200 ,賺賠多少 ?

Page 172: [系列活動] 使用 R 語言建立自己的演算法交易事業

172

買選擇權 v.s. 買樂透• 2017 年 1 月 10號周二收盤• 2017 年 1月 11號周三

2017/01

Page 173: [系列活動] 使用 R 語言建立自己的演算法交易事業

173

使用 R 語言建立選擇權部位 ( 前置 )• STK=8000:9900• portfolio=rep(0,1)

2017/01

Page 174: [系列活動] 使用 R 語言建立自己的演算法交易事業

174

使用 R 語言建立選擇權部位 ( 買權 )• CallK=9250• CallPrice=31.5• Call=STK-CallK• Call[Call<0]=0• Call=Call-CallPrice• names(Call)=STK

• portfolio=portfolio+(Call)

2017/01

Page 175: [系列活動] 使用 R 語言建立自己的演算法交易事業

175

使用 R 語言建立選擇權部位 ( 畫圖 )

• plot(portfolio,type="l",col="red",lwd=2,font=2,xaxt = "n",ylab="PL")

• axis(1,1:length(STK),as.character(STK),col="black")

• abline(h=0,col="green",lwd=2)

2017/01

Page 176: [系列活動] 使用 R 語言建立自己的演算法交易事業

176

使用 R 語言建立選擇權部位 ( 賣權 )• PutK=9050• PutPrice=15.5• Put=PutK-STK• Put[Put<0]=0• Put=Put-PutPrice• names(Put)=STK• portfolio=portfolio+(Put)

2017/01

該 如 何 修 改 ?

Page 177: [系列活動] 使用 R 語言建立自己的演算法交易事業

177

使用 R 語言建立選擇權的組合部位 (拼圖 )• 多頭價差• Long Call9300@90• Short Call9350@54

• Long [email protected]• Short [email protected]

•口訣:買低賣高2017/01

Page 178: [系列活動] 使用 R 語言建立自己的演算法交易事業

1782017/01

>9350 最多賺 14 點<9300 最多賠 36 點損益兩平點 9336 點

Long Call9300@90Short Call9350@54

Page 179: [系列活動] 使用 R 語言建立自己的演算法交易事業

179

使用 R 語言建立選擇權的組合部位 (拼圖 )• 空頭價差• Short Call9300@90• Long Call9350@54

• Short [email protected]• Long [email protected]

•口訣:賣低買高2017/01

Page 180: [系列活動] 使用 R 語言建立自己的演算法交易事業

180

Review: 傳統賭局 & 凱利

2017/01

AT= A1(1+2f)W(1-f)L

Page 181: [系列活動] 使用 R 語言建立自己的演算法交易事業

181

9300

9350

-36

14

損益

大盤結算位置 大盤結算位置

-36

損益

我認為的大盤結算位置機率

機率

<9300機率 40% >9350機率 30%9300~9350機率 30%

選擇權的多頭價差 v.s. 個人認為的機率分佈

買 9300CALL; 賣 9350CALL

大盤結算位置損益

2017/01

Page 182: [系列活動] 使用 R 語言建立自己的演算法交易事業

182

有了賠率分佈,我們還缺…大盤漲跌的機率分佈2017/01

Page 183: [系列活動] 使用 R 語言建立自己的演算法交易事業

183

什麼樣的漲跌機率分佈 ?•特徵: 2017 年 01 月 13號周五•機率分佈:特徵 下周三大盤收盤

2017/01

Page 184: [系列活動] 使用 R 語言建立自己的演算法交易事業

1842017/01

統計漲跌比例例 : 2016-12-16-1.582%

漲跌比例代入本周五收盤例 : 9378*(1-1.582%)=9230

計算損益例 : 若結算 9230 點賠 36點

計算歷史所有的漲跌所帶來的損益

Page 185: [系列活動] 使用 R 語言建立自己的演算法交易事業

185

Review Kelly Again• 勝率 50% ,賠率為 2

• 抽到紅球,叫做贏,壓的翻 2倍• 抽到紅球,叫做輸,壓的賠光

•贏的機率 50% ,輸的機率 50%• 賠率為 (2,-1)

2017/01

AT= A1(1+2f)1(1-1f)1

Page 186: [系列活動] 使用 R 語言建立自己的演算法交易事業

186

Extend Kelly Criterion

•抽到紅球為贏,翻 2倍•抽到籃球為贏,翻 1倍•抽到綠球為輸,賠光•機率 (20%, 20%, 20%, 20%, 20%)• 賠率 (2,2,1,-1,-1)

2017/01

AT = A1(1+2f)1(1+2f)1 (1+1f)1(1-1f)1(1-1f)1

= A1(1+2f)2 (1+1f)1(1-1f)2

Page 187: [系列活動] 使用 R 語言建立自己的演算法交易事業

187

HPR: Holding Period Return

• Idea: HPR= 1 + f (-profit/biggest loss)• Example: 16 、 -8 、 -8 、 +4 、 +4 、 +4• TWR (f) = HPR1 * HPR2 * HPR3 * HPR4* HPR5* HPR6

= [1 + f (-16/-8)] * [1 + f (-(-8)/-8)] * [1 + f (-(-8)/-8)] * [1 + f (-4/-8)] * [1 + f (-4/-8)]* [1 + f (-4/-8)]

= (1 + 2f )1 * (1 – f)2 * (1 + 0.5f)3

• How to find optimal f to maximize TWR(f)?• Brute method: from f=1%, f=2%, f=3%,…,f=98%,f=100%

2017/01

Page 188: [系列活動] 使用 R 語言建立自己的演算法交易事業

188

無利可圖 !!

2017/01

Page 189: [系列活動] 使用 R 語言建立自己的演算法交易事業

189

那反過來就是 “有利可圖” 瞜 !!

2017/01

Page 190: [系列活動] 使用 R 語言建立自己的演算法交易事業

190

每周 (3,4,5,1,2,3) 開盤到週 3 收盤的漲跌分佈

2017/01

Page 191: [系列活動] 使用 R 語言建立自己的演算法交易事業

191

不用考慮策略,只考慮採用什麼條件機率 !?•條件: 2017 年 01 月 13號周五•條件:周一 ~ 周五 : 紅 K or 綠 K?

2017/01

Page 192: [系列活動] 使用 R 語言建立自己的演算法交易事業

192

課堂練習 http://zuv.io/1556148a00

2017/01

若本金 100萬,今欲建立Long Call9350@54; Short [email protected]部位。經計算最佳風險比例為 5% ,則該建立幾組這樣的部位?

Page 193: [系列活動] 使用 R 語言建立自己的演算法交易事業

193

使用 R 語言建立選擇權的組合部位 (拼圖 )• 買進跨式• Long Call9350@54• Long [email protected]

2017/01

Page 194: [系列活動] 使用 R 語言建立自己的演算法交易事業

194

使用 R 語言建立選擇權的組合部位 (拼圖 )• 賣出跨式• Short Call9350@54• Short [email protected]

2017/01

Page 195: [系列活動] 使用 R 語言建立自己的演算法交易事業

195

使用 R 語言建立選擇權的組合部位 (拼圖 )• 賣出跨式• Short Call9350@54• Short [email protected]

•折腳• Long [email protected]• Long Put9250@7

• ( 買進蝴蝶價差 )

2017/01

Page 196: [系列活動] 使用 R 語言建立自己的演算法交易事業

196

使用 R 語言建立選擇權的組合部位 (拼圖 )• 賣出勒式• Short [email protected]• Short [email protected]

2017/01

Page 197: [系列活動] 使用 R 語言建立自己的演算法交易事業

197

使用 R 語言建立選擇權的組合部位 (拼圖 )• 賣出勒式• Short [email protected]• Short [email protected]

•折腳• Long [email protected]• Long Put9250@7

2017/01

( 買進兀鷹價差 )

Page 198: [系列活動] 使用 R 語言建立自己的演算法交易事業

198

Black-Schole Model

2017/01

Page 199: [系列活動] 使用 R 語言建立自己的演算法交易事業

199

如何操爆你的資金 !?槓桿空間模型

(Leverage Space Model)

2017/01

多策略、多商品、多市場

Page 200: [系列活動] 使用 R 語言建立自己的演算法交易事業

2002017/01

多策略、多商品、多市場

若下注 40 次,每次下 f 比例 ( 理論 )

剩下的 75% 資金要幹麻 ? 玩另一場 ?

Page 201: [系列活動] 使用 R 語言建立自己的演算法交易事業

201

同時玩 2場,每場各壓 23% ,資金運用達46%!

2017/01

10倍 90倍報酬再多 9倍 !

Page 202: [系列活動] 使用 R 語言建立自己的演算法交易事業

202

同時玩 3場,每場各壓 21% ,資金運用達63%!

2017/01

10倍 90倍 622倍報酬再多 62倍 !

Page 203: [系列活動] 使用 R 語言建立自己的演算法交易事業

2032017/01

Page 204: [系列活動] 使用 R 語言建立自己的演算法交易事業

2042017/01

Page 205: [系列活動] 使用 R 語言建立自己的演算法交易事業

205

小結 : LSM告訴我們什麼 ?

尋找”最好的”市場、商品、策略 !?分配最適當、有效率的資金運用比例 !

2017/01

Page 206: [系列活動] 使用 R 語言建立自己的演算法交易事業

206

然而…有時候你只需要一點想像力 !!!

2017/01

你可以分析全球各個金融市場資料,運用各種高深的數學模型用 Big Data?

Page 207: [系列活動] 使用 R 語言建立自己的演算法交易事業

2072017/01

2016 年 02月 22 日 ( 週一 )你覺得主力在幹什麼 ?

我覺得主力閒閒在家沒事做,很無聊,畫 蝙 蝠 俠 !

Page 208: [系列活動] 使用 R 語言建立自己的演算法交易事業

208

自從出現蝙蝠俠後, 10 個交易日裡,有 6 個交易日都是類似走勢,早盤衝高後又急速拉回 !!!

2017/01

Page 209: [系列活動] 使用 R 語言建立自己的演算法交易事業

209

看功夫學交易 !

2017/01

Page 210: [系列活動] 使用 R 語言建立自己的演算法交易事業

210

火雲邪神的啟示:天下武功,無堅不破,唯快不破 !

2017/01

Page 211: [系列活動] 使用 R 語言建立自己的演算法交易事業

211

Thank You!未來有緣再見 !

2017/01