2017年11月28日 星期二

新高新低比率 (三)

上次成功地製作出22天新高比率的數據,並畫到股價圖的下方,方便分析。

新朋友可以重溫一下:

這一次,我打算把新低指標也加到圖上,再來看看是否有助預測後市走勢。

既然我們已知道新高比率如何製作,現在要製作新低比率並不難。
在原本的Formula 上加兩行即可:

New_Low_Amount = Low < Ref ( LLV (Low, 22), -1);

AddToComposit ( New_Low_Amount, "~NewLowAmount", "X");



Scan完後,便會多了一個記錄著22天新低數據的Ticker: ~NewLowAmount。
把它除以所有股票數量,得出22天新低比率,然後用Foreign plot出來,變大功告成。



我把新高比率設定成綠色,新低比率設定成紅色,方便觀看。



初步可以看到,大部份時間指數上升時,新高比率會愈來愈高,直至見頂回落;而指數下跌時,新低比率則會愈來愈高,直至見底回升。

為了更直觀地查看指標,我決定把新低比率變成負數,同時把指標變成Histogram。



這樣,指標升跌的方向就會變得跟指數升跌的方向一樣,方便分析任何異常情況。

比如說,技術分析中,常用的背馳概念,或許在這個新高新低比率中,也能應用,幫助分析後市?

比如說,2013、2014、2015年均出現指數與新高新低比率的走勢背馳的情況。指數上升,但創新高的股票比率卻下跌,此現象我們稱為頂背馳,或熊背馳,結果後市見頂回落。



有頂背馳,自然就有底背馳,2012、2014、2015均出現過此現象,指數一底低於一底,但創新低的股票卻愈來愈少,其後大市均見底或出現中期反彈。



假如將其套用到這兩年的市況,又是否適用呢?

續。

2017年11月22日 星期三

每天自動啟動Amiquote (一)

現在每天用Amiquote下載數據,只要按幾下即可,十分方便。雖然如此,對我來說,每天按幾下仍是一件十分不輸快的重覆性工作,應該要想辦法讓電腦去幫忙完成。

很快,我找到了原來Windows是有一個內置的程式叫Task Scheduler,可以設定條件後自動進行工作。比如每天7點啟動Chrome、開機後自動啟動小畫家等等。




既然如此,我自然可以讓它每天早上自動啟動Amiquote,那我又可以多睡一會了(笑)。

好,現在就試試到底搞不搞得到吧。

Task Scheduler進去後的板面是這樣的。



在右手邊有一個Create task 的Button,這裡就是我們新增任務的地方,完成所有設定,它就會自動運行了。首先,我們按下去,會出現這樣一個窗格:



第一步,先填名稱,填一個一看就知道這個Task是做什麼的比較好,比如填Start Amiquote吧。

然後,到Trigger這個位置,按New。




之後會出了這個window。我的做法就是選weekly,然後把星期一至五都打勾。時間就在8時多,太早的話怕數據還沒出來。



OK了之後,就到Action的板面按New,就出來這個window。



































然後,我們在Browse裡找到Amiquote的檔,比如我自己的是叫"HKMainboard"。






















然後OK所有野。在Task Scheduler Library中就會多了這個我們新設的任務:Start Amiquote



然後我們按Run。卻出了這個window,有些地方不對........

























原來,在Task Schedulers裡,不能簡單地這樣選一個程序來開,要有點改動。我們先回到Task Scheduler Library,在"Start Amiquote"上Right Click,選Properties,就可以回到早前設定任務的板面。























在Action->Program裡,我們要把整個路徑放到Add arguments 上,只留下"HKMainboard.tls"在第一行。

設定完成後,我們再Run一次。這次不同了,出了這個window:




































我們按OK後,卻又出了個window.........


















好,都做到這個地步了,你想怎樣我照做就是了。我把HKMainboard.tls複製一份放到桌面,再Run一次.........




























終於成功把HKMainboard開出來了!!!但是...................我還是要在Amiquote裡按Start download ar!! 而且之前還有一步要按OK的,那豈不是完全沒意思嗎?結果還是要我自己按。

看來功夫不只這麼簡單,我還要找辦法在自動啟動Amiquote後,再自動開始下載才行。

