backtest

Tag: backtest

【如何用Trading View寫每天只交易一次的策略】

Trendy
程式交易 www.quants.hk (導師: 財經書藉作家: 麥振威) ・2024-06-17

最記得以前有學員曾說過,他過去試過很多的交易策略,最後在實戰時的成績都不太好,然後「嬲嬲地」就每天只看到MACD的第一個訊號便入市,開市後見MACD的快線升穿慢線便買入,相反,若MACD的快線跌穿慢線便造淡,然後見MACD的快線繼續上升便平好倉,造淡時則見MACD的快線繼續下跌就平淡倉,就是這樣簡單! 但效果反而比很多複雜的策略更好。 這個只是他的意見,最後成績如何他沒有告訴我,但筆者自己研究過很多的Daytrade策略也都是每天只交易一次的,因為交易次數太多,交易成本就會增加,而且長時間交易會覺得更亂,特別是遇上連續虧損的時候,而每天只交易一次就是讓自己有足夠時間冷靜下來。 不過,若要用pine script寫這類每天只交易一次的策略,又應怎樣寫? 以下是一個很簡單運用Zero Lag MACD的交易策略,就是快線升穿慢線便買入,當買入後看到連續三支陰陽燭的時間內MACD的快線都在上升,那就平倉離場。 // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © markchunwaipaul //@version=5 strategy("zero lag MACD交易例子", margin_long=100, margin_short=100, initial_capital =1000,default_qty_type = strategy.percent_of_equity,default_qty_value = 100) SN=input(12) LP=input(26) M=input(9) ema1=ta.ema(close,SN) ema2=ta.ema(ema1,SN) ema3=ta.ema(close,LP) ema4=ta.ema(ema3,LP) ZerolagMACDLine=(2*ema1-ema2)-(2*ema3-ema4) ema5=ta.ema(ZerolagMACDLine,M) ema6=ta.ema(ema5,M) ZerolagSignalLine=2*ema5-ema6 Histogram=ZerolagMACDLine-ZerolagSignalLine var bool traded =false closeCond=ta.rising(ZerolagMACDLine,3) noposition=strategy.position_size==0 buyCond=ta.crossover(ZerolagMACDLine,ZerolagSignalLine) if buyCond and noposition strategy.entry("BUY",strategy.long) if closeCond and not noposition strategy.close("BUY") plot(ZerolagMACDLine,title="MACDLine",color=color.yellow ,linewidth=2) plot(ZerolagSignalLine,title="SignalLine",color=color.green,linewidth=2) plot(Histogram, color=color.black, style=plot.style_histogram,linewidth=2) 以上策略的Backtest report: 可以看到這樣寫每天的交易次數肯定不只一次,交易了1023次,獲利交易只有514次,勝率約50.24%,一年的虧損約37.45%。 另以下是同一個策略但每日只交易一次的寫法: // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © markchunwaipaul //@version=5 strategy("用zero lag MACD每日只交易一次例子", margin_long=100, margin_short=100, initial_capital =1000,default_qty_type = strategy.percent_of_equity,default_qty_value = 100) SN=input(12) LP=input(26) M=input(9) ema1=ta.ema(close,SN) ema2=ta.ema(ema1,SN) ema3=ta.ema(close,LP) ema4=ta.ema(ema3,LP) ZerolagMACDLine=(2*ema1-ema2)-(2*ema3-ema4) ema5=ta.ema(ZerolagMACDLine,M) ema6=ta.ema(ema5,M) ZerolagSignalLine=2*ema5-ema6 Histogram=ZerolagMACDLine-ZerolagSignalLine var bool traded =false closeCond=ta.rising(ZerolagMACDLine,3) noposition=strategy.position_size==0 buyCond=ta.crossover(ZerolagMACDLine,ZerolagSignalLine) if buyCond and not traded and noposition strategy.entry("BUY",strategy.long) traded:=true if closeCond and not noposition strategy.close("BUY") if ta.change(time("D"))!=0 traded:=false plot(ZerolagMACDLine,title="MACDLine",color=color.yellow ,linewidth=2) plot(ZerolagSignalLine,title="SignalLine",color=color.green,linewidth=2) plot(Histogram, color=color.black, style=plot.style_histogram,linewidth=2) 留意克體的部份就是加上後令策略變成「每天只交易一次」。 先設定traded為false,然後當買入後便設定為true,由於入市條件加上了not traded,代表要traded 必需為false時才會入市,這樣交易一次後就不會再交易,最後加上ta.change(time("D"))!=0,代表要轉為第二個交易日,traded才會再轉變為false,然後第二日當ZerolagMACD的快線升穿慢線時就會符合入市條件。 策略的backtest report: 同一樣的交易策略,只是將其改變為「每天只交易一次」,可以看到結果也是虧損,不過,虧損幅度卻由37.45%大幅下降至10.75%。另外要留意,筆者寫這兩個策略是沒有計算「佣金」及「滑價」的,而第一個策略在一年裏交易了1023次,但加上「每天只交易一次」這個條件後,一年裏只交易了258次,交易成本會相差很遠,不過勝率就未見有大幅改善,獲利的次數只有132次,勝率只輕微由50.24%提高至51.16%。 交易策略當然不可能這樣簡單,但只要將以上兩個策略作比較便可看到,每天只交易一次的Daytrade策略確實能提高成效。 網頁: www.quants.hk Youtube: https://www.youtube.com/@markchunwai Facebook專頁: https://www.facebook.com/quantshk/ Patreon: https://www.patreon.com/quantshk

