Author Archives: 發財橘子

檢查表在程式交易上的呈現方式

檢查表(check list)是一個被專業人士大量使用的工具,外科醫師用它來檢查手術前的準備工作,飛行員用它來完成起飛前的檢查,我試著把它的精神,透過語法,應用在投資操作上。檢查表是有機變動的,隨著投資經驗的累積,我們會更清楚地列出進場前要檢查的項目,這些項目,就是我們悠遊股海幾經風浪而不翻船的終極武器。

 

關於檢查表的概念及用法,天下出過一本書: 檢查表:不犯錯的秘密武器

042001

對檢查表的精神及實踐方法有興趣的朋友可以研究一下,我個人運用檢查表這個工具在投資上,已經有一段時間了,因為過往工作經驗的關係,我每天都會收到來自不同來源的明牌,有的是我以前的同事,有的是我以前認識的同業,有的是我收到的研究報告,甚至有些是我在網路社群裡收到的訊息,每次收到明牌,我都會先透過下方這個簡單的檢查表,檢查一遍,只有通過這樣檢查的股票,我才會列入觀察名單。

check list

這個檢查表其實並不複雜,其中的精神有幾點

1.股價不能太貴,我用PE及PB來衡量

2. 籌碼是良性而不是惡性,主要是看法人有沒有在賣以及籌碼是集中還是發散

3.技術面不能太醜。量能要溫和放大,均線多頭排列,這樣技術派的才會願意進來共襄盛舉

4.避開獲利了結賣壓。 所以短線漲幅不能太大

5.開始出現追價買盤。 最近一天要夠強。

 

根據這樣的想法,我把check list的精神,轉換成程式碼,由於check list的意義在於每一個項目都要符合,所以我很簡單地用and來串連每一個條件式,下面就是上述檢查表的對應程式碼

//先準備需要被拿來運算的資料
value1=GetField("法人買賣超張數","D");
value2=GetField("佔大盤成交量比","D");
value4=GetField("董監持股佔股本比例","D");
value5=GetField("外資持股比例","D");
value6=GetField("買家數","D");
value7=GetField("賣家數","D");
value8=GetField("股價淨值比","D");
value9=GetField("本益比","D");
//設計檢查表的規則
if average(value2,5)>average(value2,10)//成交量溫和放大
and average(value1,3)>0 //法人沒有站在賣方
and value4+value4>30 //籌碼集中
and average(value7,3)>average(value6,3)*1.03//籌碼是集中不是發散
and average(close,5) >average(close,10)//均線多頭排列
and close>close[1]*1.02//最近一天夠強
and close[5]< close*1.15//短期漲幅不算大
and value8<3//PB沒有太高
and value9<20//本益比不致於不合理

then ret=1;

 

在撰寫檢查表這類型的程式時,基本上有兩個步驟

1.先用getfield的語法,把檢查表要用到的資料欄位宣告成變數

2.透過if   …….and的語法,把所有條件式都串起來

如果條件式無法用一行敘述來完成,也可以用if ………..then condition1=true;這類的語法來表達一個較複查的條件

然後當這些條件式都是true時,這檔個股才會通過這個檢查表

以上述的腳本為例,用昨天的數據下去跑,完全符合上述條件的名單如下:

 

042002

 

 

 

 

 

以上是檢查表在程式交易上體現的方式,上述的例子只是個樣本,裡頭的參數也都可以調,使用的時候記得要用日線,資料讀取要超過十筆,各位也可以自行設計專屬的檢查表,就像天下那本書說的,這工具可以減少我們在投資上犯的錯。

 

 

決策樹在程式交易上的應用

 

我每天都會把當天漲停的股票看一遍,觀察這些股票有沒有什麼樣的共同特徵? 後來我發現,這些股票當中,我比較買的下手的,基本上有一些同通點,於是,我試著用決策樹的思考流程,寫成一個策略腳本。

決策樹是專業經理人們,在作決策時,常用的工具,其目的在於找出要達到目標(股票漲停),所該選擇機率最高的決策路徑,在這個路徑上,有多個選擇的節點,在每個節點,必須作出對的選擇,才能最後得到最佳的方案。

