2017年11月16日 星期四

新高新低比率 (一)

上星期分享了選出創新高股票的方法。週末時,我在想如果利用每天創新高創新低的股票比例,是否可以幫助判斷大市趨勢的改變呢?但要做這個分析,首先要有每天創新高創新低的股票比例的數據。

問題是,這個每天「新高股票數量」的數據要怎樣得到,和紀錄下來呢?

要得到某天的數據的話,可以用exploration,但總不能一天一天人手紀錄下來這麼笨吧!最後,我終於找到解決之法,就是運用AddToComposite這個Function。

AddToComposite可以幫我們把數列存到一個新的Ticker中。到底是什麼一回事?我直接用例子說明。

比如我們想紀錄「22天新高股票數量」這個數列:

1.首先,我們設定這個公式條件,像前文講過的:
 High > Ref(HHV(High, 22), -1)

為了方便易看,我們用一個Variable代替這條件:
New_High_ Amount = High > Ref(HHV(High, 22), -1);

2. 然後,用AddToComposit,其語法是這樣的,詳細可參考Amibroker內的Help Content:
AddToComposite(array, "ticker", "field")

AddToComposite( New_High_ Amount, "~NewHighAmount", "X");

我講解一下,array就是把選股條件放進去,"ticker"就是輸入ticker的名稱,"field"可填"O","C","H","L","V"或"X",意思是指定把數列放進ticker中的OCHLV哪一個欄裡,如果填"X"就是放到所有欄中的意思。

3. 最後,由於要Scan才能run到這段code,所以我們要加上一段 Buy = 0; 的Code。Formula的部份就完了。


4. 那我們就可以Scan了。(當然要選好Scan的範圍,這裡就不重複了)



5. Scan完後,我們可以看到,在Market 253中,會多了~NewHighAmount。而且,在圖中,會看到一堆點,這個就是每天「22天新高股票數量」。



現在,我們終於有了「22天新高股票數量」這個數據,但又來了兩個問題:

1. 怎樣把它放到跟指數一起看,方便分析?
2. 現在是一個absolute的數量,每周都有新股上市,股票數量不斷增加,如果分析的時間跨度長的話,「22天新高股票數量」一定會愈來愈大,就很難拿以前的數字作參考。因此,必須把它化為relative的比率,這又要怎樣做呢?

續。



2017年11月14日 星期二

指標 Indicator

我們常會在股價圖中,或圖的下方,加上形形式式的技術指標,去幫助我們分析。

在Amibroker中,使用指標,或編寫自己的指標都很方便。

比如說,Amibroker本身已內置了大量常用的技術指標,在"Charts" windows 中可以見到。



大部份內置的指標都在"Indicator"的Folder內可以找到,比如RSI、MACD、ADX等等。

只要Double Click你想要的指標,它就會被放到新的Pane上。設定參數,再按OK就完成。



假如想要把指標放到已存在的Pane上,比如說把移動平均線放到跟股價圖一起。只要把指標拖到圖上即可。



再來就是編寫指標。這裡我們需要用到一個重要的Function: Plot。

故名思義就是把指標畫到圖上。

Plot有4個必要的參數:
Array數列:就是畫到圖上的數值,或計出數值的公式
Name:給它一個名
Color:顏色
Style:是線形圖、還是柱形圖等等

比如
Plot(1, "Testing", ColorYellow, StyleLine);



就畫出一條數值是 1 的橫線。

又比如:
Plot(ROC(C,250), "Testing", ColorAqua, StyleLine);



就畫出過去250天回報的線了。


2017年11月13日 星期一

Amiquote 加速下載

現在每天都用Amiquote下載港股數據。但有一個問題,就是要下載很久。

由於港股有接近1800只股票,Amiquote下載的速度大概是一秒一隻,換算下來,每天差不多要30分鐘。

而且港股上日的數據,一般要到第二天早上(具體時間不清楚),yahoo才會更新。如果我要每天早早起來,下載數據。感覺上成件事很笨,很沒有效率。明明是在用電腦,怎麼事情都沒有自動化呢?

因此,我上網找了一下到底有沒有方法可以加快下載速度。原來解決方法十分簡單。在Amiquote的setting里就可以辦到。




在nunber of simultaneous downloads 上,原本預設的數值是1,即是每次同時下載一隻股票的數據。

只要把這個數字改成10,就可以有十倍的速度了。







































希望可以幫到遇到同樣問題的用家。

2017年11月10日 星期五

選出每日新高的股票