【如何用Trading View寫運用多重timeframe的策略】

Trendy
程式交易 www.quants.hk (導師: 財經書藉作家: 麥振威) ・2024-06-14

Pinescript的功能其實十分之多,可以寫到不同的指標之餘,甚至可以將一些統計學的概念應用在交易策略之上。 例如我們在facebook介紹的Predicted_price MACD是將Linear Regression 的計算融入MACD中,相信大家現在應不難明白。 https://www.facebook.com/quantshk/posts/pfbid036K93ZaK4LnbZPxrekZUMKSpWcFcbjBLhE122G6h8H3qcUTzoVJ7yX2U1nffCPV1Tl 影片中有兩個例子,分別是看SQQQ及Apple的5分鐘圖,你會發現指標的入市訊號比傳統的MACD更準確,甚至你會看到MACD根本就是顯示市況向好,但Predicted_price MACD卻顯示造淡訊號。事實上,Linear Regression確實很有用,只要與價格有線性關係的數據都可以作分析,會對股價的變化有預測作用。除了Predicted_price MACD,其他我們研發的與Linear Regression相關的交易策略都會陸續介紹給大家。 這篇文章的的題目是如何用Trading View寫運用多種timeframe的策略,這也是最多人會問的問題之一,因為很多人都會喜歡多種時間間隔的策略,例如同時運用5分鐘圖及1分鐘圖表,又或同時用小時圖與5分圖表等。 要寫這樣策略就要用上request.security這個function,用法例如子如下: [macdLine,signalLine,_]=ta.macd(close,12,26,9) signal5min=request.security(syminfo.tickerid,"5",signalLine) macdhourly=request.security(syminfo.tickerid,"60",macdLine) request.security的( ) 內要寫上的有三個部份,包括「要取那一個symbol的資料」、「要什麼時間間隔」、「要取那一個數據」。 「要取那一個symbol的資料」的部份若填上syminfo.tickerid就是要取目前你在Trading View畫面上顯示的數據,例如你圖表上是在看Apple(US:AAPL),若填上syminfo.tickerid就會最Apple(US:AAPL)的數據。 但大家可能會覺得奇怪,為什麼要多填一次,本身不就是想要Apple不同時間間隔的數據嗎? 因為request.security除了可以拿取不同時間間隔圖表的數據外,也可以拿取不同symbol的數據,例如你想看蔚來(US:NIO)的走勢來炒Tesla(US:TSLA),你在這個部份便不能再寫上syminfo.tickerid,你要在主圖上開啟Tesla的圖表,然後在request.security的( )填上蔚來的symbol,那就可以寫到看蔚來的數據炒Tesla的策略。 而「要什麼時間間隔」就很簡單是要取什麼時間間隔的數據,若只寫數字就是代表多少分鐘,例如"5"就代表5分鐘,"60"就代表60分鐘,"D"則代表日線圖的數據,"W"則代表周線圖的數據。 例如你本身的策略是運用1分鐘圖表的,就在主圖表上開啟1分鐘圖,然後加上這句: dailyhigh=request.security(syminfo.tickerid,"D",high[1]) 就可以拿到上一個交易日裏日線圖的最高價,dailyhigh是自已給的名稱,方便大家在計算時再使用。例如你再寫dailyhigh> dailyhigh[1]就代表你的策略中要求上一個交易日的最高價比再上一日的最高價更高。 留意,本身daiyhigh這個數據要自行設定是要取「上一個交易日」的最高價,若在這個名稱再加上[1],便是由上一個交易日開始再倒數一個交易日。 最後是request.security的( ) 內「要取那一個數據」的部份,這部份不一定只能使用最高價、最低價、開市價、收市價等的數據的,也可以是不同指標的數據,甚至是你自行經過計算的答案。 假設你在主圖表上開啟一個1分鐘圖表,你的策略也包括了MACD的運用,先用[macdLine,signalLine,_]=ta.macd(close,12,26,9) 定義了MACD的快線及慢線為macdLine及signalLine。 signal5min=request.security(syminfo.tickerid,"5",signalLine) macdhourly=request.security(syminfo.tickerid,"60",macdLine) 然後我們把5分鐘MACD慢線的數據及小時圖MACD快線的數據命名為signal5min及macdhourly,然後用上request.security,在( )內分別填上signalLine及macdLine便可以。 再加上plot便可以把5分鐘MACD慢線的數據畫出來,然後加一個1分的MACD便能將兩者作比較。 25 另外,筆者發現很多新手都比較抗拒使用plot這個功能,大家都會只集中去留意backtest的結果,而且有了backtest的結果後圖表上根本便有入市訊號的位置,那大家自然會想,若不是要寫一個自己的技術指標,那plot這個功能實沒多大用處。 但筆者的習慣是,每次寫自己的交易策略時,每寫一部份都會先用plot來看看寫出來的是否真的是自己想要的,因為用程式語言去寫交易策略,與大家用目測是完全不同的,很多時候用程式寫出來的未必就是你想要的。你的交易策略可以很複雜,到你寫好後再做backtest,才發現根本不是你想要的,那再重寫就反而會更麻煩。 我們網頁: www.quants.hk Youtube: https://www.youtube.com/@markchunwai Facebook專頁: https://www.facebook.com/quantshk/ Patreon: https://www.patreon.com/quantshk