舉個例子,大陸有個女生在決定是否與相親對象見面時,作了以下的決策樹

041902

這就是很典型的決策樹。

套用這樣的思考方式,我想要尋找的股票,我先畫出一個決策樹如下:

041901

我的思考如下:

1.我發現比較漲得兇的股本都不大,有個好消息,往往能貢獻較高EPS,所以我先設定最後我要的股票,股本要小於50億元。

2.要吸引市場追價,基本面要有一定的想像空間,所以我希望的基本面是最近一個月營收mom或yoy兩位數成長,或是毛利率成長。

3.我希望它的走勢

A.比大盤強

B.資金流入

4.我希望它在盤中

A.K棒中長紅

B.成交量超過千張

C.創盤中新高

根據上述的思考,我把它改寫成以下的腳本:

value1=q_CurrentCapitalin100Million;//股本:單位億元
value2=q_GrossMarginRate;//毛利率
value3=GetField("資金流向");
value4=GetField("強弱指標");
value5=GetField("投信買賣超");
value6=q_RevenueYoY;//營收年增率
value7=q_RevenueGrowth;//營收月增率
if value1<50//股本小於50億
then begin
if value6>9 //營收年增率兩位數成長
or value7>9//營收月增率兩位數成長
or value2>value2[1]//毛利率成長
then begin
if value4>0//比大盤強
and value3>average(value3,10)//資金淨入
then begin
if close>close[1]*1.02//K棒中長紅
then begin
if volume>1000//成交量大於1000張
then begin
if close=high//創盤中新高
then ret=1;
end;
end;
end;
end;
end;

 

在這個腳本裡,我用了大量的 if ……………then begin…………..end;

也用了and 跟or

透過這些關係運算子及流程控制元素,就可以完成一個決策樹。

各位不妨也試試自己先畫出一個決策樹,然後再根據上述的寫法,完成自己專屬的選股及交易策略

 

 

Q指標

操作策略的形成,往往來自電光火石間,乍現的靈感,這些靈感,必須經過實證的研究,才能成為真正的交易策略,而自訂指標,就是實證研究的方法之一,經過研究,尋找及歸納出指標的應用方式,是交易策略的起點。

很多操作的策略,其成形的靈感,往往來自看盤的體驗上,例如我們總是想知道,現在是

1.上昇趨勢(up trend)

2.下降趨勢(down trend)

3.沒有趨勢( no trend)

那該如何判斷呢?

有人想到,如果把一定期間每天的漲跌累積起來,如果是上昇趨勢,這數字應該會是正的,如果是上降趨勢,這數字應該是負的,如果是盤勢,這數字應該是在零上下波動。

於是,就有人想出了一個叫作價格累積變化的指標(cumulative price change),我們簡稱為CPC

它的計算方式如下:

input:t1(10,"計算累積價格變動的bar數");
value1=close-close[1];//價格變化
value2=summation(value1,t1);//累積價格變化
plot1(value2,"累積價格變化");

這個指標跟加權指數的對照圖如下:

041801

 

當我們在自訂指標的時候,這種計算出一個時間序列,然後觀察這個時間序列與商品價格的對應關係,從而訂出交易策略,是一種最直覺的方法,但有的時候,這個指標的變動過於劇烈,有的時候這個指標的數字視商品價格而定,因為不大容易形成一個放諸各種商品皆適用的策略規則。

這時候我們最常運用的,就是長短天期移動平均線的方式,以上述的CPC指標為例,我們可以把上述的腳本改成以下的樣子

input:t1(10,"計算累積價格變動的bar數");
input:t2(5,"短期平均天期");
input:t3(10,"長期平均天期");
value1=close-close[1];//價格變化
value2=summation(value1,t1);//累積價格變化
value3=average(value2,t2);//短期平均
value4=average(value2,t3);//長期平均
plot1(value3,"短期累積價格變化平均");
plot2(value4,"長期累積價格變化平均");

這樣子的指標,對照大盤的圖如下:

041802

從上圖來看,我們大致可以發現,當短天期移動平均與長天期黃金交叉時,是個買進訊號,但如果是死亡交叉時,就是個賣出訊號。

