資料科學系列活動—
用 R 輕鬆做交易策略分析及自動下單
Speaker: 吳牧恩、林佳緯(Julian)
Date: 2016.09.24(六)
2016/09 1
你為何報名這堂課?
• 想賺錢?
• 想用R寫回測程式?
• 覺得自己是百年難得一見的交易奇才?
• 想用R下單?
• 如果你是工程背景?
• 如果你是數理背景?
• 如果你是金融背景?
• 如果你什麼背景都沒有?
2016/09 2
先自我介紹一下
• 大家好,我是牧恩!
• 部落格 (Bituzi)
• 筆名:牧清華
• 數學 
• 資金管理 理論模擬策略回測
2016/09 3
https://www.youtube.com/watch?v=i5uCWL0nsFA
你是百年難得一見的交易奇才嗎!?
• 主觀交易
• 市場上的眾多老師
• 傑西李佛摩
• 計量交易
• 西蒙斯(Jame Simons)
2016/09 4
過去:得民心者得天下!!
現在:得“計量”者得天下!?
過去股市名嘴喊盤,現在資料科學說話
2016/09 5
加上量放大的條件?
2016/09 6
烏雲罩頂: n天後的機率分佈
2016/09 7
空頭吞噬: n天後的漲跌分佈
2016/09 8
今天想帶給大家的內容
• 第一次使用R語言做回測就上手
• 下載資料、讀取資料、畫K線、簡單回測
• 如何研發好的交易策略?
• 績效:勝率、賠率、MDD、獲利因子
• 策略:濾網、動量、加碼
• 交易的聖盃:資金管理的理論與實務
• 理論:凱利賭徒、最佳化比例、槓桿空間模型
• 實務:固定分數、固定比例、選擇權價差交易實務
• 用R語言串接API下單
• Julian
2016/09 9
哪裡下載R語言?
2016/09 10
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")
2016/09 11
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}
2016/09 12
1+1+1+…+1=?
1+1+1+…+1=?
1+3+5+…+97+99=?
安裝quantmod
• install.packages("quantmod")
• library(quantmod)
參考網站:
• http://www.quantmod.com/
2016/09 13
下載資料 getSymbols
• 下載資料(預設Yahoo Finance)
• 蘋果: getSymbols("AAPL")
• 台積電: STK=get(getSymbols("2330.tw"))
• 不同的資料源:
• getSymbols('MSFT',src='google')
• getSymbols("DEXJPUS",src="FRED")
• 資料格式
• 使用head、tail
• 五個欄位:開高低收、量、還原權值
2016/09 14
畫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")
2016/09 15
技術分析指標
• 均線
• 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()
2016/09 16
回測前置作業
• STK.week的列名稱
• rownames(STK)
• 有多少個日期?
• length(rownames(STK))
• 產生紀錄每筆交易損益的向量
• numeric(length(rownames(STK)))
• 產生紀錄每筆交易損益的向量,並附上日期
• profit=setNames(numeric(length(rownames(STK))), rownames(STK))
2016/09 17
台積電: 週一開盤買,週五收盤賣
• 每周損益:周收盤價-周開盤價
• profit[m]=STK[m,4]-STK[m,1]
• 每週都要計算?
• for (m in rownames(STK)) {
• profit[m]=STK[m,4]-STK[m,1]
• }
• 練習
• 1: 若是開盤賣,收盤買
• 2: 月K架構?
2016/09 18
損益績效
• 損益向量
• profit
• 總損益
• sum(profit)
• paste("Profit:",sum(profit))
• 累計損益
• cumsum(profit)
• 畫出累計損益
• plot(cumsum(profit), type="l",col="red",lwd=2)
• abline(h=0,col="green")
2016/09 19
簡單的績效分析
• 贏的次數
• length(profit[profit>0])
• 勝率
• length(profit[profit>0])/length(profit[profit!=0])
• 平均賺
• mean(profit[profit>0])
• 平均賠
• mean(profit[profit<0])
• 賺賠比
• mean(profit[profit>0])/abs(mean(profit[profit<0]))
2016/09 20
如何研發好的交易策略?
最大回檔、獲利因子、動量策略、加碼
2016/09 21
台積電: 週一開盤買,週五收盤賣!
績效模組: performance.R
2016/09 22
• Total Profit: 96685
• Trading Days: 488
• Profit Per Trade: 204.4091
• # of Win: 250
• Win Rate: 52.85412 %
• Winning Average: 2287.299
• Lossing Average: -2130.669
• Maximum Draw Down: 31800
• The Periods of MDD: 16 18 20 48 282
• Profit Factor: 1.203489
• Total Profit/MDD: 3.040425
最大回檔(maximum drawdown, MDD)
• 回檔(DD)
• 最好不要有回檔(虧損、風險)
• 例如:定存最好!?
• 絕對最大回檔(MDD)
• 比例最大回檔(MDD%)
• 穩定度的表現:
• 總獲利/MDD
2016/09 23
獲利因子(profit factor)
• 賺的和 / |賠的和|
• sum(profit[profit>=0])/sum(profit[profit<0])
• 意義:每輸1單位,必可再換來?單位的獲利
• 勝率很低無所謂? Why?
• 賺小賠大無所謂? Why?
• 交易次數很少無所謂? Why?
2016/09 24
台積電這幾年都在多頭,每週開盤買
當然賺!
考慮多空: 開低買,開高賣
2016/09 25
週一開低買,開高賣,週五收盤前出
• 第一週是否可以交易?
• 先紀錄第一週收盤
• 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]
}
• 練習
• 開低1%買,開高1%賣,收盤前空手
2016/09 26
TSMC: 開低買,開高賣
• Total Profit: 160638
• Trading Days: 488
• Profit Per Trade: 340.3358
• # of Win: 260
• Win Rate: 55.08475 %
• Winning Average: 2320.59
• Losing Average: -2088.278
• Maximum Draw Down: 25500
• The Periods of MDD: 20 22 39 50 89
• Profit Factor: 1.362849
• Total Profit/MDD: 6.299549
2016/09 27
練習:開低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]
}
• 最佳化參數:開低?%買,開高?%賣,收盤前空手
2016/09 28
當然你也可以試試其他股票
中鋼、中華電、鴻海、統一、國泰金、
甚至…..宏 達 電 !><
2016/09 29
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
2016/09 30
扣掉交易成本
• 股票手續費
• 成交金額*0.1425% ,
• 買賣各一次
• 小數點以下無條件捨去,不足20元以20元計
• 證券交易稅:0.3%
• fee=STK[m,4]*0.006
• 期貨滑價+手續費扣5點
• 傳統回測:2+2+1?
• 經驗平均滑價約1.5點
2016/09 31
台積電:聖盃  靠盃
2016/09 32
尋找0050成份股哪隻股票最會獲利?
• 你可以考慮下面規則?
• 1. 周K架構 or 月K架構哪個好?
• 2. 開高(?%)賣,開低(?%)買
• 3. 開低(?%)買,開高(?%)賣
• 4. 是否可做到停損 & 停利?
• 停損不停利
• 停利不停損
• 請扣掉手續費:fee=STK[m,4]*0.006
• 試找出2007年至今,誰的 “profit”最高? 或是誰的PF最大?
2016/09 33
沒轍了嗎?
開始發揮人類愛賭的天性!!
凹~ 再凹~~~ 無止境的凹!!!
2016/09 34
馬丁格爾的聖盃!? (以輪盤為例~)
贏: 翻倍;輸: 賠光
勝率18/37,賠率為1 (1:1)
2016/09 35
https://www.youtube.com/watch?v=RldNUWT2pyY
輪盤賭場優勢
2016/09 36
一種天真浪漫的賭法~(勝率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
2016/09 37
記得當時…
PM 06:00進賭場,AM 11:00出賭場
10枚籌碼進去,50枚籌碼出來!
假設每3~4分鐘可玩1局,
1小時約玩16局,5小時大約玩80局
2016/09 38
Beginner’s Luck!?
我們就用R語言來模擬…
10枚籌碼,最多玩80次,超過50枚的
機率?
2016/09 39
(馬丁格爾模擬) 100枚籌碼,最多玩1000次
2016/09 40
http://www.letyourmoneygrow.com/2016/09/04/mystery-and-misery-of-the-martingale-
betting-system-why-it-will-not-make-you-rich/
10枚籌碼,最多玩80次,最後超過50枚的機率!
2016/09
輸錢離場的機率為81.106%
賺超過50枚的機率為5.322%
Beginner’s Luck
確認!
模擬10000次
41
現在,我們開始 ”玩” 策略…
馬丁格爾: 贏了交易一張,輸了加倍交易
2016/09 42
交易的馬丁格爾
• 產生一個計算每次部位大小的向量
• 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}
• 計算每一次的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]}
}
2016/09 43
將PZ前與PZ後畫在一起比較
• source(“performance.R”)
• par(mfrow=c(1,3)) ##三張圖畫同一個畫面
• performance(profit) ##PZ前
• performance(profit*PZ) ##PZ後
• ProfitBar(PZ) ##PZ大小
• max(PZ) ##最大使用部位
• mean(PZ) ##平均使用部位
2016/09 44
馬丁格爾:輸了加倍買,贏了買1張
2016/09 45
PZ大法:輸縮贏衝
• 練習:類馬丁格爾 (1234…)
• 練習:贏了交易一張,輸了交易兩張
• 或是找出你認為最好的輸贏PZ?
• 輸輸贏、輸輸輸贏、贏?
2016/09 46
類馬丁格爾(1234):
輸了多交易1張,贏了只交易1張
2016/09 47
為了控制風險: 輸了交易2張,贏了交易1張
2016/09 48
輸了“多”買1張
濾網:輸了才交易1張,贏了就休息
• PZ大法
• 練習:連輸兩次再交易是否更好?
2016/09 49
濾網:去蕪存菁,拆解成…
輸了買2張,贏了買1張 = 買1張+ 輸了才買1張
2016/09 50
Total Profit: 70978.7
Trading Days: 488
Profit Per Trade: 292.0934
# of Win: 135
Win Rate: 55.55556 %
Winning Average: 2195.129
Lossing Average: -2086.701
Maximum Draw Down: 15423
The Periods of MDD: 27 35 41 48 107
Profit Factor: 1.314952
Total Profit/MDD: 4.602133
輸了“才”買1張
輸贏濾網好不好? 會不會是OverFitting?
2016/09 51
動量策略 v.s.均值回歸
• 動量策略 (順勢交易,買高賣低,違反人性):
• 因為過去漲,所以現在買進;因為過去跌,所以賣出
• 均值回歸 (逆勢交易,買低賣高,大家都愛):
• 漲多了該回跌,跌深了該反彈
• 牛頓第二運動定律:動者恆動,靜者恆靜?
• 股價漲未來是否會繼續漲?股價跌未來是否會繼續跌?
• 進場、加碼、停損、停利 屬於哪一種?
• 在交易裡,大部分違反人性的事,都是好事!
• 不正常的人才會獲利!!!
2016/09 52
我們使用“隨機交易”概念!
度量停損停利帶來的影響~
策略:開盤隨機交易,停損?停利?。
2016/09 53
開盤隨機交易,不停
損不停利,收盤平倉
2016/09 54
開盤隨機交易,停損30,
停利30,收盤平倉
隨機交易,停損30 ,
停利60,收盤平倉
2016/09 55
隨機交易,停損30,
不停利,收盤平倉
台指期貨隨機交易統計
• 不停損,停利30點
• 停損145點,停利35點
• 停損140點,停利40點
• …
• 停損35點,停利145點
• 停損30點,不停利
2016/09 56
順勢、動量、違反人性!
2016/09 57
隨機交易,停損30,
不停利,收盤平倉
隨機交易,不停損,
停利30,收盤平倉
隨機交易,其他股票如何?
1%停損,不停利
v.s.
1%停利,不停損
2016/09 58
Momentum v.s. Mean Reverse
2016/09 59
進場的動量策略
突破n日高點、跌破n日低點
黃金交叉、死亡交叉
箱型突破、箱型跌破
均線糾結後多頭排列,空頭排列
2016/09 60
“突破”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日高點
• 前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 61
策略改進,使用波動濾網:
金融市場,什麼都是假的!
只有大小波動是真的!!
2016/09 62
最簡單的波動…. 如果這是股價的波動?
2016/09 63
20日標準差
2016/09 64
日波動:每日開盤與收盤的漲跌幅
2016/09 65
將目前的策略,增加波動濾網
• 採用10日標準差當波動,門檻值0.7
• if (sd(Cl(STK)[(m-10):(m-1)])<0.7){
原策略
}
• 波動小策略品質好? 還是波動大策略品質好?
• 找出最好的波動門檻?
2016/09 66
拿廢話當濾網…..
2016/09 67
天下之大: 合久必分,分久必合
金融市場: 波大必小,波小必大
世間萬物都是遵循此道!
2016/09 68
2016/09 69
順勢策略:波動大小決定策略品質好壞?
波動<100 波動介在100~150 波動>150
亂入策略波小當濾網輸了才交易
2016/09 70
加碼的奧義
成也加碼,敗也加碼!!
2016/09 71
加碼的奧義: 成也加碼,敗也加碼!!
• 摩天大樓 (1,1,1,1….)
• 海龜
• 金字塔 (5,4,3,2,1)
• 正常人
• 倒金字塔(1,2,3,4,5)
• 瘋子
2016/09 72
投票表決一下你覺得哪個加碼法好?
考慮台指期動量策略: 開盤+門檻值突破
(用了濾網,採用順勢)
2016/09 73
Buy
原始策略(單口當沖)績效與累計損益:X
2016/09
損益: 1670
總交易天數: 1375
實際交易次數: 199
平均每次損益: 8.434343
獲利次數: 80
勝率: 40.40404 %
平均賺: 56.175
平均賠: -23.9322
最大連續虧損: 250
最大連續虧損區間(天): 108
114 197 254 302
獲利因子: 1.59136
總獲利/MDD: 6.68
74
加碼規則:
進場後5分鐘後仍有獲利,加碼 1 口!
2016/09 75
加碼第一口後: X+X1
2016/09
損益: 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
76
加碼第二口後: X+X1+X2
2016/09
損益: 29513880
總交易天數: 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
77
加碼第三口後: X+X1+X2+X3
2016/09
損益: 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
78
一口一口加碼,你就滿足嗎?
策略拆解: 分別”獨立”看每次的加碼!
2016/09 79
第一次加碼: X1
2016/09
損益: 1281
總交易天數: 1375
實際交易次數: 103
平均每次損益: 12.43689
獲利次數: 47
勝率: 45.63107 %
平均賺: 55.12766
平均賠: -23.39286
最大連續虧損: 215
最大連續虧損區間(天): 93 96 98 114 345
獲利因子: 1.977863
總獲利/MDD: 5.95814
80
第二次加碼 :X2
2016/09
損益: 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
81
第三次加碼: X3
2016/09
損益: 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
82
觀察:越加碼 品質越好!
等差加碼 (1234神經病!)
等比加碼 (1248瘋子!)
2016/09 83
等差加碼1234
2016/09
損益: 9255
總交易天數: 1375
實際交易次數: 199
平均每次損益: 46.50754
獲利次數: 72
勝率: 36.1809 %
平均賺: 229.7083
平均賠: -57.35433
最大連續虧損: 858
最大連續虧損區間(天): 93 94 98 114 257
獲利因子: 2.270593
總獲利/MDD: 10.78671
84
等比加碼1248
2016/09
損益: 12420
總交易天數: 1375
實際交易次數: 199
平均每次損益: 62.41206
獲利次數: 72
勝率: 36.1809 %
平均賺: 289.1389
平均賠: -66.12598
最大連續虧損: 1079
最大連續虧損區間(天): 93 94 114 157 257
獲利因子: 2.478924
總獲利/MDD: 11.51066
85
結論:加碼是放大器,同時放大”風險”與”利潤”
好的原始策略加碼更好;
壞的原始策略加碼就完蛋!!! (overfitting)2016/09 86
交易的聖盃:資金管理的理論與實務
凱利、最佳化比例、槓桿空間模型
固定分數、固定比例、Ranking賭小一點
交易 v.s. 賭局 是否一樣?
哪裡一樣? 哪裡不一樣?
何謂賭局? 何謂交易?
2016/09 87
給你一枚銅板,人頭輸,數字贏2倍!
• 勝率50%,賠率為2
• 期望獲利
• 50%*(1+2)-1=0.5
• 平均來說,每賭1元,可獲利0.5元,50%報酬。
• 你有100元,可以玩無限多次,你會怎麼賭?
• 如果連這麼好的賭局,你都不會賭,你憑什麼在交易上獲利?
• 你可能會有其他說法,交易跟賭局不一樣?
• 交易勝率不固定,賠率不固定
• 交易次數有限次,賭局無限次
2016/09 88
賠光
WIN
LOSE
要玩 “期望淨利 > 0”
的賭局,這個大家都知道!
但這樣就夠了嗎?
2016/09 89
做個賭徒模擬實驗就知道….
• 勝率50%,賠率為2
• 1. 玩40次下注多少比例f會最好?
• 不同下注比例10%,20%,…,60%
• 2. 玩很多次下注多少比例f會最好?
• 玩100次、500次、1000次、5000次
• 用R語言模擬一下~
• Input: 勝率、賠率、下注比例
• Output: 資金成長曲線!
2016/09 90
考慮 勝率50%,賠率為2 的賭局
2016/09
資金100元
100元
91
考慮 勝率50%,賠率為2 的賭局
2016/09
資金100元,如果下注20元
80元
20元
92
考慮 勝率50%,賠率為2 的賭局
2016/09
資金100元,如果下注20元
贏:100*(1+2*20%) 80元
20元
20元
20元
93
考慮 勝率50%,賠率為2 的賭局
2016/09
資金100元,如果下注20元
贏:100*(1+2*20%) 100元
20元
20元
140元
20元
94
考慮 勝率50%,賠率為2 的賭局
2016/09
資金100元,如果下注20元
贏:100*(1+2*20%)
輸:100*(1-20%)
100元
20元
80元
95
賭局設定:
• 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 (紀錄每一局資產)
2016/09 96
銅板賭局模擬
• 開始賭!
• 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)} ## 資金成長
• 畫累計損益
• 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)
2016/09 97
2016/09 98
身為一個賭徒(交易員)
“賭” 最佳化!
身為一個數學家
“資金管理” 最佳化!
2016/09 99
凱利賭徒
“理論上”的最佳下注比例
理論、模擬、分析
2016/09 100
定義問題!!
• 勝率50%,賠率2的賭局
• 初始資金100元,玩無限多次
• 假設人生可以天長地久
• 每次決定下注比例f (0% < f < 100%)
• 假設資金可以無限分割
• 問題:f選多少可讓資金成長最快速!
2016/09 101
凱利公式推導
• 勝率為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
• 如果玩無限多次會怎樣?
2016/09 102
求 f 使得 AT= A1(1+bf)W(1-f)L 最大 ?
• Rearranging:
1
𝑇
log
𝐴 𝑇
𝐴1
=
𝑊
𝑇
log(1 + 𝑏𝑓) +
𝐿
𝑇
log(1 − 𝑓)
• As 𝑇 → ∞, we have 𝑝 log(1 + 𝑏𝑓) + (1 − 𝑝) log(1 − 𝑓)
𝒇 =
𝒑 𝟏 + 𝒃 − 𝟏
𝒃
• 什麼時候 f=1? (Showhand!)
• 勝率99%,賠率10000的賭局,要你全壓,你賭不賭?
2016/09 103
2016/09 104
凱利騙局
•到底是誰騙了誰?
• Kelly
• Thorp
• Larry William
• Ralph Vince
2016/09 105
不同的部位配置(position sizing, PZ),
會造成不同的報酬損益!!
不是老師帶你上天堂、住套房,而是
”資金管理” 帶你上天堂、住套房!!
2016/09
一句話談交易:用風險換報酬
106
• 勝率固定(50%),賠率固定(2)的賭局
• 不管如何Sample (10個取,20個取,50個取,100個取) 都一樣!!
• 我以為的交易是上面這樣…
• 實際的交易損益是:不知道機率、不知道賠率!?
博弈理論 v.s. 交易實務
2016/09
-1
107
交易賭局:機率未知,但可 “預估”….???
• 賭局給定機率、賠率
• 交易回測給定”歷史損益” (Ralph Vince’s Optimal F)
2016/09 108
In Sample Out Sample
HPR: Holding Period Return
• Idea: HPR= 1 + f (-profit/biggest loss)
• Example: 16、-8、+4
• TWR (f)
= HPR1 * HPR2 * HPR3
= [1 + f (-16/-8)] * [1 + f (-(-8)/-8)] * [1 + f (-4/-8)]
= (1 + 2f ) * (1 – f) * (1 + 0.5f)
• How to find optimal f to maximize TWR(f)?
• Brute method: from f=1%, f=2%, f=3%,…,f=98%,f=100%
2016/09 109
HPR理論 (玩1次的損益期望值 v.s.下注比例)
2016/09 110
然而,人生並不像銅板賭局那麼簡單…
交 易 也 是!
沒有連續,只有離散
沒有永恆(無限),只有曾經(有限)
2016/09 111
2016/09 112
一場勝率50%、賠率為2的賭局,賭起來天南地北!
10次
50%
500次
24%
40次
31%
100次
21%
1000次
26%
5000次
25%
2016/09 113
TWR模擬:從 (16,-8,4) 取樣也天南地北!
10次
52%
500次
38%
40次
35%
100次
46%
1000次
36%
5000次
38%
三個層級的先知
• 第一層 (神):不用知道勝率,因為他知道下一場會贏還是會輸!
• 可以梭哈(ShowHands)
• 第二層(半仙):知道未來10次,”一定會贏5次,輸5次“
• 可以下最佳比例(Optimal f)
• 第三層(智者):知道未來10次發生的機率“確實是50%”。(不容易)
• 一旦遇到偏差,錯誤的下注比例很有可能讓你受傷慘重。
•賭小一點(1%~2%)
2016/09 114
再來我才要解釋這件事!
下面策略,你選哪一個?
2016/09 115
100萬 230萬 100萬1642萬
原始策略: 想要Fitting,又怕OverFitting
然而,這些都不是最重要的….
交易聖盃: 資金管理!!
https://www.youtube.com/watch?v=yVQWJeLUxSk
2016/09 116
2016/09 117
1% 3% 5% 8%
單口 風險比例
最常用的資金管理:固定分數(Fixed Fraction)
•凱利賭局的勝率已知,賠率已知  控制虧損
•交易的勝率未知,賠率未知 ?????
還是只能控制虧損!!
2016/09 118
開盤突破昨日波動(高低)*k1
• 開盤突破昨日波動*k1買進
• 20點停損,收盤平倉
• 回測標的:台指期貨
• 回測時間:2010.05.25~2015.09.10
2016/09
程式碼: 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
119
輸贏濾網:輸了一次再進場!
2016/09 120
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
固定分數 (以台指期貨為例,固定風險比例2%)
• 每口最大損失: 200*(30+5)=7,000
• loss=7000
• 初始資金: 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,下單口數??
2016/09 121
程式碼:8_Fixed_Fraction.R
每次交易最多損失總資金的2%
假設你有100萬,每次交易最多可損失
100萬*2%=20000
則你最多下 (下高斯20000/7000) =2 口
• 設定固定分數向量
• 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.F
F*200)),1000)
2016/09 122
2016/09
Total Profit: 3054
# of Win: 161
Win Rate: 39.07767 %
Maximum Draw Down: 1273
The Periods of MDD: 112 171 188 204 254
Profit Factor: 1.150466
Total Profit/MDD: 2.399057
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 123
再來看一下Kelly是不是真的那麼神?
• 勝率: 39.07 %
• 賠率:平均賺/平均賠
• 平均賺: 43.8
• 平均賠: -23.56
• 凱利比例: 11.5 %
2016/09 124
固定比例 (Fixed Ratio)
• 瑞恩.瓊斯(交易的遊戲,1999)
• 固定分數的缺點:最初合約的增速很慢,一但累積到一定數額後,
合約的速度會突然增加很快。
• 固定比例
• 試圖平等對待每份合約,使資金的增長速率相同。
• 1. 假設資金X,從一個單位做起,例如1口。
• 2. 固定每份合約的增長量(Delta)
2016/09 125
初始資金100萬,做1口;Delta = 8萬。
•做2口的資金 = 做1口的資金 + 1*Delta = 108萬。
做3口的資金 = 做2口的資金 + 2*Delta = 124萬。
做4口的資金 = 做3口的資金 + 3*Delta = ? 萬。
•做n口的資金 = 做n-1口的資金 + (n-1)*Delta = ?。
2016/09 126
固定比例:做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
2016/09 127
HW: 實做固定比例,並與固定分數比較
2016/09 128
凱利公式用於選擇權
2016/09 129
買權買方 v.s. 買權賣方
買買權
Long Call
賣買權
Short Call
賭大漲! 賭不會漲!
2013/10/21
賣權買方 v.s. 賣權賣方
買賣權
Long Put
賣賣權
Short Put
賭大跌! 賭不會跌!
2013/10/21
7950
8000
-1750
750
損益
大盤結
算位置
大盤結
算位置
-1750
損益
我認為的大盤
結算位置機率
機率
<7950
機率20%
>8000
機率50%7950~8000
機率30%
選擇權的多頭價差 v.s. 個人認為的機率分佈
買7950CALL; 賣8000CALL
期望獲利:
−𝟏𝟕𝟓𝟎 × 𝟐𝟎% + −𝟏𝟕𝟓𝟎+𝟕𝟓𝟎
𝟐
× 𝟑𝟎% + 𝟕𝟓𝟎 × 𝟓𝟎%
= −𝟏𝟐𝟓 < 𝟎 (不要賭!)
大盤結算位置損益
2013/10/21
機率分佈 f(x)
-1750
750
損益
大盤結算位置損益
我認為的大盤結算位
置機率
機率
7950 80007985 大盤結
算位置
p*(1+b)-1 > 0 ?
1. 計算市場賠率
2. 預測市場分佈!
3. 如何驗證此分佈是否正確?
2013/10/21
如何操爆你的資金!?
槓桿空間模型
(Leverage Space Model)
2016/09 134
多策略、多商品、多市場
2016/09 135
多策略、多商品、多市場
若下注40次,每次下f比例(理論)
A 𝒇 = 𝟏 + 𝟐𝒇 𝟐𝟎 𝟏 − 𝒇 𝟐𝟎
…
𝒇 = 𝟐𝟓%
剩下的75%資金要幹麻? 玩另一場?
同時玩2場,每場各壓23%,資金運用達46%!
2016/09 136
10倍  90倍
報酬再多9倍!
同時玩3場,每場各壓21%,資金運用達63%!
2016/09 137
10倍  90倍622倍
報酬再多62倍!
2016/09 138
2016/09 139
小結: LSM告訴我們什麼?
尋找”最好的”市場、商品、策略!?
分配最適當、有效率的資金運用比例!
2016/09 140
然而…有時候你只需要一點想像力!!!
2016/06 141
你可以分析全球各個金融市場資
料,運用各種高深的數學模型
2016/06 142
2016年02月22日 (週一)
你覺得主力在幹什麼?
我覺得主力閒閒在家沒事做,
很無聊,畫 蝙 蝠 俠!
自從出現蝙蝠俠後,10個交易日裡,有6個交
易日都是類似走勢,早盤衝高後又急速拉回!!!
2016/06 143
看功夫學交易!
2016/09 144
火雲邪神的啟示:
天下武功,無堅不破,唯快不破!
2016/09 145
Thank You!
未來有緣再見!
2016/09 146
用R語言串接API下單
交易執行與API系統架構
林佳緯
課程綱要
1. 交易執行與API系統架構
2. R計量交易套件介紹
3. R下單機設計說明與展示
交易系統架構
多算勝,少算不勝,而況無算乎
孫子兵法始計篇 第一
交易的手與腦
策略開發
策略執行
商品交易資訊
即時資料源
-----------------
事件驅動
決策引擎
計量模型
-----------------
交易執行規則
執行
交易單
-----------------
作業風險管理
歷史資料
跨日/日內資料
-----------------
資料庫
決策引擎
研究方法/演算法
-----------------
校準
回測
損益模擬
-----------------
風險評估
交易執行系統架構
交易系統的基本要求:
1. 即時 (延遲低於微秒)
2. 零誤差 (小於 6 Sigma)
3. 同時處理大量資料
4. 高可用性與熱機備援
5
完整交易系統架構圖
Application
Order Manager
Market Data
Complex Event Processing
engine
Exchange
1
Storage
Application Server Exchange
Strategy
Settings
UI
State
Mgmt (PnL
+ Position)
Order /
Execution
Monitor
Within
application
TMS
Maths
Calc
OMS
Admin
Monitor
Exchange
2
F
I
X
F
I
X
Data
Normalizer
Order
Router
Back
office
record
MktData
Store
Event
History
Adaptor for
third party
apps – R,
Matlab, etc
Data
Retrieval
Data Vendor
Replay
of stored
data
Simulator
exchange
API
軟
體
6
台灣券商 API - 元大期貨為例
7
報價API 程式
下單API 程式
券商API 資訊流
中斷連線
帳務查詢
建立連線
商品註冊 行情資料 取銷註冊
海外期貨
國內期貨
手動委託
委託回報
手動回報
成交回報
台灣券商 API 比較
2014年Julian Lin整理
9
海外券商 API – 盈透(Interactive Brokers)為例
1
0
IB Trader Workstation 系統資訊流
Establish
Connection
ibtws
Get Info
accounts
contractdetails
portfolio
Get Data
getdata
timeseries
history
realtime
marketdepth
Create Orders
orderid
createorder
orders
executions
Close
Connection
close
IB API架構圖
1
2
資料來源: http://www.bearcave.com/software/market_trading/resources_and_notes/Architecture%20of%20an%20Interactive%20Brokers%20Based%20Trading%20System.html
IB API 透過程式進行自動交易
1
3
資料來源: http://holowczak.com/ib-api-java-realtime/3/
交易系統化的優點
• 情緒影響最小化
• 可反覆回測驗證
• 維持交易紀律
• 一致性結果
• 提升下單速度
• 交易多角化
1
4
交易系統化的缺點
• 軟硬體失靈故障
• 必須持續性監看,預防技術性異常的處理
• 過度優化
1
5
R計量交易套件介紹
R 計量財務套件規劃圖
Cran Task View: Empirical Finance
https://cran.r-project.org/web/views/Finance.html
Big data
High Frequency
High Frequency
Sendrequeststheserver
Downloadandload
Data Mining
quant mod
Raw Data
A web application
Online
Shiny
Price Data
TTR
Techical Trading
Candlestick Chart
Additions of different
lines to the chart
* Moving Average
* Bollinger Bands
* Moving Average
Convergence
Divergence
Demonstration
framework for R
Statistics
* Downside risk
measures
* Risk-adjusted
performance
Plots
* Density plot
* Time series plot
* Drawdown plot
Return Data
Performance Analytics
Performance Analysis
Data Journcy
ExamplesofUsingRinFinanceExtensions
Datacleansing
Datatransformation
Webpages
Files
Database
RCurl
httr
rvest
17
R計量分析套件階層分類
應用範圍 R 套件
績效度量表及圖表 PerformanceAnalytics - 投資績效與風險分析
投資組合優化與
計量交易策略
PortfolioAnalytics - 投資組和分析與優化
quantstrat - 規則為基礎的交易系統開發
blotter - 交易系統帳務基礎結構
歷史資料存取與財務圖
表
quantmod - 量化財務模型框架
TTR - 技術分析規則
時間序列物件
xts - 時間序列物件延伸功能
zoo - 時間排序觀察
1
8
R 回測套件的優缺點
• 仍在持續開發中,難免有些小瑕疵
• 回測速度慢 (相較 Python, C, MATLAB)
• 問題必須自己找解答
• 免費
• 開放原始碼
• 客製化自由度高
• 多幣別 多商品 多策略
1
9
quantstrat 安裝說明
安裝計量套件指令
install.packages("devtools")
require(devtools)
install.packages("FinancialInstrument", repos="http://R-Forge.R-project.org")
install.packages("blotter", repos="http://R-Forge.R-project.org", type=“source”)
install.packages("quantstrat", repos="http://R-Forge.R-project.org", type=“source”)
install.packages("PortfolioAnalytics")
2
1
先安裝R 開發工具套件
install.packages("devtools")
2
2
逐一安裝quantstrat相關套件
install.packages("FinancialInstrument",
repos="http://R-Forge.R-project.org")
install.packages("blotter",
repos="http://R-Forge.R-project.org",
type=“source”)
install.packages("quantstrat",
repos="http://R-Forge.R-project.org",
type=“source”)
install.packages("PortfolioAnalytics")
2
3
安裝後檢查
2
4
測試結果
install.package(“RCurl”)
source_https <- function(url, ...) {
# load package
require(RCurl)
# parse and evaluate each .R script
sapply(c(url, ...), function(u) {
eval(parse(text = getURL(u, followlocation = TRUE, cainfo = system.file("CurlSSL",
"cacert.pem", package = "RCurl"))), envir = .GlobalEnv)
})
}
寫一段直接到git_hub載入程式碼的程式碼:
2
5
直接載入github內quanstrat的範例程式碼
bbands.R
為quantstrat 在 Github 上的一個布
林通道策略範例
source_https.R
source_https("https://raw.githubusercontent.com/R-Finance/quantstrat/master/demo/bbands.R")
2
6
交易回測step by step
quantstrat 策略回測流程
讀取資料檔
設定啟始的參
數與變數因子
產生指標 產生訊號
交易進出場的
執行規則
更新交易帳戶
資料
回測結果產出
參數優化
2
8
quantstrat 基本的回測流程
29
幣別、商
品、
歷史資料
載入起始
化
投資組合、
帳戶、交
易單、交
易策略
起始化
加入交易
指標、交
易訊號、
交易規則
策略回測
更新投資
組合、帳
戶、權益
資料
產生投資
績效報告
與圖表
起始化動作 策略定義 回測處理 帳務更新 報表產生
策略商品的啟始化
library(quantstrat)
ttz<-Sys.getenv('TZ')
Sys.setenv(TZ='UTC‘)
if (!exists('.blotter')) .blotter <- new.env()
if (!exists('.strategy')) .strategy <- new.env()
suppressWarnings(rm("order_book.macross",pos=.strategy))
suppressWarnings(rm("account.macross","portfolio.macross",pos=.blotter))
suppressWarnings(rm("account.st","portfolio.st","stock.str","stratMACROSS",'start_t','end_t')
stock.str='AAPL'
currency('USD')
stock(stock.str,currency='USD',multiplier=1)
startDate="2000-12-31“
initEq=1000000
3
0
策略的帳戶、下單、投資組合啟始化
portfolio.st='macross'
account.st='macross‘
initPortf(portfolio.st,symbols=stock.str
initAcct(account.st,portfolios=portfolio.st, initEq=initEq)
initOrders(portfolio=portfolio.st)
stratMACROSS <- strategy(portfolio.st)
3
1
定義指標
stratMACROSS <- add.indicator(
strategy = stratMACROSS, name = "SMA", arguments = list(x=quote(Cl(mktdata)), n=50),label= "ma50" )
stratMACROSS <- add.indicator(
strategy = stratMACROSS, name = "SMA", arguments = list(x=quote(Cl(mktdata)), n=200),label= "ma200")
3
2
定義訊號
stratMACROSS <- add.signal(
strategy = stratMACROSS,
name="sigCrossover",
arguments = list(columns=c("ma50","ma200"), relationship="gte"),
label="ma50.gt.ma200")
stratMACROSS <- add.signal(
strategy = stratMACROSS,
name="sigCrossover",
arguments = list(column=c("ma50","ma200"),relationship="lt"),
label="ma50.lt.ma200")
3
3
訂定交易規則
stratMACROSS <- add.rule(
strategy = stratMACROSS,
name='ruleSignal',
arguments = list(sigcol=“ma50.gt.ma200", sigval=TRUE, orderqty=100, ordertype='market',
orderside='long'),
type='enter')
stratMACROSS <- add.rule(
strategy = stratMACROSS,
name='ruleSignal',
arguments = list(sigcol="ma50.lt.ma200",sigval=TRUE, orderqty='all', ordertype='market',
orderside='long'),
type='exit')
3
4
開始回測
start_t<-Sys.time()
out<-applyStrategy(strategy=stratMACROSS , portfolios=portfolio.st)
[1] "2002-01-07 00:00:00 AAPL 100 @ 1.50565"
[1] "2003-05-16 00:00:00 AAPL 100 @ 1.23608"
[1] "2006-09-26 00:00:00 AAPL 100 @ 10.205548"
[1] "2008-05-19 00:00:00 AAPL 100 @ 24.143005"
[1] "2009-05-14 00:00:00 AAPL 100 @ 16.16766"
[1] "2013-09-11 00:00:00 AAPL 100 @ 63.238555"
end_t<-Sys.time()
print(end_t-start_t)
Time difference of 0.234004 secs
3
5
交易帳戶資料更新
start_t<-Sys.time()
updatePortf(Portfolio='macross',Dates=paste('::',as.Date(Sys.time()),sep=''))
[1] "macross“
end_t<-Sys.time()
print("更新交易帳")
[1] "更新交易帳“
print(end_t-start_t)
Time difference of 0.07900095 secs
3
6
回測結果報表
chart.Posn(Portfolio='macross',Symbol=stock.str)
add_SMA(n=50 , on=1,col='blue')
add_SMA(n=200, on=1)
3
7
回測結果報表
3
8
交易過程訊息
book = getOrderBook('macross')
stats = tradeStats('macross')
ptstats = perTradeStats('macross')
rets = PortfReturns('macross')
txns = getTxns('macross', stock.str)
getOrderbook:交易單所有記錄
tradeStats:所有交易統計資訊
perTradeState:每筆交易統計資訊
PortfReturns:投資報酬
getTxns : 交易明細帳
3
9
交易單資料總表
names(book)
[1] "macross“
names(book$macross)
[1] "AAPL”
names(book$macross$AAPL)
[1] "Order.Qty" "Order.Price" "Order.Type"
[4] "Order.Side" "Order.Threshold" "Order.Status"
[7] "Order.StatusTime" "Prefer" "Order.Set"
[10] "Txn.Fees" "Rule" "Time.In.Force"
textplot(book$macross$AAPL[, 1:5])
4
0
交易績效總覽
textplot(t(stats))
4
1
策略的累積報酬率
chart.CumReturns(rets, legend.loc =
"topleft", main="累積報酬率",
minor.ticks=FALSE)
4
2
R下單機設計說明與展示
下單機程式架構
4
4
Ticks清整模組 動態回測模組
C# 控制介面
預測模組
預測當天收盤點位 雲端資料庫
(交易明細報表)
回測歷史數據
儲存預測結果
儲存歷史數據
取得即時交易Tick
E-mail
即時軟體手機App
(元大API)
email 參考自: http://www.slideshare.net/newmanchurch/r-56476014
開發工具 toolchains 與步驟
• 開發工具下載與安裝
•  下載Visual Studio 2013 Express
•  下載 R.NET
• 設定券商API與憑證
4
5
API程式為何選擇 C# + R?
• 各有特長,也各有缺點
• R 缺乏有效率的Asynchronous Event-Driven機制
• R born to count
• C#先進的物件導向語言特性 與.Net緊密結合網路作業環境
• 券商必定提供之語言類型 : VBA/Java/C/C#
• C# 逐漸變成開放標準(open standard) 開放原始碼(Open Source)
• 爭取時效,縮短開發時間,減化程式複雜度
 系統介面與數學演算模型間互相妥協與專業分工
4
6
C# - 系統的語言
• C# 先進的物件導向語言特性
• 與.Net緊密結合網路作業環境
• 券商必定提供之語言類型 VBA Java C C#
• C# 逐漸變成開放標準(open standard) 開放原始碼(Open Source)
4
7
R 統計的語言
• R 完整的數學與財務分析套件
• 豐富且免費的參考學習資源
• 完全免費
4
8
Visual studio express 2013下載
https://www.microsoft.com/zh-tw/download/details.aspx?id=44914
4
9
執行Visual Studio 2013 Express
5
0
關鍵字R.NET搜尋 Nuget元件庫
左邊 線上 選擇netget.org,右上角 搜尋 框內 打入 “R.NET”
5
1
確認專案參考檔
如圖 安裝R.NET C#套件,結果應如右圖所示
參考套件裡,多了三個套件
RDotNet,
RDOtNet.NativeLibrary,
DynamicInterop
5
2
API檔下載 http://easywin.yuantafutures.com.tw/api/download.html
元大行情API,請選擇:
國內行情API元件及說明文件
國內行情API C# 範例
元大交易API,請選擇:
交易API元件及說明文件
交易API C# 範例
5
3
複製API相關檔案
分別把 交易API元件與行情API元件解開底下所有檔案
到特定目錄
5
4
註冊OCX元件
命令式窗下 切換到API 元件放置目錄
cd c:API
執行註冊 報價元件 與 下單元件
5
5
API測試
如果看到連線成功
商品代號為 TXFJ6, 也註冊成功
那恭喜! API就此連通了。
5
6
下單程式流程
登入帳號
註冊商品代碼
設定進出場條件
執行交易 終止交易
5
7
完整畫面
5
8
登入設定區 設定商品區 進出場條件區
即時報價
所有狀態訊息顯示
R 整合圖表
交易啟動與關閉
1. 登入設定區
5
9
要先設定好R 安裝目錄位置
帳號
密碼
2. 設定商品代碼
6
0
3.設定進出場條件
6
1
以時間進場
或選擇以價位進場
4.啟動關閉交易
6
2
開/關切換
模擬/實單切換
報價畫面
6
3
R tick點位分佈圖
6
4
6
4
C# tick價位資料傳送給R
R plot 點位分佈圖 貼在C#上
交易執行畫面
6
5
計量與程式交易面臨的風險
• 交易策略
• 市場風險
• 模型風險
• 交易執行
• 流動性風險
• 作業風險
6
6
程式常見的錯誤 - 內部
• 程式語法錯誤
• 邏輯錯誤
• 未預期的例外未處理
• 作業風險 -> 肥手指、邏輯炸彈、漏網之魚
6
7
解決辦法
• 耐心的除錯與練習
• 一個完整交易系統必經過程
• 嚴謹程式開發流程
• 先驗證 測試觀察 上線後監控
• Divide & conquer 二分法釐清問題
• 善用除錯工具
• 網路除錯
• 券商API 元大除錯工具 範例程式
6
8
程式常見的錯誤 – 外部
• 網路延遲斷線問題
• 券商伺服器本身穩定性問題
6
9
解決辦法
• 網路封包測速工具指令
• traceroute
• ping
• 多券商備援
• 觀察報價與下單回應時間差異
• 隨時預防部位避險
• 雙網路備援
• 不同ISP之寬頻連網
• 固定線路與4G
7
0
資料處理問題
• Garbage in, garbage out
• 不乾淨資料就導致從源頭就錯誤
• 即時資料防錯處理
• 回測資料清整與驗證
7
1
即時系統回報機制
• 狀態回報是能否自動交易的關鍵。
• 好的系統不在於多聰明,在於少犯錯
• 系統大小事都要存log, 做重點性回報
7
2
部位限制與管理
• 部位保證金限制
• 限制帳戶不放策略設定部位之最大資金之1.5倍
• 證券帳戶在自動交易上,要非常小心!
7
3
風險管理案例
• 騎士資本的教訓
• 曾經是美國股票交易市場最大造市與高頻交易商,一度佔NYSE
17.3%與NASDAQ 16.9% 的市場交易量
• 2012年8月,因內部流程疏忽,沒有經過嚴格測試的造市程式
直接上線進行交易
• 軟體臭蟲導致30分鐘內損失4.4億美金,兩天內自動交易接近
150檔不同的各式股票,隔日公司市值因此損失75%
• 2012年12月,同意競爭對手Getco, Virtu Financial收購
7
4
風險管理案例
• LTCM的教訓
• 匯集所有世界級數學與金融財務的
精英團隊
• 固定收益債券套利交易
• 作空S&P長期波動率
• 併購套利
7
5
低利差高槓桿,累積缺乏流動性商品,導致在金融風暴下虧損一發不可收拾
閃崩(Flash Crash) 案例
2014年10月15日 歐洲股市9:33到9:45 之間,
因為泛歐斯托克銀行指數(EURO STOXX® Banks)
期貨喪失流動性,導致價格急速攀升
(連帶導致利率短期利率驟貶)
五分鐘後,又急速回升到9:33時的價位水準
瞬時湧入的交易量,超過2008雷曼風暴
2011美債降等所引發的崩盤
Q & A
附註: R 相關工具安裝說明
• R 主程式軟體
• Rtools34
• RStudio
R 安裝 台灣 R Project 映射網站
http://cran.csie.ntu.edu.tw/
下載 R 3.3.1
base下載 主安裝檔
下載Rtools 3.4
安裝R 與Rtools
R 主程式安裝
記得32bit 與 64bit都要安裝!
R 主程式安裝
其他都用預設設定
程式集裡,確認安裝完成
執行 R 64bit
看到主控台畫面,那就完成了!
Rtools 安裝
Rtools 安裝
其餘保持預設值
開發工具介紹
• 安裝
• 基本功能介紹
安裝RStudio
https://www.rstudio.com/products/RStudio/
選擇Windows Vista/7/8/10
安裝RStudio
9
0
選擇Windows Vista/7/8/10
安裝RStudio
9
1
確定安裝完成
9
2
執行安裝後,可看到程式集上多了RStudio程式
大功告成!
Studio 整合開發環境(IDE)
9
3
工作區域
主控台區
繪圖區域

More Related Content

PDF
吳牧恩/一個賭徒的告白 2:交易策略建構與分析,為何你該賭小一點?
PDF
[系列活動] 使用 R 語言建立自己的演算法交易事業
PDF
藍色投機客 計量化交易策略的開發
PDF
一個賭徒的告白:從預測市場看金融交易
PPTX
動態評價函數與機器學習分享會簡報
PDF
[系列活動] 手把手教你R語言資料分析實務
PDF
財務自由的人生 FIRE
PDF
初學R語言的60分鐘
吳牧恩/一個賭徒的告白 2:交易策略建構與分析,為何你該賭小一點?
[系列活動] 使用 R 語言建立自己的演算法交易事業
藍色投機客 計量化交易策略的開發
一個賭徒的告白:從預測市場看金融交易
動態評價函數與機器學習分享會簡報
[系列活動] 手把手教你R語言資料分析實務
財務自由的人生 FIRE
初學R語言的60分鐘

What's hot (20)

PPTX
程式交易新視野-衍生交易策略的途徑
PDF
如何讓Multicharts更強大
PPT
計量化交易策略的開發與運用 法人版
PDF
暗認本読書会9
PDF
ペアリングベースの効率的なレベル2準同型暗号(SCIS2018)
PPTX
zk-SNARKsの仕組みについて
PDF
ブロックチェーン系プロジェクトで着目される暗号技術
PPTX
EMアルゴリズム
PPTX
大富豪に対する機械学習の適用 + α
PPTX
リスクベースポートフォリオの高次モーメントへの拡張
PDF
集約署名
PDF
CODE FESTIVAL 2015 解説
PPT
技術勉強会(楕円曲線暗号)資料
PDF
プログラミングコンテストでの乱択アルゴリズム
PDF
安全性を証明するために知っておくべき4つのこと
PDF
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
PPTX
ようやく分かった!最尤推定とベイズ推定
PDF
金融時系列解析入門 AAMAS2021 著者発表会
PDF
パーソナル履歴データに対する匿名化と再識別:SCIS2017
PDF
Square869120 contest #2
程式交易新視野-衍生交易策略的途徑
如何讓Multicharts更強大
計量化交易策略的開發與運用 法人版
暗認本読書会9
ペアリングベースの効率的なレベル2準同型暗号(SCIS2018)
zk-SNARKsの仕組みについて
ブロックチェーン系プロジェクトで着目される暗号技術
EMアルゴリズム
大富豪に対する機械学習の適用 + α
リスクベースポートフォリオの高次モーメントへの拡張
集約署名
CODE FESTIVAL 2015 解説
技術勉強会(楕円曲線暗号)資料
プログラミングコンテストでの乱択アルゴリズム
安全性を証明するために知っておくべき4つのこと
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
ようやく分かった!最尤推定とベイズ推定
金融時系列解析入門 AAMAS2021 著者発表会
パーソナル履歴データに対する匿名化と再識別:SCIS2017
Square869120 contest #2
Ad

Similar to [DSC 2016] 系列活動:吳牧恩、林佳緯 / 用 R 輕鬆做交易策略分析及自動下單 (9)

PPTX
程式交易優缺點
PPT
計量化交易策略的開發與運用
PPTX
【程式交易】均線交叉的交易策略優化大立光的實證|實作練習|碩士班|Python應用
PPTX
智能交易 輕鬆上手
PPTX
智能交易輕鬆上手
PPT
Plan your trade,trade your plan
DOC
傲大決招
PPT
My auto trade protfolio project Version 1
PDF
策略開發與組合關鍵的SOP-芬特克團隊
程式交易優缺點
計量化交易策略的開發與運用
【程式交易】均線交叉的交易策略優化大立光的實證|實作練習|碩士班|Python應用
智能交易 輕鬆上手
智能交易輕鬆上手
Plan your trade,trade your plan
傲大決招
My auto trade protfolio project Version 1
策略開發與組合關鍵的SOP-芬特克團隊
Ad

More from 台灣資料科學年會 (20)

PDF
[台灣人工智慧學校] 人工智慧技術發展與應用
PDF
[台灣人工智慧學校] 執行長報告
PDF
[台灣人工智慧學校] 工業 4.0 與智慧製造的發展趨勢與挑戰
PDF
[台灣人工智慧學校] 開創台灣產業智慧轉型的新契機
PDF
[台灣人工智慧學校] 開創台灣產業智慧轉型的新契機
PDF
[台灣人工智慧學校] 台北總校第三期結業典禮 - 執行長談話
PDF
[TOxAIA台中分校] AI 引爆新工業革命,智慧機械首都台中轉型論壇
PDF
[TOxAIA台中分校] 2019 台灣數位轉型 與產業升級趨勢觀察
PDF
[TOxAIA台中分校] 智慧製造成真! 產線導入AI的致勝關鍵
PDF
[台灣人工智慧學校] 從經濟學看人工智慧產業應用
PDF
[台灣人工智慧學校] 台中分校第二期開學典禮 - 執行長報告
PDF
台灣人工智慧學校成果發表會
PDF
[台中分校] 第一期結業典禮 - 執行長談話
PDF
[TOxAIA新竹分校] 工業4.0潛力新應用! 多模式對話機器人
PDF
[TOxAIA新竹分校] AI整合是重點! 竹科的關鍵轉型思維
PDF
[TOxAIA新竹分校] 2019 台灣數位轉型與產業升級趨勢觀察
PDF
[TOxAIA新竹分校] 深度學習與Kaggle實戰
PDF
[台灣人工智慧學校] Bridging AI to Precision Agriculture through IoT
PDF
[2018 台灣人工智慧學校校友年會] 產業經驗分享: 如何用最少的訓練樣本,得到最好的深度學習影像分析結果,減少一半人力,提升一倍品質 / 李明達
PDF
[2018 台灣人工智慧學校校友年會] 啟動物聯網新關鍵 - 未來由你「喚」醒 / 沈品勳
[台灣人工智慧學校] 人工智慧技術發展與應用
[台灣人工智慧學校] 執行長報告
[台灣人工智慧學校] 工業 4.0 與智慧製造的發展趨勢與挑戰
[台灣人工智慧學校] 開創台灣產業智慧轉型的新契機
[台灣人工智慧學校] 開創台灣產業智慧轉型的新契機
[台灣人工智慧學校] 台北總校第三期結業典禮 - 執行長談話
[TOxAIA台中分校] AI 引爆新工業革命,智慧機械首都台中轉型論壇
[TOxAIA台中分校] 2019 台灣數位轉型 與產業升級趨勢觀察
[TOxAIA台中分校] 智慧製造成真! 產線導入AI的致勝關鍵
[台灣人工智慧學校] 從經濟學看人工智慧產業應用
[台灣人工智慧學校] 台中分校第二期開學典禮 - 執行長報告
台灣人工智慧學校成果發表會
[台中分校] 第一期結業典禮 - 執行長談話
[TOxAIA新竹分校] 工業4.0潛力新應用! 多模式對話機器人
[TOxAIA新竹分校] AI整合是重點! 竹科的關鍵轉型思維
[TOxAIA新竹分校] 2019 台灣數位轉型與產業升級趨勢觀察
[TOxAIA新竹分校] 深度學習與Kaggle實戰
[台灣人工智慧學校] Bridging AI to Precision Agriculture through IoT
[2018 台灣人工智慧學校校友年會] 產業經驗分享: 如何用最少的訓練樣本,得到最好的深度學習影像分析結果,減少一半人力,提升一倍品質 / 李明達
[2018 台灣人工智慧學校校友年會] 啟動物聯網新關鍵 - 未來由你「喚」醒 / 沈品勳

[DSC 2016] 系列活動:吳牧恩、林佳緯 / 用 R 輕鬆做交易策略分析及自動下單