由於我大部份時間都是選強勢股,做順勢交易,所以很重要的是要知道當前哪些股份是強勢股。

其中一個我常用的方法是看創新高股票的名單,這個名單在不少財經網站都會有。但既然有了Amibroker,那我就可以DIY自己的創新高股票名單了。不但可以自訂參數,或加上額外的條件,而且以後相同的程式碼亦可拿去放進策略裡測試。

在Amibroker裡,有一個很有用的Function:HHV(Highest High Value)。

語法是這樣的:HHV(X, n)

- X是O,C,H,L,V
- n 是時間參數

比如,10日內的最高價就是 HHV(High, 10)。

那選出創10日新高的股票就很簡單是 High > HHV(High, 10)。

可是,卻沒選出一隻股票出來。



這沒有可能,又不是大跌市,而且只是10天新高,又不是1000天,按理應該有很多隻,所以是哪裡有問題呢?。檢查了時間和選股範圍都沒有問題,那就應該是程式碼出問題。

對了,原來這10天內的最高是把今天的最高都算進去的,所以即使今天創了新高,今天的高位亦只能等於10天內的最高,自然是選不出任何股票了。

哪怎麼辦呢?

怎樣能寫出過去10天(不計今天)的最高呢?

原來要用到Ref這個Function。

這個Function正正是用來把數列移動的。

比如說,Close 就是收市價。那前一天的收市價就是 Ref(Close, -1)

既然,10日的最高價是 HHV(High, 10)。
那前一天的10日最高就是 Ref(HHV(High, 10), -1) 了。

我們再試一次:



有84隻股票選了出來呢!終於成功了!

但84隻太多了,我也不想看這麼多,把參數改一改,改成100:



只剩下33隻了。

好,我先看看這些股票,明天再說。









2017年11月9日 星期四

Backtect Report 回測報告

今天我們繼續看看在回測報告上可以看到甚麼有用的數據。

除了昨天我們看到的總回報、贏輸次數、平均每次交易回報等等統計外,我們還可以在圖表上看到策略的表現。

第一個圖是組合的資金曲線,我們看到原來這策略在2007年時曾升到25,000以上(本金10,000),但之後無以為繼,表現平平。

第二個圖是Maximum Drawdown,即最大回撤。它告訴我們組合從高位至低位最多回落了多少。這個策略從高位最多回落了60%以上,在風險管理上,絕對是不合格。









































然後,第三個圖是策略在每年及每月的回報統計,可以幫助我們分析策略會不會在甚麼月份做得較好,或哪個年份做得較差,或是有沒有以前做得好,但最近變差了的情況。一般來說,大家都希望一個策略的回報能平均分佈就最好了,表示回報在不同市況都能穩定。







































這裡我們看到除了2008年大跌之外,2012 - 2014年連續三年都是負數。到底是什麼原因呢?找出原因就可以幫助我們優化策略,或最起碼對策略在甚麼市況會做得不好有個心理準備。由於2012 - 2014都是上落市,對於跟勢交易比較不利,容易左一巴右一巴。

第四個圖是每單交易回報的分佈圖,也就是可以一眼看到上次說過的,趨勢策略的回報,是由很多次「小敗」,和少量的「大勝」組成。

之後Trade這裡就是每單交易的明細,沒什麼特別。







































Formula也就是這個策略的程式碼。感覺這些都是Reference,就是告訴你前面報告中的回報表現是怎麼做出來的。



Settings:這裡我們看到有很多設定可以調教,比如說佣金,這裡我們忽略了不計,但它對真實交易回報的影響其實很大,算上佣金的話,相信這個策略的表現會很不理想。

另外,也可以設定買入、和賣出的價錢,現在策略是用收市價交易,也是合理的。但假如是一些較短線的策略,則變得不合理了。



Symbols:就是在哪個(哪些)產品上交易。這次我們只在HSI上測試。



最後是Monte Carlo分析,這裡是比較複雜的概念,還是留待以後再討論吧。






































總結一下,Amibroker 的 backtest 可以很方便地讓我們知道一個策略的績效是怎樣,以及它的盈虧分佈等等的風險特性。我們常常會想到一些交易策略,但到底實際上是否行得通?贏錢還是輸錢?是靠很多次小勝來獲得回報?還是靠一兩次的大勝?做Backtest,跟科學課做實驗十分相似。

2017年11月7日 星期二

Backtest 回溯測試

今天要來試試Backtest的功能怎麼用,而且也來順便測試一下一些傳統的策略到底有沒有用吧!