很多大家耳熟能詳的指標所對應的交易訊號,基本上的概念都是用兩條不同天期的移動平均線去尋找黃金交叉或死亡交叉的點,以上面的腳本為例,如果我們要改寫成作多的交易策略,只要把plot1及plot2拿掉,改成以下的敘述即可

if value3 cross over value4 then ret=1;

兩條不同天期均線的對應關係,不是僅有那條線在那條線上面或下面而已,有的時候,兩條線的距離也很有意義。

這時候我們可以把 那條不同天期移動平均線相減,然後畫成柱狀線,這樣不僅可以看出那條線的高低比較,也可以看出那者間是愈拉愈近還是愈拉愈遠,基至連轉折點也可以一目了然。

例如上圖,我們只要再加下面這一行

plot3(value3-value4,"短期減長期");

下圖就是對應的圖

041803

對照上面的圖,有一個弱點,那就是我們用黃金交叉及死亡交叉來形成決策時,不是做多就是做空,那盤整的時候怎麼辦呢? 或者說,這類的交易策略在趨勢成形時可能極有效,但如果盤整時會不會就很容易出現一下子買進一下子賣出的錯誤訊號呢?

為了解決這個問題,很常被拿來使用的作法就是”去噪音” ,把盤整的因素考量進來,以這個CPC指標為例,如果我們認為CPC的移動平均線可以真正代表價格波動的趨勢,那麼每一個CPC的點到其移動平均線之間的距離,則是單一點偏離趨勢的值,這些偏離值的絕對值就是這個趨勢的噪音,噪音愈大,代表這個趨勢愈不明顯,噪音愈小,代表價格的波動主要是沿著趨勢在跑,這樣的趨勢代表性及持續性會較顯著。

所以我們可以試著算出噪音的移動平均線,然後再把CPC趨勢與噪音相除,如此就可以計算出考慮過噪音大小後的CPC的值,這個值就是所謂的Q指標

它的腳本如下:

input:t1(10,"計算累積價格變動的bar數");
input:t2(5,"計算價格累積變化量移動平均的期別");
input:t3(20,"計算雜訊的移動平均期別");

value1=close-close[1];//價格變化
value2=summation(value1,t1);//累積價格變化
value3=average(value2,t2);
value4=absvalue(value2-value3);//雜訊
value5=average(value4,t3);//把雜訊移動平均
variable:Qindicator(0);
if value5=0
then Qindicator=0
else
Qindicator=value3/value5*5;
plot1(Qindicator,"趨勢值");

這個Q指標與加權指數的對照圖如下:

041804

這個指標是過濾掉噪音後的趨勢

根據它的計算原理,我們可以訂出明確的交易訊號如下:

1.  -1到1: No trend

2.    1到2與-1到-2: Weak trending

3.    2到5與-2到-5: Moderate trending

4.    大於5與小於-5: Strong trending,當數值遠遠超過此數值,表示超買與超賣

 

從 Q指標這個例子,我們可以學習到,自訂指標的設計及移動平均線的計算,長短天期平均線的差值,以及去除噪音的方式,這些技巧學會後,可以讓我們把自訂指標的應用,做的更得心應用。

 

 

 

 

那些公司可以放到觀察名單中?

現在的上市櫃股票超過1500檔,有沒有一個方法,濾掉大部份的股票,剩下一群真的值得仔細研究的公司,然後再來好好研究它們? 執行力一書的作者瑞姆.夏藍(Ram Charan)認為,若要快速掌握一家企業是否賺錢,以及如何賺錢,可檢視三種衡量指標:成長、現金的產生、資產報酬率(return on assets,ROA),我從這三個指標出發,試著訂出把1500檔篩選到200檔以內的過濾標準,希望大家可以去蕪存菁,專心研究那些不會讓我們白費力氣的公司。

 

我訂了幾個選股條件

一,過去五年內至少有三年營收比前一年成長

參考腳本如下:

value1=GetField("營業收入淨額","Y");
value2=value1-value1[1];
if countif(value2>0,5)>=3
then ret=1;

二,過去三年來自營運的現金流量都大於零

value1=GetField("來自營運之現金流量","Y");
if trueall(value1>0,3)
then ret=1;

三,資產報酬率達到一定的水準且沒有明顯下滑