【如何用Trading View 運用不同技術指標寫交易策略】

Trendy
程式交易 www.quants.hk (導師: 財經書藉作家: 麥振威) ・2024-06-13

教授pine script 時最多新手問的就是一些主要的技術指標如何去寫,當你最初練習pine script時就先用一些常用的技術指標來試試寫策略,到熟習後,即使一些未見過的技術指標,只要你在google找到指標的公式,也能自行寫出來。 例如,MACD是內置的指標,第一步是記得trading view的內置指標是要加上「ta.」的,寫法如下: [macdLine,signalLine,_]=ta.macd(close,12,26,9) 再要把MACD的快線在圖表上顯示,就用plot這個功能,寫法如下: plot(macdLine,title="MACDLINE",color=color.red,linewidth=1) 不過,有些指標可能並非內置的,又或即使是內置,但你習慣了自行寫出來,假設大家不懂得什麼是bollinger’s band,然後在網上找到它的公式就是通道的頂部是20日平均線加上兩個標準差,而底部是20日平均線減去兩個準差,那我們就可以自己寫出來。 例如平均線是SMA,要寫出來就要加上「ta.」,先想一個名稱給你每個要計算的答案,什麼名稱都可以,但名稱不可以用數字開頭。例如你想叫平均線的名稱做SMA20,就用以下的寫法: sma20=ta.sma(close,20) 然後又給標準差一個名稱,假設你叫它為ST,那寫法如下: st=ta.stdev(close,20) 然後再分別給多通道的頂部及底部名稱,假設叫做upper及lower upper = sma20+ 2*st lower = sma20 – 2*st 寫法就是這樣簡單,然後upper及lower就可以用作其他計算的部份,例如你的入市策略是最高價升穿bollinger’s band 達5%,那寫法如下: 先給你的入市條件一個名稱,假設名為buyCondition,也給upper高5%的情況一個名稱,假設是upperhigh uppperhigh=upper*1.05 buyCondition=ta.crossover(high,upperhigh) 此外,其他我們常見的技術指標如RSI, ATR等也是內置的,寫法同樣是先給它們一個名稱,例如你想叫它們做rs及atrValue,寫法如下: rs=ta.rsi(close,14) atrValue=atr(14) 其他有些主要常用的技術指標也要自行計算的,如Stochastic,寫法如下: //@version=5 indicator("stochastic") stcLength=input(14) periodK=input(3) periodD=input(3) fastSTC=ta.stoch(close,high,low,stcLength) slowK=ta.sma(fastSTC,periodK) slowD=ta.sma(slowK,periodD) plot(slowK,title="slowK",color=color.red,linewidth=1) plot(slowD,title="slowD",color=color.blue,linewidth=1) 我們再試試寫Rate of change這個指標,先在網上找到它的公式如下: 然後大家可自行先用Trading View 先試試寫出來才看答案,若沒有寫錯,那寫指標這部份的學習便沒有問題了。 Rate of change寫法答案: length = input.int(9) source = input(close) roc_smooth = input(5) roc = ta.sma((100 * (source - source[length])/source[length]),roc_smooth) 最後我們看看super Trend這個指標的寫法,有些時候我們希望指標的參數是可以寫好後直接在圖表上更改的,又或有幾個指標的參數也是一樣的,我們會重覆使用,那就先給參數一個名稱,例如叫做length,可以參考以下superTrend這個指標的寫法: //@version=5 indicator("SuperTrend", overlay=true) length = (10) multiplier = (3) atr = ta.atr(1) basis = ta.highest(high, length) + ta.lowest(low, length) basis := basis / 2 upperBand = basis + (multiplier * atr) lowerBand = basis - (multiplier * atr) trendUp = close > upperBand[1] ? true : close[1] > upperBand[1] ? true : false trendDown = close < lowerBand[1] ? true : close[1] < lowerBand[1] ? true : false plot(trendUp ? upperBand : lowerBand, color=color.blue, linewidth=2, title="SuperTrend") 這裏用了「? :」這種寫法,?前是條件,?後是若符合條件要怎樣,而:後則是若不符合條件要怎樣,若大家看其他Tradind View用家寫的策略,這是十分常見的寫法。 trendDown = close < lowerBand[1] ? true : close[1] < lowerBand[1] ? true : false 這個的意思就是trendDown是名稱,然後看看收市價是否小於上一支陰陽燭的supertrend的底部,若符合條件就是true,否則就再看看上一支陰陽燭的收市價是否低於上一支陰陽燭的supertrend的底部,若符合條件,也是true,但兩個條件也不符合就是false。 我們網頁: www.quants.hk Youtube: https://www.youtube.com/@markchunwai Facebook專頁: https://www.facebook.com/quantshk/ Patreon: https://www.patreon.com/quantshk