續。

2017年11月20日 星期一

Organize Assignment - 管理 Tickers 工具

早前有朋友問,如果想做不同市場的市寬,比如說港股、A股、美股的市寬,應如何做?

其實方法與早前在新高新低比率的文章中所說的沒有分別,但有兩點需要注意的地方:

1. 須要把港股、A股、美股放到不同的Markets

比如好像我自己,就分了美國的NYSE(New York Stock Exchange)、Nasdaq、AMEX(American Stock Exchange)、香港的HKSE,和A股的Shenzhen和Shanghai Exchange。




在哪裡可以做到呢?只要到Symbol -> Categories 就可以改名。



Markets的第一項我建議留空或像我這樣寫"New",因為新的TickerS都會自動被分配到第一個Market,如果你第一個是正常分類的Market,比如HKSE,那有新Ticker的時候就會加進了雜質,不為意沒整理的話,得出來的數據就會錯了。



Categories主要是改名和移動上下的位置,如果要更改裡面的成份,就要到Symbol -> Organize Assignment.





這些Markets是mutually exclusive的,意思是一隻股票只能屬於一個Markets,不能同時屬於兩個Markets。比如0700.HK,你放了它在HKSE,就不能再放到NYSE。

如果同一隻股票想放到兩個組合,那怎麼辦?只要放到Watchlist就可以了。Watchlist是沒有任何限制的。

把股票分配到它們各自所屬的Markets後,只要在制作市寬指標時選相應的Market去Scan就可以。

-------------------------------------------------------------------------------------

2. 紀錄不同市場市寬數據的Tickers須要用上不同的名稱

比如說:

紀錄港股總數:
AddToComposite( 1, "~HKStockAmount", "X");
Scan 的時侯在Filter選Market -> HKEX

紀錄美股總數:
AddToComposite( 1, "~USStockAmount", "X");
Scan 的時侯在Filter選Market -> Nasdaq + NYSE + AMEX

假如單純Copy and paste忘了改名字,就會把舊數據overwrite了。比如說先Scan HK,而後Scan US,但兩個Ticker都叫"~HKStockAmount",那"~HKStockAmount"內的數據就會變成美股數量了。

2017年11月17日 星期五

新高新低比率 (二)

上一次,我們成功得到了「22天新高股票數量」這個數據,但又來了兩個問題:

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

--------------------------------------------------------------------

要解決第一個問題,我們需要用到一個新的Function:Foreign

這個Function可以幫我們讀到當前ticker以外的ticker的數據,直接用例子說明:



我們現在Plot一個技術指標,用的array是Foreign("~NewHighAmount","C"),也就是"~NewHighAmount"這個ticker的收市價。這和我們現正看的ticker:^HSI是完全無關的。

可以看到最底的Pane,黃線顯示的就是「22天新高股票數量」。

--------------------------------------------------------------------

第二個問題,首先要知道新高股票比率如何計算。

新高股票比率 = 新高股票數 / 全部股票數

要得到全部股票數,不難,我們只要用AddToComposite就可以。條件就填1,即是所有股票都符合條件,再給一個新的Ticker名稱,如:

AddToComposite( 1, "~AllStockAmount", "X");

再Scan一次即可。



然後,只要在Plot的Array中放進用 「新高股票數」 和 「全部股票數」計算出來的 「新高股票比率」即可。



即可得到新高股票比率的指標。

「新高股票比率」可算是一種量度整體市況的指標,因它並不是只用一隻股票的數據來計算,而是用到全部股票。在技術分析中,我們稱這類指標為「市寬指標」。

運用以上的方法,大家只要改改參數,即可得到不同Time Frame,短中長線的新高比率指標。如果大家改改公式,便可得到從其他角度計算出來的市寬指標,比如新低比率、在250天線以上的股票比率、RSI超買超賣比率......

大家如果研究到哪個市寬指標比較有效分析市況,不妨拿出來一起討論。


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才會更新。如果我要每天早早起來,下載數據。感覺上成件事很笨,很沒有效率。明明是在用電腦,怎麼事情都沒有自動化呢?

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




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還有很長的部份,我們明天再續。






200天EMA (二)

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