value1=GetField("資產報酬率","Q");
value2=average(value1,4);
value3=linearregslope(value2,5);
if value3>0
then ret=1;

我把這三個腳本一起拿來選股

041501

合乎條件的股票共有209檔,另外我想針對台灣的特性,把牛皮股及剛上市的公司給扣除

所以我另外加了幾個選股條件

041503

這樣六個條件選出來的股票正好170檔

041502

我們以前在研究部的時候,研究員大約就八到十個人,170檔一個人研究約20檔,這樣的觀察名單就可以研究的很透徹,盯的很仔細了,現在我們算是個體戶,可以透過月營收的變化來再過濾一次,每個月就好好研究這170檔股票裡面,營收表現最突出的。

夏季限定版選股~旺季來臨前的選股腳本

春雷都響了,夏天就不遠了,老師父常說股市總是五窮六絕,七上八下, 此時,最好有一種選股法,選出的股票,每個月營收都會比上個月成長,消息面上,幾個月內並無一片烏雲,讓我們在傳統的淡季裡,依然享有小清新,小確幸,今天要來跟大家分享的,就是這樣的選股腳本。

首先我們來看張圖

時序的安排序列呈現方式

從這張圖我們可以看得出來

1.如果我們把月營收設為Y,我們要找一年前同期的營收,那就是Y[12*1],如果要找的是兩年前的同期營收,那就是Y[12*2]。

2.然後以這個數為基準,要找去年起算的前N個月營收,那就是Y[12*N年前+N月]

3.要找N年前同期月份之後的某個月營收,那就是Y[12*N年前-N月]

根據這樣的時序結構,如果我們要以最近公佈的月營收公佈月份為基準,找出過去三年裡,未來三個月營收平均比過去三個月營收平均增加超過25%的股票,我們可以寫成以下的腳本

value1=GetField("月營收","M");//單位:億元
variable:W1(0),W2(0),W3(0),F1(0),F2(0),F3(0);

setbarfreq("M");
settotalbar(39);

W1=(value1[12]+value1[13]+value1[14])/3;
W2=(value1[24]+value1[25]+value1[26])/3;
W3=(value1[36]+value1[37]+value1[38])/3;
 
F1=(value1[11]+value1[10]+value1[9])/3;
F2=(value1[23]+value1[22]+value1[21])/3;
F3=(value1[35]+value1[34]+value1[33])/3;
 
if F1>=W1*1.25 and F2>=W2*1.25 and F3>=W3*1.25
then ret=1;

透過這個腳本,我們會挑出一些未來三個月營收,因為季節性因素,可能一路成長的股票

例如以下這三檔股票

041304 041303 041302

 

這個腳本,不限定要在三月營收公佈時才跑,在每個月營收公佈後都可以跑一次,這樣就可以找到接下來這一季營收因為季節性因素可能比前幾個月表現會更好的股票,如果這些股票在營收淡季股價有修正過,基本面又沒有衰退的隱憂,那麼這些旺季即將來臨的股票,至少享有未來幾個月營收會有比先前明顯回昇的小確幸。

 

 

 

大盤不錯才Trade,大盤不好別逆勢作多~兼談跨商品的語法

朋友在抱怨這陣子不好操作,我想起師父以前常說的兩句話: “長線保護短線”,”大盤保護個股”。長期以來,我總是在指數突破月線後加碼,在指數跌破後空手,今天我想透過XS的回測功能及跨商品功能,跟大家討論這個觀念。

首先請大家看看這張圖

041201

 

從這張圖我們可以發現,加權指數與月線的關係基本如下

1.在上昇趨勢裡,大部份的時間,加權指數都在月線之上

2.在下降趨勢裡,大部份的時間,加權指數都在月線之下

3.在上昇趨勢裡,加權指數偶爾會跌破月線,但會很快站回

4.在下降趨勢裡,加權指數偶爾會突破月線,但會很快跌回

5.一但月線的斜率很明顯的反轉後,該趨勢總會持續一段時間

所以一直以來,月線一直是我決定加減碼的重要指標。

這次XS正在測試中準備要上線的版本有兩個功能,一個是回溯測試的功能,一個是跨商品寫在同一個腳本中的語法,我想用這兩個功能,舉一個簡單的例子,跟大家說明這種操作思維。