【Trading View 基本使用教學】

Trendy
程式交易 www.quants.hk (導師: 財經書藉作家: 麥振威) ・2024-06-11

2014年我們便開始開辦程式交易課程,當時主要教授的是Amibroker,其後再增加有關Multichart的教學。近年始越來越多學員喜歡用Trading View,故此我們的教學內容也逐漸以Trading View的教學替代Amibroker,而且在Patreon也會定期提供一些Trading View的pine script(version 5)教學,希望會對大家有幫助。 學習pine scrip最好的方法就是參考別人已寫出來的例子,筆者會嘗試先用一些簡單的策略,每句語法給大家講解,多看這些例子後就會很容易上手。 首先,若有用Trading View的會員應該也知道,付了年費使用Trading View後,它所提供的是延時數據,所以只能用作backtest,若要用Trading View做autotrade,則需要申請實持數據,目前若要申請美股包括槓桿ETF如SQQQ及TQQQ等的實時數據大約是每月9.95美元,約77.6港元,其實算是十分便宜。但請留意這不包括標普、納指期貨的,若是想autotrade 美期,則需要額外申請,大約是5美元一個月,約39港元。 不過,筆者提提大家,若已付了Trading View的年費也先不用急著申請實時數據,因為若你本身已有申請interactive Broker的數據的話,其實可導入Trading View使用的。在下期課程也會教大家如何將Trading View連接interactive broker做autotrade(舊學員同時是Patreon會員也可免費重讀這部份的)。 故此,要做autotrade除了可選富途,interactive broker也可以。當然,若你想炒幣,選擇會更多,但筆者沒有教這方面的內容。 若果你完全是新手,也可先下載Trading View,會有一個月免費使用,先講解一下圖表的選擇,在「indicator」中可選不同的技術指標,一些較冷門的技術指標也有提供,如筆者已教過的Fisher Transform、可用以判斷即市中好、淡雙方力量的Vortex Indicator (VI)及判斷即市轉勢位的william fractal 等等也有提供。 圖表的選擇也有很多,如Heikin Ashi、Renko、kagi、Point&figure Chart等,當中Point&figure Chart就是OX圖,筆者覺得觀察OX圖的Intraday 圖表會對短炒有一定幫助 這些選擇圖表及指標的功能應不太困難,任何新手下載Trading View後也可自行嘗試。而Trading View最重要的是「Pine Editor」,就是可以在這裏寫交易策略做back test及autotrade,Trading View用的語法名為pine script,當寫好後可直接按「Strategy Tester」便會有backtest結果。 Trading View的backtest report其實內容十分清晰,在「overview」的部份便可看到資金變化,越平穩向上便越好,代表交易策略賺錢十分穩定。而在圖表上部份也顯示了虧損的情況,虧損不能完全沒出現的,但這部份顯示的形態越「平」越好,代表不會突然出現很大的虧損,若上落很大也代表交易策略在真實執行時會很困難。 另外,在「Performance Summary」則會顯示詳細的back test report,這部份很多完全新手常問筆者,「Total Closed Trade」是什麼,這其實代表你的交易策略在某段時間裏的「總交易次數」,report 也有顯示sharp ratio、profit factor等常見的數據。而「list of Trades」則會顯示每宗交易的詳細資料,基本上Multicharts及Amibroker等有提供的數據,Trading View也有提供,但Trading View不用再自行輸入數據,所以較為方便。 至於「Trading Panel」則是用作連接autotrade及導入外部數據用的,這個會逐步再教大家。 不過,要在Trading View寫策略就必需學習Pine Script,這套語法其實並不困難,但大家要留意,目前大家在Youtube或其他網頁看到的教學,絕大部份都是教 Version 4的版本,但Pine Script其實已更新至version 5,更改也頗多,例如要寫10日平均線在Vesrsion 4可以寫成 sma10=sma(close,10),但在version 5則要加上ta.,要寫成sma10=ta.sma(close,10)。 所以若大家用ChatGPT來幫自己寫Trading View的策略時會發現,ChatGPT的答案大部份都錯的,因為ChatGPT的數據是舊的,它給你的答案也是用version 4寫的。 不過,筆者知道有些學員其實已學過version 4 Pine Script的,又或大家可能在網上看到一些用version 4寫的sample,又很想直接使用,其實也有更方便的做法。在Pine Editor寫策略時先加上 //@version=4,然後按右上角的「...」便會見到「Convert code to v5....」,Trading View可協助將version 4的策略直接改為version 5的。 我們網頁: www.quants.hk Youtube: https://www.youtube.com/@markchunwai Facebook專頁: https://www.facebook.com/quantshk/ Patreon: https://www.patreon.com/quantshk