我們依舊使用上次的策略,收市價升穿250天線時買入,跌穿250天線時賣出。這是簡單的跟隨趨勢策略,以250天線作為長線趨勢的方向,並以收市價升/跌穿作為轉勢的觸發信號。當然我們不會預期這麼簡單的方法會有效,但作為測試,它勝在夠簡單易明。

這次我們也是先在一隻產品上測試,之後再試一籃子的股票。一開始我決定選最有代表性的恆生指數來做測試



這一次測試時段長一點,由2000年開始至今。



開始回測!



沒有結果,出了點問題......






看來回測還需要寫下沽空和平倉的條件,如果我們不作沽空,則要到回測設定裡調整。既然如此,我們就把沽空和平倉的條件都寫吧。

沒有加新的條件,賣出時同時反手沽空,平倉時同時後手買入。即是在任何時間中,都有倉位,不是正在Long,就是正在Short。



這次結果出來了,一大堆買賣的交易紀錄。



每一行是一次完整買賣的盈虧統計,以第一行為例,是一筆Short的交易,10/5/2000沽,兩日後平倉,輸了4%。

第二筆是Long的交易,又輸了5%。

細看一下,原來本金是10,000,第一次交易輸了後,第二次只剩9572去交易。所以說這個回測中,每次交易都是訓身把全部資金投進去的。我想這些本金,或是每次投入資金多少,應該是可以設定的。以後再慢慢找出來逐一測試。

那到底這個策略的表現如何呢?可以在Report這裡看到。



我們看到,在這期間的回報是49%,如果單純 Buy and hold的回報是65%,可說是唔做好過做,出出入入效果更差。但睇真D,原來主要是Short trade的部份輸錢,單計Long Trade係贏97%,比Buy and Hold 好得多。






































這個Report中還有很多不同的數據,比如說它把交易分成兩組,Winner 和 Loser。

我們可以看到這個策略中Loser比Winner多很多。比如在Long trade中,只有12次獲利交易,另外43次都是輸的。可是總括來說回報還是正數,為什麼呢?

原來是因為每次贏的時候都贏得比較多,平均有7.81%,而輸的時候都輸得比較少,平均有1.57%。結果,拉上補下,就贏得了97.5%。

這種輸多贏少(次數),但贏的時候贏得多,輸的時候輸得少(百份比)的表現,是很典型的趨勢策略特徵。之前都是從書中看到的結論,今天終於自己親手驗證了。

這個Report還有很長的部份,我們明天再續。






2017年11月6日 星期一

Scan 找出買賣信號

今日要試的是scan功能。

Scan與exploration一樣,都是把符合條件的股票選出來。不同的是,scan可分別設定buy, sell兩個情況的條件。因此股票被選出來時,我們可以知道,到底是根據買入或是賣出信號已被選出的。

讓我們來用一個簡單的買賣系統來測試一下。條件是這樣的:當股價在250天線之上時買入,股價就250先線之下時賣出。








 
一開始我們只看在某一隻股票上出現的買賣信號,比如用0001做例子。因此,在Apply to選*Current,就會只找出目前圖片上的股票的買賣信號。時間就跟上次一樣,由1月開始到現在。


結果出現了一大堆買賣信號,1月到2月尾每天都是sell,2月尾開始每天都是buy,很明顯是有問題的。




































想了一想,其實應該是在股價升穿250天線時買入,股價跌穿250天綫時賣出。修改了公式後,再試一次。終於得出比較正常的結果。總共有兩次買入及一次賣出的信號。



在圖表上看,的確是股價升穿和跌穿250天綫的日子和。



然後,我發現原來可以在圖表上顯示出有買入賣出信號的日子。



可以看到綠色箭嘴表示買入,紅色箭嘴表示賣出(雖然有點小)。這樣可以方便我們確定,買賣信號出現的位置,是否和我們想像的一樣。



接下來,我嘗試把公式套用至一籃子的股票。結果也是正常的,每只股票出現自己各自的買賣信號。



既然有了買賣信號,那即是代表可以進行回測,統計一下根據信號作出買賣的表現如何。


明天我們將會測試backtest的功能。

200天EMA (二)

上次我指出恆指在明年第一季將會回落至200天EMA水平,理據是什麼? 其實主要是運用中值回歸(Mean Reversion)的概念。由1990年至今,恆指未曾試過有一年,指數是完全沒有掂到200天EMA的。換句話說,不論是牛市或熊市,每個日曆年,恆指都會至少一次回到200天...