請看下面這個腳本

condition1=false;
condition2=false;

if momentum(close,10)cross over 0
then condition1=true;

value1=getsymbolfield("tse.tw","close","d");

if value1>average(value1,20)
then condition2=true;

if condition1 and condition2
then ret=1;

在這個腳本裡,我們第一次用到一個跨商品跨頻率的語法:”Getsymbolfield”

它的用法是 指定某一變數=getsymbolfield(“商品代碼”,”欄位名稱”,”頻率”)

所以上面這個腳本的意思就是

“在加權指數站在月線之上時,如果台股MTM突破零時,就進場。”

我用這個腳本去跑所有有量的中小型股票,然後發現,從今年第一個開盤日到現在,如果用這個腳本下去操作,一共會賺295%,勝率是51.3%,測試報告如下表

041201

但如果只是用單純的動量指標突破零,那麼績效就不如上面這個有用加權指數與月線關係來作過濾的腳本,總報酬率只剩23.3%,勝率剩下47.95%。

041202

 

這當中最大的差別就在於有沒有考慮到大盤的方向。

透過這個例子,我想表達的是,孫子兵法中說的: “多算勝,少算不勝” ,一個完整的交易策略,不僅要考慮個股的價量情況,也可以再考慮整個大環境的多空態勢,這樣不一定能買在最低賣在最高,但長期下來,比較可以因為站對邊而有機會因勢乘利。

 

年收股息上百萬的定存股怎麼找?怎麼操作?

最近朋友傳來一篇文章,網址如下: 大意是說有位不到40歲的工程師,拿了家族680萬,投資了中碳及帝寶,十年賺了八千萬,現在每年股息超過百萬。

http://ww.share001.com/cat53/node1016548#151910

在文章中,他列出了五要十不共十五個條件

五要

1.近五年不能有賠錢記錄

2.營收或獲利每年穩定成長10%~15%

3.資本額在5億到40億元之間

4.股息配發率超過六成

5.企業老闆是否說話算話

十不

1.不選毛利率低於兩成的公司

2.不選負債比同業高

3.不選掛牌不到兩年

4.不選易受原物料行情影響

5.不選股價過度急漲

6.不選老闆太常在媒體曝光

7.不選客戶過度集中

8.不選公司業務太複雜

9.不選董監持股比例低於兩成的

10.不選與自己價值觀衝突的

我根據文章上的選股條件,把可以量化的條件,用XS想根據他所列出來的五要十不去挑股票,我設的選股條件如下:

041201

其中的股息配發率超過一定比率,是我自己寫的選股腳本,腳本如下:

input:ratio(60,"股息配發率%");
value1=GetField("每股稅後淨利(元)","Y");
value2=GetField("現金股利","Y");
if value1>0
then value3=value2/value1*100;//股息配發率

if trueall(value3>ratio,3) then ret=1;

透過這個選股法,挑出來的股票只有一檔,就是9941的裕融。

如果把這些選股條件放的更寬,如下圖

041202

選出來的股票有31檔。

041203

最近存股法很流行,這篇文章應該是我看過的文章中,話說的最實在的,之前曾有人也給了我一位大師的選股法,洋洋灑灑列了快十條,光其中兩條我拿去寫成XS的選股條件,結果一檔股票都選不到。

我自己財富累積的過程跟這位工程師有點像,但我沒有家族的680萬讓我衝,當年是靠好朋友讓我認增資股,賺了第一桶金,擴張信用到一千萬當本金,買的也不是現在流行的定存股,而是聯強,仁寶,華通,台達電這些當年才剛要在其從事的領域進入大成長期的公司。

綜合這位工程師跟我自己的經驗,我覺得大家在討論定存股時,不見得要拘泥於多少的選股條件,核心的精神其實就是三個原則

1。公司處於還很有發展性的行業。

2。公司所經營的業務有蠻高的進入障礙。

3。公司經營階層踏實經營,不玩金錢遊戲。

剩下的事情是,

1.用心的研究這些被過濾出來的少數股票,找到合適的標的。

2.長期追蹤這些公司的核心競爭力是否已經出現改變

如果對於基本面的變化沒有太大把握,我會建議用還原月線來當作波段的買賣指標,以中碳跟帝寶為例

041204

041205

透過這個方法,可能會有殺低又追高的風險,但一買一賣之間的價差其實不會大,但是可以避開原本好股票走大空頭的風險。

以上是我自己的經驗談,供大家參考。

 

3月份月營收數據公佈後的選股方向

3月份的月營收才剛公佈,我們透過XS的選股平台,透過不同的選股程式及條件,來挑出月營收表現值得留意的公司。

要特別強調的是,由於法人對於近幾個月公佈的營收數據,透過拜訪公司,大多已經心裡有譜,所以我們使用月營收來選股的方向,主要有兩個

1.找那些營收成長明顯的冷門股。

2.儘量去避開那些不如預期的高價股。

基於上述的兩個方向,今天跟大家介紹五個透過月營收來運算的選股方式

一,月營收創25個月新高

為了避免挑出季節性因素造成的三月營收大成長,所以加上近三個月月營收年增率平均大於5%的條件,這兩個條件綜合起來,符合條件的股票共有108檔,名單如下圖:

041101

 

二,月營收創12個月新低

041102

三,營收再起飛

這個策略是去尋找那些過去月營收年增率是走下降趨勢,但最近開始轉為上昇趨勢的公司
我們用的腳本如下:

input:TXT("僅適用月線"); setinputname(1,"使用限制");

If barfreq <> "M" then raiseruntimeerror("頻率設定有誤");

setbarback(20);
settotalbar(20 * 2 + 5);

value1=GetField("月營收年增率","M");
value2=average(GetField("月營收年增率","M"), 3);
value3=linearregslope(value2,20);
value4=linearregslope(value2,5);

if value3 < 0 and value4 crosses above 0
then ret=1;

符合這個腳本的股票共有98檔

041103

 

四,高股價營收衰退

選股條件如下

041104

符合條件的股票共有八檔

041105

五,月營收年增率移動平均黃金交叉

我們用以下的腳本,來尋找那些營收年增率的短期移動平均線向上穿越長期移動平均線的股票

value1=GetField("月營收年增率","M");
if average(value1,4) crosses over average(value1,12)
then ret=1;

除了上述的腳本之外,另外加上兩個條件

1.為了避免營收過小,一個大單子就影響運算結果,我們濾掉那些單月營收小於一億的股票。

2.為了避免選到股價已經大漲過的股票,我們再加上近二十日跌幅要大於零的條件。

符合上述三個條件的股票共有37檔,名單如下:

041106

產業數據在XS上的應用

常有人問我XS跟MC,跟HTS,跟TS有啥差別? 我的回答是: “XS是我們自己寫的編譯器,所以語法及功能,可以不斷的隨本地客戶的需要而改進” 。最近大盤忽多忽空,我想從XS在產業上的應用來探討,有沒有那些產業不理會大盤的波波折折,已經走出屬於自己的方向。

用過XQ的朋友都知道,XQ有編制了一整套的細產業指數,所以我們隨時可以像底下的這個頁面一樣,了解細產業指數的漲跌變化。

040701

XQ可以拿到XS來運算的細產業指數共有154個,光以紡織類為例,就有加工絲,棉紡,尼龍,成衣,染整,長纖布,不織布及聚酯纖維等八個細產業指數,可以完整的呈現特定族群的整體表現,我們可以從追蹤這154個細產業的多空變化,從產業的宏觀角度,來掌握類股輪動的方向,可以從這154個細產業的資金流向,了解市場的熱點,明日之星與昨日黃花各是那些產業。

在拿這些細產業指數出來作量化分析時,XS有提供了一些指數限定版的欄位供User來使用,我列表如下:

 

類別 畫圖(plot)/策略雷達 類別 GetQuote
量的欄位 內盤量 量的欄位 總量
外盤量 單量
上漲量 昨量
下跌量 內盤量
開盤委買 外盤量
開盤委賣 委買賣差
籌碼欄位 外資買賣超張數 委比
投信買賣超張數 成交值
外資持股張數 開盤委買
投信持股張數 開盤委賣
自營商買賣超張數 總成交次數
自營商持股 統計欄位 成交比重
融資增減張數 上漲家數
融券增減張數 下跌家數
融資餘額張數 漲停家數
融券餘額張數 跌停家數
現股當沖買進金額
現股當沖賣出金額
法人買賣超張數
法人持股
主力買賣超張數
主力持股
券資比
資券互抵張數
實質買盤比
實質賣盤比
現股當沖張數
統計欄位 資金流向
強弱指標
上漲家數
下跌家數
漲停家數
跌停家數
騰落指標
總市值
GDP比例

應用這些欄位,再加上原本就有support的開高低收成交量等欄位,我們就可以建構出以產業作為出發點的交易策略。

舉個例子,細產業指標中的資金流向,它的公式是

該細產業成份股成交值的總和/對應大盤指數成交值*100%

我們可以運用這個欄位,建構一個資金流向的指標如下

input:period(5,"短期移動平均天數");
input:period1(20,"長期移動平均天數");
 

value1=GetField("資金流向");//商品成交值/對應大盤指數成交值*100%
value2=average(value1,period);
value3=average(value1,period1);
value4= value2-value3;
 
plot1(value2,"短期移動平均");
plot2(value3,"長期移動平均");
plot3(value4,"dif");

 

根據上述的腳本,我們以最近很熱門的汽車零組件細產業指數為例,看一下畫出來的對照圖

040706

從上面這張圖我們會發現,3/31日Tesla 平價Model 3才剛開始預售,但3/23台灣的汽車零組件指標的資金流向就已經開始出現黃金交叉了。

我們可以把上述的指標腳本改寫成警示腳本,尋找那些資金流向翻紅且股價上漲的細產業

input:short1(5),mid1(20);
setinputname(1,"短期平均");
setinputname(2,"長期平均");
value1=GetField("資金流向");
value2=average(value1,short1);
value3=average(value1,mid1);
value4=value2-value3;
value5=GetField("總市值");
if value4 cross over 0 and value5 >value5[5]*1.025
then ret=1;

 

除了可以建構尋找細產業買賣點的自訂指標及策略之外,在選股方面,提供了兩個跟產業相關的功能

一,XS提供了同產業排行這樣的選股條件,讓user可以透過這些條件,挑出屬於特定行業特定條件排名最前或最後的股票。

例如您可以設定類似以下的選股條件

040702

 

要特別說明的是,在這裡可以作為排名基礎的,共有四級,分別是全市場,同行業組,同行業及同子行業。

其中產業的部份共分成三類,分類的方式主要是Follow  GICS的產業分類中的第二層,第三層,然後再對應到XQ的細產業分類作為最後一層,以能源產業為例,我們的分類就如下面這張圖

040704

透過這樣的分類,行業組對應的是GICS的中產業分類,行業對應的是GICS的產業分類,子行業就是XQ自行分類的細產業。

二,XS以產業視野來設定的選股策略是同行業的上中下游股價指標,XQ系統上原本對每一檔股票,都會找出它的上游,同業及下游企業,這些企業不一定是台股,也可能是美股,A股等等,我們把這些企業,用漲跌幅簡單平均的計算方式,編制成價格指數,如此一來,每檔股票,每一天都可以計算出其上游,同業及下游股票的價格指標,如此一來,我們就可以每天找出任何一檔,其上游,中游或下游企業股價出現異常波動的個股,例如我設定如下圖的選股條件

040705

就可以找到上游,同業或下游價格波動異常的個股了。

 

透過產業排行,上中下游價格指標及細產業指數,XS程式交易平台提供了其他平台所無法提供的產業視野,特別是在今年這種行業趨勢多空分歧的時候,我們不妨多透過產業的語法,先挑出由空翻多的產業,再去尋找該產業裡的龍頭公司。

 

 

 

當DMI遇上VHF

DMI大家很常用,不過跟大部份的趨勢指標一樣,踫到盤整就GG。 今天我想介紹一個VHF指標,這個指標能過濾盤整的情況,我們可以把這兩個指標合起來一起使用,來過濾掉盤整時DMI所出現的交易訊號。

 

DMI是一個很常用的指標,從下面這張圖可以很清楚地看到,它代表的每天多頭新攻佔的地盤,與空頭新斬獲間的角力。

dmiiDMI相關的數據,我們用了directionmovement這個函數來計算

// DirectionMovement function (for DMI相關指標)
// Input: length
// Return: pdi_value(+di), ndi_value(-di), adx_value(adx)
//
input: 
 length(numericsimple),
 pdi_value(numericref),
 ndi_value(numericref),
 adx_value(numericref);
 
variable:
 padm(0), nadm(0), radx(0),
 atr(0), pdm(0), ndm(0), tr(0),
 dValue0(0), dValue1(0), dx(0),
 idx(0);

if currentbar = 1 then
 begin
 padm = close / 10000;
 nadm = padm;
 atr = padm * 5;
 radx = 20;
 end
else
 begin
 pdm = maxlist(High - High[1], 0);
 ndm = maxlist(Low[1] - Low, 0);
//先算出pdm及ndm
 if pdm < ndm then
 pdm = 0
 else 
 begin
 if pdm > ndm then
 ndm = 0
 else
 begin
 pdm = 0;
 ndm = 0;
 end; 
 end;
//那一邊的力量比較大,另一邊就以零來計算
 if Close[1] > High then
 tr = Close[1] - Low
 else 
 begin
 if Close[1] < Low then
 tr = High - Close[1]
 else 
 tr = High - Low;
 end;
//  計算true range
 padm = padm[1] + (pdm - padm[1]) / length;
 nadm = nadm[1] + (ndm - nadm[1]) / length;
 atr = atr[1] + (tr - atr[1]) / length;
 
 dValue0 = 100 * padm / atr;
 dValue1 = 100 * nadm / atr;
 
 if dValue0 + dValue1 <> 0 then
 dx = AbsValue(100 * (dValue0 - dValue1) / (dValue0 + dValue1));

 radx = radx[1] + (dx - radx[1]) / length;
 end;

pdi_value = dValue0;
ndi_value = dValue1;
adx_value = radx;

 

 

而透過上述的計算公式,我們可以了解,DMI是透過多空雙方的力量變化,來呈現何者佔上風。

但在盤整的時候,DMI會因為多方或空方一時的表現,而呈現相互交叉的鋸齒狀走勢,
這代表了多空拉鋸,但在這種時候,如果貿然也以+DI突破-DI為買進訊號,或者 -DI突破
+DI為買進訊號,那麼就很突易出現過度交易的現象。

這時候市場老手們就引進了VHF這個指標,用它來過濾掉一些DMI在盤整時可能出現的假訊號。

VHF的全名是垂直水平過濾指標,它是把一段時間以來的最高點減去一段時間以來的最低點,然後去除以這段時間每天漲跌的絕對值的總和。

對應的腳本如下:

// XQ: VHF指標
//
input: Length(42);
Variable: hp(0), lp(0), numerator(0), denominator(0), _vhf(0);

SetInputName(1, "天數");

hp = highest(Close, Length);
lp = lowest(Close, Length);

numerator = hp - lp;
denominator = Summation(absvalue((Close - Close[1])), Length);

if denominator <> 0 then
 _vhf = numerator / denominator
else
 _vhf = 0;

Plot1(_vhf, "VHF");

由於這個指標的計算方式是這麼來的,所以它的值主要是受分子與分母的影響而在以下的情況時,會有較大的波動

1。當這段時間的新高或新低改變時,不管是創新高,還是創新低,VHF的分子都會變大。

2。 當股價變動突然變劇烈,這時分母變大,VHF會急遽變小

當股價陷入盤整時,由於分子跟分母都會變小,所以VHF就不會有很大的變大。

因此,當我們把DMI跟VHF兩個指標拿來一起看時,它的原則就是: 當DMI出現交易訊號時,如果VHF有明顯的波動,那麼這個訊號可信度較高,相反地,如果DMI出現交易訊號,而VHF沒有明顯變化,那麼這個盤還是盤整的機率比較大。

下圖是加權指數過去一陣子與這兩個指標的對照圖

040601

大家不妨對照一下看看是否加了VHF之後的DMI,對於大盤的真正轉折點更能有效的呈現出來。

下圖是現在這兩個指標與大盤之間的關係,敬供參考。

040602