Author Archives: 發財橘子

那一年,我們一起尋找的超跌股。

這幾日,有一檔股票走勢頗強勁,但從損益表來看,這根本就是一家沒啥前途的公司,但如果從資產負債表來看,感覺這是一家股價遠低於其變現價值的公司,於是,我寫了一個選股的腳本,把有類似這樣情況的公司通通找出來,這家公司叫做矽統,這類的公司,其特點就是市值遠低於帳上扣掉負債後,容易變現的資產。

故事的起頭是,前幾天,我用一個策略雷達挑出了矽統這檔股票。

101602

我看這家公司的損益表,直覺是這家公司基本沒救了。

因為這家公司股本61億,結果一個月營收很久以來都沒有超過3000萬,因此,每年本業總要虧個2到3億。

因為我真的很少看到這種營收比營業費用還小的公司,所以一開始我是覺得這樣的公司下市收掉算了。

但後來又想,這兩天在買股票的人應該也不是傻子,所以我把它的資產負債表拿出來看,一看就看出一些還蠻有趣的地方

101603

上面是它的流動資產及長期投資,其中帳上有13億的現金,至於47億的長期投資,如果我們看他的轉投資,就會發現,聯電這檔股票就佔了41億。

101604

也就是說,這家公司61億的資本額,其中光現金及聯電的股票就值54億。

接下來我們再看一下它的固定資產

101605

帳上是列了7.8億,其中土地就列了4.76億,我看了一下該公司的網站,再用google map的街景圖,找到了它的固定資產應該就是下面這棟位於竹科的廠辦

101606

這顯示它的固定資產應該值帳上列的這個錢。

看完了資產我們來看它的負債

101607

這家公司竟然是一家幾乎無負債的公司,短期借款是零,長期負債也是零。

看到這裡,我們來算一下,它這一波最低跌到4.41 元,以它的股本61億來算,在這種價位附近真的把它買下來,等於花30億買到54億的現金+聯電股票,外加一棟位於竹科的廠辦。

難怪它的股價會很快的就回到五元以上。

這種公司我要是早點找到,這趟反彈就押上去了。這次就算了,下次如果它再跌下來我就知道該怎麼做。

不過因為研究過矽統這檔股票,所以我很好奇這市場上還有沒有矽統第二,所以我就寫了以下這個腳本

input:percent(20);
setinputname(1,"每股易變現資產與股價間的落差比");
value1=GetField("現金及約當現金","Q");//百萬;
value2=GetField("短期投資","Q");//百萬
value3=GetField("應收帳款及票據","Q");//百萬
value4=GetField("長期投資","Q");//百萬
value5=GetField("負債總額","Q");//百萬
value6=GetField("最新股本");//單位: 億
value7=(value1+value2+value3+value4-value5)/(value6*10);
if value7>close*(1+percent/100)
then ret=1;
outputfield1(value7);
setoutputname1("每股快速變現價值");
outputfield2(close/value7);
setoutputname2("股價與快速變現價值");

根據上述的算法,我試著找出股價跟每股快速變現價值差距超過兩成的股票

附圖就是我挑到的股票,有興趣的朋友,不妨也一檔一檔找找看這當中有沒有便宜的太過份的股票。

101601

要先說明的是,這個名單只是初步篩選的結果,能不能真的下去買,還得一檔一檔下去仔細分析才行。

我以藍天為例,這家公司的股本是68億,現金,短期投資加應收帳款有61億,負債66億,但它的長期投資帳上是910億,說穿了,藍天這家公司到底值多少錢,就看這900多億的長期投資值多少錢?

101608

可惜藍天的轉投資主要都是海外的控股公司,像這種的我們就無從查出這裡頭到底真正值多少錢,我們拿來分析矽統的方法,也就不合適拿來套在藍天上面。

 

在使用這個方法時,有幾個眉角還是要跟大家交代一下

1.短投資裡,如果是上市櫃公司佔多數那還好,不過也要考慮流動性,但如果轉投資裡都是一堆未上市或投資公司,那就得還要再花精神研究這些東西會不會其實已經變成壁紙

2.固定資產我們沒有拿進來算,因為變現不容易,不過如果是位於市區的辦公大樓,其實也可以考慮進去。

3.在挑這一類股價跌過頭的股票時,一定要留意公司經營者的誠信,帳上現金再多,如果經營者是屬於惡搞型的,那也可能兩三下就五鬼搬運光了。

4.這類的公司如果有要減資或是被人借殼,反而股價會比較有表現的機會。

 

xqlite banner

私房交易策略之強勢股整理結束

以前寫情書的時候,我們常說: 妳的過去我來不及參與,但妳的未來一定有我。

作為一個操作者,我們對那些來不及上車的強勢股,也往往有這樣的心情,

這樣的心情,如果用波浪理論來解釋,那就是在初昇段來不及參與之後,希望在主昇段發動前夕,來得及坐上車。

101701

為了尋找這一類的股票,我試著寫一個腳本,這個腳本有三個步驟

1.尋找特定日期以來漲幅最大,走勢最強的股票

2.這樣的股票,從這段時間以來的最高點到前一日的收盤,已修正一定的幅度

3.今天盤中該個股明顯走強。

在要寫這個腳本時,首先得先找出某特定日到最新的收盤價,一共是幾根Bar。

公司同仁寫了一個函數來做這件事,他把這個函數稱之為

getbaroffset

 

這個函數的腳本如下:

Input: target(numeric);

if barfreq <> "D" AND barfreq <> "W" AND barfreq <> "M" then raiseruntimeerror("只支援日/週/月頻率");

variable: i(0);
variable: target_ym(0), date_ym(0);

if barfreq = "D" then
begin
 if target >= date then
 begin
 GetBarOffset = 0;
 return;
 end;
 i = 1;
 GetBarOffset = 1;
 while i < currentbar
 begin
 if date[i] <= target then return;
 i = i + 1; 
 GetBarOffset = GetBarOffset + 1;
 end;
end;

if barfreq = "W" then
begin 
 target_ym = year(target) * 100 + weekofyear(target);
 if dayofweek(target) = 0 then target_ym = target_ym - 1;
 
 GetBarOffset = 0;
 i = 0;
 while i < currentbar
 begin
 date_ym = year(date[i]) * 100 + weekofyear(date[i]);
 if dayofweek(date[i]) = 0 then date_ym = date_ym - 1;
 
 if date_ym <= target_ym then return;
 i = i + 1;
 GetBarOffset = GetBarOffset + 1;
 end; 
end;

if barfreq = "M" then
begin
 target_ym = year(target) * 100 + month(target);
 
 GetBarOffset = 0;
 i = 0;
 while i < currentbar
 begin
 date_ym = year(date[i]) * 100 + month(date[i]);
 
 if date_ym <= target_ym then return;
 i = i + 1;
 GetBarOffset = GetBarOffset + 1;
 end; 
end;

這個函數是只要輸入一個日期,就會回傳從現在到該特定日期共隔了幾根Bar。

如果今天是2015年10月15日,那如果我們寫value1=getbaroffset(20151014);

那代表是前一根bar,所以value1=1;

有了這個函數,我就來寫出上面所提到的這個腳本

input: stardate(20150824);
input:ratio(30);
input:ratio1(7);
input:ratio2(2);
setinputname(1,"輸入上漲起始日");
setinputname(2,"輸入上漲最低幅度");
setinputname(3,"輸入最小拉回幅度");
setinputname(4,"今日最低漲幅");
value1=getbaroffset(stardate);//找出輸入的日期是在第幾根bar
value2=highest(high[1],value1+1);//找出這一波的最高點

condition1=false;
condition2=false;

if value2>=close[value1]*(1+ratio/100)//計算波段漲幅有沒有符合要求
then condition1=true;

if value2>=close[1]*(1+ratio1/100)//計算拉回的幅度夠不夠要求
then condition2=true;

if nthhighestbar(1,high,10)>=5//從最高點到今天超過五根bar
then begin
if condition1 and condition2 and close>=close[1]*(1+ratio2/100)
then ret=1;
end;

在解釋這個腳本之前,我們先來看一下大盤最近的走勢

101702

 

所以我上面寫的這個腳本,就是找出符合下面四個條件的股票

1.從8/24日以來,到最高點漲幅超過30%的股票

2.從最高點到前一個交易日的低點修正幅度超過7%

3.今天收盤比前一天收盤漲超過2%

4.從高點拉回整理超過五天。

這樣的腳本要尋找的,就是整理結束後的強勢股。

下面這張圖就是這個腳本今天跑出來的股票

101501

 

當然不是每檔股票都會在初昇段之後就一定有主昇段,也不見得每檔股票都是休息了幾天後就開始再往上攻,不過這個策略的好處是,對於那些從特定日期以來走勢很強的股票,一旦整理結束,我們在第一時間就會收到電腦的通知,這樣的好處是我不必一直盯著強勢股等拉回結束。

這個腳本可以名列我的私房腳本第二名,介紹給大家,至於日期及漲幅,拉回幅度,這些參數就請大家自己調整囉!

 

 

xqlite banner

私房交易策略介紹之旱地拔葱

先跟大家分享幾檔股票這幾天的走勢。

101706 101704 101705 101703 101702

眼尖的各位,從上面這幾張圖可以發現,一段時間量縮橫向整理後的中長紅,後市往往還有高點。

是的,這是自從我開始從事程式交易以來,最靠譜的交易策略

這個策略有三個原則

1.超過十個交易日股價橫向整理

2.在整理期間成交量明顯萎縮

3.以中長紅的姿態突破整理

4.突破時帶著比先前多出不少的成交量

過去為了找到這樣的股票,我曾經寫過也用過幾個策略

例如我常推薦大家使用的多次到頂而破策略雷達

input:HitTimes(3); setinputname(1,"設定觸頂次數");
input:RangeRatio(1); setinputname(2,"設定頭部區範圍寬度%");
input:Length(20); setinputname(3,"計算期數");

variable: theHigh(0); theHigh = Highest(High[1],Length); //找到過去其間的最高點
variable: HighLowerBound(0); HighLowerBound = theHigh *(100-RangeRatio)/100; // 設為瓶頸區間上界
variable: TouchRangeTimes(0); //期間中進入瓶頸區間的低點次數,每跟K棒要歸0

//回算在此區間中 進去瓶頸區的次數
TouchRangeTimes = CountIF(High[1] > HighLowerBound, Length);

if TouchRangeTimes >= HitTimes and ( q_ask> theHigh or close > theHigh) then ret=1;

要使用這個策略,可以直接在雲端策略中心中訂閱多次到頂突破這個策略即可

101707

訂閱後每天可以從警示中心這一頁盤中即時跳出符合這個策略的股票

101708

這個腳本的最大問題是只考慮價沒有考慮量,而且只考慮向上突破而沒有考慮先有是否有量縮盤整。

後來我有寫過另一個叫股票箱突破的策略雷達

腳本如下:

input:length(12);
value1=NthHighest(1,high,length);
value3=nthhighest(3,high,length);
value4=Nthlowest(1,low,length);
value5=nthlowest(3,low,length);

if
value1[1]<=1.03*value3[1]
and value5[1]<=value4[1]*1.03
and value1[1]<=value4[1]*1.1
and close>value1[1]
then ret=1;

這個腳本昨天出現訊號的股票如下圖

101709

大家不妨參考對照未來的走勢。

除了上述兩個腳本之外,各位也可以根據上面的那四個定義,另外再寫出一個符合上述邏輯的策略,我覺得只要follow這四個精神,應該可以找到短多的股票,而且,勝率真的夠高。

這個交易策略背後的邏輯是,當股價脫離原先的盤整區域,代表原來的多空平衡已被破壞,一根中長紅代表的是多方正式撃潰空方的最後防線,接下來就是長驅直入了,我們在這時候進場,圖的就是這種空頭全面潰敗,多頭乘勝追擊追撃的過程,這個過程很重要的是

1.要一確定中長紅就跟進去。

2.最好挑那種對峙很久的,這種一被撃潰就後防空虛,多頭可以一路追撃。

3.最好上面沒有太多解套賣壓的。

根據上述這三個原則,各位可以把這個策略的腳本改寫的更精準。

 

 

xqlite banner

 

趨勢檢定器

我們透過技術分析指標建構交易策略時,最大的困難在於,當趨勢指標通知我們出現買進訊號時,往往只是盤整過程中的一次假的警報。

我們以移動平均線出現黃金交叉為例,當短天期移動平均突破長天期移動平均時,僅能代表近日的股價走勢平均下來終於高於比較長期的平均值,並不代表接下來股價就會出現明顯的漲勢。

這樣的情況讓我們在透過趨勢指標撰寫交易策略時,往往會有買進訊號過多,過濫的情況,如果我們把這樣的策略直接拿下去交易,極可能繳了大量的手續費及交易稅,而沒有賺到什麼錢。

於是,我們試著從歷史的經驗中,尋找當一檔股票出現明顯的波動方向時,往往伴隨著什麼樣的跡象,然後看看這些跡象,在趨勢指標出現買進訊號時,有沒有同步出現,如果有,代表這個趨勢改變的訊號,成功的機率大增。

我們可以試著把這些跡象集合起來,然後做出一個趨勢檢定器,用這個檢定器來過濾那些可能的假訊號。

例如老市場常說,當MACD黃金交叉時,如果伴隨著成交量突破10日均量,那就代表趨勢是真的,這裡的成交量突破10日均量,就是一個趨勢檢定器。

趨勢檢定器

這些年從我累積的看盤經驗裡,通常當一檔股票技術指標如果出現買進訊號時,我會同步check以下幾件事,然後再來判斷這個訊號是不是玩真的

1.總成交筆數有沒有增加?  有就代表交投變熱絡了,表示市場參與者變多了。

2.佔全市場總成交量的比重是不是在增加?  有增加才代表不是因為盤好才出量。

3.外盤的佔比是否增加? 外盤代表的是追價的意願,追價意願提高是上漲的重要動力。

4.主力是否買超?  籌碼被收集而不是被發散,是行情啟動的基本要件

5.波動幅度是否變大? 一灘死水的突破通常是假突破。

6.開盤委買有沒有增加? 如果增加代表新的買盤在進駐中。

於是我寫了一個腳本,在這腳本中我應用上面的這六個面象,做出一個計分器,如果每個面象近兩個交易日有任一天有明顯比以往平均值突出的數字,就加一分,然後如果總得分超過4分,代表通過這個趨勢檢定器的檢定。

input:Length(10);

input:ratio(20);
input:cn(4);

setinputname(1,"移動平均天數");
setinputname(2,"超出均值比率");
setinputname(3,"最低符合條件數");
variable:count(0);
value1=GetField("總成交次數","D");
value2=GetField("佔全市場成交量比","D");
value3=GetField("內外盤比","D");
value4=GetField("外盤均量","D");
value5=GetField("主力買賣超張數","D");
value6=GetField("真實範圍波幅","D");
value7=GetField("開盤委買","D");
count=0;
if countif(value1 >=average(value1,length)*(1+ratio/100),2)>0
then count=count+1;

if countif(value2 >=average(value2,length)*(1+ratio/100),2)>0
then count=count+1;

if countif(value3 >=average(value3,length)*(1+ratio/100),2)>0
then count=count+1;

if countif(value4 >=average(value4,length)*(1+ratio/100),2)>0
then count=count+1;

if countif(value5>0,2)>0
then count=count+1;

if countif(value6 >=average(value6,length)*(1+ratio/100),2)>0
then count=count+1;

if countif(value7 >=average(value7,length)*(1+ratio/100),2)>0
then count=count+1;

if countif(volume >=average(volume,length)*(1+ratio/100),3)>0
then count=count+1;

if count>cn
then ret=1;

outputfield1(count);
setoutputname1("檢定值");

透過這個檢定器,我們可以過濾掉不少的假買進訊號

舉個例子

如果我們用昨天的收盤價來跑以下這個腳本

input:Length(20); //"計算期間"

LinearReg(close, Length, 0, value1, value2, value3, value4);
//做收盤價20天線性回歸
{value1:斜率,value4:預期值}
value5=rsquare(close,value4,20);//算收盤價與線性回歸值的R平方
if value1>0 and value5>0.2
then ret=1;

這個腳本跑出來的股票是屬於那種近20天股價呈現上昇趨勢的股票,結果符合上述腳本條件的股票共有286檔,這286檔今天盤中在平盤以上的共有128檔。

但如果加了趨勢檢定器,就如下圖,符合兩個條件的只剩109檔

101301

 

而這109檔今天在大盤下跌46點時,還維持在平盤上的,有69檔。

我們在寫趨勢型策略時,最怕的就是把no trend的歸成up trend,今天跟大家介紹這個趨勢檢查表,大家可以根據自己的經驗,調整內容,把那些no trend的通通都濾掉。

 

xqlite banner

從月線與季線看台股當前的漲昇架構

台股能不能繼續漲? 如果可以,會是什麼股票領漲?

要回答這個問題,我們先來對市場的多空架構做個定義

101205

 

如果根據這樣的定義,那麼加權指數已經即將正式翻多

101204

如果從細產業來看,我們會發現,這當中塑化原料及不鏽鋼兩大族群是衝的最快的兩類產業,他們的指數分別在九月中旬及下旬就領先翻多。

101201

101203

 

為了很快的了解到底目前有那些股票位於這六階段不同的位置,我寫了一個腳本如下: 我特別濾掉那些股價不到10元,成交量不到1000張的股票,

input:status(1);
setinputname(1,"1:復甦期,2:收集期,3:多頭,4:警示期,5:發散期,6:空頭");
variable:m20(0),m60(0),message("0"),userchoice("0");
m20=average(close,20);
m60=average(close,60);
if close > m20 and c< m60 and m20<m60
then message="復甦期"
else
if close > m20 and c> m60 and m20<m60
then message="收集期"
else
if close > m20 and c> m60 and m20 > m60
then message="多頭"
else
if close < m20 and c>m60 and m20>m60
then message="警示期"
else
if close < m20 and c<m60 and m20>m60
then message="發散期"
else
if close < m20 and c<m60 and m20<m60
then message="空頭";

switch(status)
begin
case=1 :
userchoice="復甦期";
case=2 :
userchoice="收集期";
case=3 :
userchoice="多頭";
case=4 :
userchoice="警示期";
case=5 :
userchoice="發散期";
case=6 :
userchoice="空頭";
end;

if message=userchoice
and volume>1000 and close>10
then ret=1;
outputfield1(message);
setoutputname1("今日訊號");
outputfield2(message[1]);
setoutputname2("昨日訊號");
outputfield3(message[2]);
setoutputname3("前日訊號");

根據這個腳本,我選出的多頭的股票如下圖

101207多頭

空頭的股票如下圖

101206空頭

 

我們從多頭及空頭架構的股票,可以發現,受惠於台幣貶值的外銷股,景氣到底的塑化股,以及跌深且旺季到的電子股,目前是處於多頭走勢,金融股,航空股及部份先前比較強的個股則處於空頭走勢。

從這樣的架構來看,台幣續貶力道,電子旺季持續力,美國需求,以及全球景氣循環股的續航力(油價及工業金屬),會是這個盤能持續多頭多久的主要指標。

除了用這一套方法來研判大盤漲昇架構之外,我稍稍更改一下腳本如下:

variable:m20(0),m60(0),message("0") ;
m20=average(close,20);
m60=average(close,60);
if close > m20 and c< m60 and m20<m60
then message="復甦期"
else
if close > m20 and c> m60 and m20<m60
then message="收集期"
else
if close > m20 and c> m60 and m20 > m60
then message="多頭"
else
if close < m20 and c>m60 and m20>m60
then message="警示期"
else
if close < m20 and c<m60 and m20>m60
then message="發散期"
else
if close < m20 and c<m60 and m20<m60
then message="空頭";

if message<>message[1]
and volume>500 and close>10
then ret=1;
outputfield1(message);
setoutputname1("今日訊號");
outputfield2(message[1]);
setoutputname2("昨日訊號");
outputfield3(message[2]);
setoutputname3("前日訊號");

這個腳本可以找出最近一日訊號跟前一日不同的股票,以下幾張圖就是根據上述的腳本跑出來的,有的變好,有的變壞,加減參考囉。

101208

101209

101210

101211

 

 

xqlite banner

自訂指標Step by Step

市場上有非常多的技術指標,學都學不完,但如果大家用的武器都一樣,總覺得很難能夠見人所未見,賺人所未賺,特別是有時候就是會有靈光乍現,電光火石的那一刻,當下如果能把靈感化為交易的策略,這快樂是我輩程式交易者,千金難換之快樂也。 容我舉個例子,跟大家分享這樣的快樂。

 

昨天同事來跟我借K線的書,我聊到其實有不少指標是本著K線的精神發明出來的。 我一直以來的體會是,每一根的K線都是那段時間多空爭戰的痕跡,

100701

以前一根K棒收盤價為基點,所能測到的最高與最低點,就是當日多空雙方角力的最大範圍,在技術分析上我們稱之為真實區間

100702

那麼在這樣的多空角力區間裡,我們怎麼知道多方與空方的力道各是多大呢?
我們常用的DMI指標,他的發明者是這麼計算的
071003

他認為如果今天的高點比前一天高點多出來的部份就是正的向上力量,今天的低點比前一天低點低的部份就是向下的力量。

然後它拿這兩股力量去相比,那邊強,另一邊就只能以零計算,然後再去跟這樣的力量跟真實區間相除,看向上的力量佔真實波動區間的比例是多少

// 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);

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;

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的計算過程

 

但我對這個指標有個想法,每天都有向上的力量跟向下的力量,不能因為其中一股力量大於另一股,就把另一邊計算為零,兩邊的力量應該要都被計算到,然後看那一邊的力量比較大

所以我就寫了以下的腳本:

input:sd(5);
input:ld(20);

setinputname(1,"短天期");
setinputname(2,"長天期");

variable:h1(0),l1(0),nf(0),snf(0),lnf(0),dd(0);

H1=HIGH-HIGH[1];
L1=LOW-LOW[1];

if truerange<>0
then
begin
NF=(H1+L1)/truerange;
SNF=average(NF,sd);
lnf=average(nf,ld);
dd=snf-lnf;
end;
plot1(dd,"多空淨力");

我去計算一檔股票每天多空角力的差距,佔真實波動區間的比重,然後看看短天期平均跟長天期平均之間的差。

以下這張圖就是我拿這個指標來畫在加權指數上的對應圖

100901

 

這樣的指標,比起K線圖,更清楚地可以判斷現在是該站在多方還是空方。

上述的過程,是一個一步一步發展自訂指標的過程,我們可以透過這樣的過程,逐漸完備我們對一檔股票的多空判斷體系,當我們透過一連串自訂的指標來研判一檔股票的多空方向時,其實就像是透過多樣的儀器來做身體檢查,當我們發展出愈多愈觀察細微的健康檢查儀器,我們對於一檔股票的多空方向,就會有更高的掌握度。

以上是這些日子以來,我使用XS發展各種自訂指標的小小心得

野人獻曝,祝大家找到自己的股票多空檢查體系。

 

 

 

紅色供應鍊可能有興趣的股票

最近台股購併風愈來愈烈,日月光收矽品股權,聯發科併立錡,風華收購光頡。

這些被併購的公司都有不小的溢價,如果我們能夠事先預知那些公司會被合併,那就美呆了。

可惜我們不是007,也沒有水晶球,所以我們只能用猜的,猜對了,就是中樂透,猜錯了,只要大盤還OK,個股沒急跌,那麼風險也有限。

怎麼猜呢?

我觀察這些被購併的公司,都是屬於董監持股不高且獲利穩定的公司,這些公司就像是漂亮的小姐深夜獨自行走於無人的暗巷之中,比較容易吸引他人的非份之想。

以矽品為例,如下圖,林文伯先生的持股比例才2.91%,整體董監事的持股比例才5%

1007010

但過往 10年,矽品每年EPS都超過1.5元。

100702

根據這樣的觀察,我寫了一個腳本,專門找那些董監持股比例低,集保庫存比例高的公司,這些公司就是那種比較容易被他人下手的標的。

//大股東持股不高
//集保比例很高
input:r1(15),r2(80);
setinputname(1,"董監持股比例");
setinputname(2,"集保比例");

value1=GetField("董監持股佔股本比例","D");
value2=GetField("集保張數佔發行張數百分比","W");

if value1<r1 and value2>=r2 //董監持股比例小於15%且集保比例高於八成
then ret=1;

我把這個腳本的名字稱為”容易被別人介入的股票

然後我把這個腳本加入其他的條件式選股,完成一個選股策略如下

100703

在這個策略裡,要挑的股票除了符合上述的條件外,市值不能太大,股價不能太貴,過去五年有賺錢。

符合上面條件的股票目前台股有兩百多檔,所以我加上一條近三日主力買超超過100張,因為我相信雞蛋再密也有縫,預知春江水將暖的鴨子一定會有。

以下是我用這些條件今天篩選出來的股票

100704

 

我相信隨著大環境的變化,產業裡的合緃連橫會愈來愈普遍,透過這樣的選股法,我們可以了解市場有那些公司奇貨可居,至於是不是真的出現有緣人,我們再從籌碼面的變化去判斷。

祝大家都有機會中到小樂透,大樂透。

xqlite banner

布林通道的奧義

朋友寄來他看到的找股心法,希望我寫成自動交易的程式給他用,他看來的心法共有三個規則如下:

  1. 20日均線上彎 (代表中線上股價是走高的)
  2. 布林通道缺口上下打開
  3. 股價漲超過上通道已經第二天了

他說這三個規則是他看文章時抄下來的,寫的人說這是勝率很高的交易策略。

我仔細地研究這三條規則,我想這個策略是要尋找那些先前盤整,現在漲勢很明確的股票。

怎麼說呢?

我們來看看布林通道的公式:

Input: price(numericseries), length(numericsimple), _band(numericsimple);

BollingerBand = Average(price, length) + _band * StandardDev(price, length, 1);

根據上述的公式,我們可以看得出來,布林通道的的值是股價的移動平均線再加上N個股價的標準差。

我們先來看一下標準差的公式:

input: thePrice(numericseries), Length(numericsimple), DataType(numericsimple);

Value1 = VariancePS(thePrice, Length, DataType);
if Value1 > 0 then
StandardDev = SquareRoot(Value1)
else
StandardDev = 0;

從上面這個公式我們可以看得出來,標準差是變異數的開根號

那什麼又是變異數呢?

input: thePrice(numericseries), Length(numericsimple), DataType(numericsimple);

variable: Period(0), sum(0), avg(0);

VariancePS = 0;
Period = Iff(DataType = 1, Length, Length - 1);
if Period > 0 then
begin
avg = Average(thePrice, Length);
sum = 0;
for Value1 = 0 to Length - 1
begin
sum = sum + Square(thePrice[Value1] - avg);
end;
VariancePS = sum / Period;
end;

從上面這個公式,我們可以看得出來,變異數是每一個價位跟平均價的差的平方之總和。

我們用一張圖來表達上述的意思

100602

根據這個公式,變異數就是把每一點到平均線的差的平方加總起來除以計算天數,這個數字愈大,代表股價的波動愈大。標準差則是把標準差開根號,統計學上教我們,如果股價的波動是屬於一種常態分配,那麼股價的波動範圍,有超過95%的機率會在正負兩個標準差之內。

100601

而布林值的概念就是代表如果股價是呈現常態分配,那就有95%以上的機率,股價會在這個通道裡頭波動。

了解布林值的概念之後,我們來看上面的三個選股原則

我們會發現,如果布林通道缺口(上通道與下通道的距離)上下打開,那就代表標準差從很小變大,根據上面的公式,這種情況代表

1.先前股價的波動很小

2.這幾日波動變大了。

而20日均線上彎則代表短線上股價是上漲的,至於股價漲超過上通道已經第二天了,則代表這次的上漲是玩真的,才能出現黑天鵝現象。

所以根據這樣的思維,我寫了以下的腳本送給我朋友

input:length(20);
variable:up1(0),down1(0),mid1(0),bbandwidth(0);
up1 = bollingerband(Close, Length, 2);
down1 = bollingerband(Close, Length, -2);
mid1 = (up1 + down1) / 2;

bbandwidth = 100 * (up1 - down1) / mid1;
if bbandwidth crosses above 5 and close > up1 and close> up1[1]
and average(close,20)>average(close,20)[1]
then ret=1;

這個腳本符合他的這三個選股原則

以下的股票就是昨天符合這三個選股原則選出來的股票,今天盤中的股價表現

100603

 

我們可以發現,是有股票漲的很兇猛,但短線勝率其實並沒有特別的突出,不過如果拉長來看,這種股票如果出現在長期下跌之後,往往是一種空頭翻多頭的反轉訊號。

我的觀察是,根據這個方法選出來的股票,基本上都是屬於盤整後有點上漲的股票,但這些股票,有些其實屬於假突破,股價還在盤整格局中,如果因為這個策略而跳下去買,反而容易追到高點。

那要如何分辨那些是假突破呢?

我的觀察點有幾個

1.量有沒有放大?有放大代表人氣真的有流進來

2.先前的整理夠不夠久。上通道與下通道走窄的時間夠不夠近且平

以上是我對最近頗熱心的布林通道的一些觀察,大家不妨在程式上加些價量的濾網,可以更精準也挑到會漲的股票,祝大家長期穩定也操作順利

 

以下也是相關的文章,供大家參考

 https://www.xq.com.tw/xstrader/%E5%B8%83%E6%9E%97%E9%80%9A%E9%81%93%E6%8C%87%E6%A8%99/

https://www.xq.com.tw/xstrader/%EF%BC%85b%E6%8C%87%E6%A8%99/

xqlite banner

 

月營收推估的低本益比股

1600多檔的股票,我們如何很快的了解最新月營收的意義? 如何判讀這最新數字對於股價的影響程度?   有一個方法,可以達到快篩的效果。

這個方法就是假設未來十二個月的營收都跟最新公佈的月營收一樣,毛利率與營業費用也都不變的情況下,這家公司的未來12個月EPS會是多少? 如果以合理的本益比來推估,其目標價會是多少? 然後拿目標價跟現在的股價相比,未來如果完全反應的話,其預期報酬率會是多少?

上述的邏輯,我以下面這張圖來表示:

100301

根據這個邏輯,我寫了以下的這個腳本:

value1=GetField("月營收","M");//單位:億元

value3=GetField("本期稅後淨利","Q");//單位百萬
value4=GetField("營業利益率","Q");
value5=GetField("最新股本");//單位:億元
condition1=false;
condition2=false;
input:peraito(12,"預估本益比上限");
if value5<>0
then
value6=(value1*value4*12)/(value5*100)*10;//單月營收推估的本業EPS
if value6<>0
then 
value7=close/value6;

if value7<peraito and value7>0
and value3>200

then ret=1;
outputfield(1,value7,2,"推估本益比");
outputfield(2,value6,2,"EPS");
outputfield(3,value1,2,"月營收");
outputfield(4,value4,2,"營業利益率");
outputfield(5,value5,2,"最新股本");


根據上面這個腳本,我們在XS選股中心,選出符合上述條件的股票,

這個腳本的好處是,我們可以很快的用最新月營收去快篩一次1500多檔股票,然後找出符合條件的股票,然後再去了解其營收的動能是短期現象還是可以持續,若是可以持續甚至會更好,那就是我們要長期追蹤的標的了。

在選股機器人的選股策略裡,除了得符合上述的腳本條件之外,另外還設了營收月增率超過5%及單日成交量超過1000張這兩個條件。

 

 

xqlite banner

為自己的觀察名單標上交易訊號

我有一份觀察名單,在這個名單裡的股票,是我想要”找點買”的股票,這些股票有些是朋友報我的,有些是我自己研究後的心得,但什麼時候才是對的買點?這是一門大學問,特別是開盤時間裡不一定有空看盤,而且人生苦短,每天下班累的半死還要一直作功課,都讓我一直想辦法看看電腦能不能幫我更多的忙,最好是每天電腦自動幫我列出所有我觀察名單中的股票,有那些出現買進訊號?有那些還要觀望?有那些超跌了要開始留意? 我手上的持股,那些過熱了要開始留意賣點? 那些該賣出了? 這樣一來我每天只要回家花個五分鐘看一遍,就可以留單了。

以下是我做的小小實驗,透過XS選股,每天做出一份我觀察名單的交易訊號清單。

步驟一是先訂好交易訊號的依據。

例如我想用多空分數這個指標來做交易訊號的依據

我的規則是

1.當多空分數從5以下突破5代表”買進”訊號

2.當多空分數突破5之後,一直在五日均線之上,代表”持有”訊號

3.當多空分數突破10,代表” 過熱”

4.當多空分數跌破10,代表”賣出”

5.當多空分數跌破10之後且一直在五日均線之下,代表”觀望”

6.當多空分數跌破5,代表”超賣”

就像下面這張圖

100102

 

如果我們拿台積電當例子,大家可以從下面這張圖看出多空分數與台積電股價的對應關係
100101

 

大家如果對於多空分數很陌生,我把腳本再貼一次

// 利用多種指標, 計算多空分數
//
variable: count(0);

// 每次計算都要reset
count = 0;

//------------------ Arron指標 -------------------//
variable: arron_up(0),arron_down(0),arron_oscillator(0);//arron oscillator
arron_up=(25-nthhighestbar(1,high,25))/25*100;
arron_down=(25-nthlowestbar(1,low,25))/25*100;
arron_oscillator=arron_up-arron_down;
if arron_up > arron_down and arron_up > 70 and arron_oscillator > 50
then count=count+1;

//------------------ 隨機漫步指標 ---------------//
variable: RWIH(0),RWIL(0);
value1 = standarddev(close,10,1);
value2 = average(truerange,10);
if value1 <> 0 and value2 <> 0 then
begin
RWIH=(high-low[9])/value2*value1;
RWIL=(high[9]-low)/value2*value1;
end;

if RWIH > RWIL
then count=count+1;

//------------------ 順勢指標 -------------------//
variable:bp1(0),abp1(0);
if truerange <> 0 then
bp1=(close-close[1])/truerange*100;//順勢指標

abp1=average(bp1,10);
if abp1 > 0
then count=count+1;

//---------- CMO錢德動量擺動指標 ----------------//
variable:SU(0),SD(0),CMO1(0), SUSUM(0), SDSUM(0);

if close >= close[1] then
SU=CLOSE-CLOSE[1]+SU[1]
else
SU=SU[1];

if close < close[1] then
SD=CLOSE[1]-CLOSE+SD[1]
else
SD=SD[1];

SUSUM = summation(SU,9);
SDSUM = summation(sd,9);
if (SUSUM+SDSUM) <> 0 then
cmo1=(SUSUM-SDSUM)/(SUSUM+SDSUM)*100;

if linearregslope(cmo1,5) > 0
then count=count+1;

//------------------ RSI指標 -------------------//
variable: rsiShort(0), rsiLong(0);
rsiShort=rsi(close,5);
rsiLong=rsi(close,10);
if rsiShort > rsiLong and rsiShort < 90
then count=count+1;

//----------------- MACD指標 -------------------//
variable: Dif_val(0), MACD_val(0), Osc_val(0);
MACD(Close, 12, 26, 9, Dif_val, MACD_val, Osc_val);
if osc_val > 0
then count=count+1;

//----------------- MTM指標 -------------------//
if mtm(10) > 0
then count=count+1;

//----------------- KD指標 --------------------//
variable:rsv1(0),k1(0),d1(0);
stochastic(9,3,3,rsv1,k1,d1);
if k1 > d1 and k1 < 80
then count=count+1;

//----------------- DMI指標 -------------------//
variable:pdi_value(0),ndi_value(0),adx_value(0);
DirectionMovement(14,pdi_value,ndi_value,adx_value);
if pdi_value > ndi_value
then count=count+1;

//----------------- AR指標 -------------------//
variable: arValue(0);
arValue = ar(26);
if linearregslope(arValue,5) > 0
then count=count+1;

//----------------- ACC指標 -----------------//
if acc(10) > 0
then count=count+1;

//----------------- TRIX指標 ----------------//
if trix(close,9) > trix(close,15)
then count=count+1;

//----------------- SAR指標 ----------------//
if close > SAR(0.02, 0.02, 0.2)
then count=count+1;

//----------------- 均線指標 ----------------//
if average(close,5) > average(close,12)
then count=count+1;

// Return value
//
TechScore = count;

它其實代表的是在14個具代表性指標中有多少個指標目前是處於多頭狀態中。

 

 

定義好交易訊號之後,我們就可以根據這個標準來寫選股的腳本

這邊我們得先跟大家報告一下這種根據不同情況給不同交易訊號的腳本,在撰寫時,基本架構如下圖

100103

以下是一個撰寫這種依不同狀況,多輸出結果的腳本樣本
100104

如果要看完整的說明,請參考以下的連結

http://xshelp.xq.com.tw/xslesson/if..then

根據上述的語法結構,我就寫了多空分數的交易訊號腳本如下:

setoutputname1("多空分數交易訊號");
value1 = techscore();
value2 = average(value1, 10);

Value3 = CountIF(value2 crosses above 5,5);

value4=CountIF(value2 crosses below 10,5);

if value3 >1 then
begin
ret = 1 ;
outputfield1("買進");
end
else
if value2 >5 and value2 >average(value2,5)
then begin
ret=1 ;
outputfield1("持有");
end
else
if value2 >=10
then begin
ret=1 ;
outputfield1("過熱");
end
else
if value4>1
then begin
ret=1;
outputfield1("賣出");
end
else
if value2 >5 and value2 <average(value2,5) then begin
ret=1;
outputfield1("觀望");
end
else
if value2<=5
then begin
ret=1;
outputfield1("超賣");
end;

接下來我就用這個腳本來跑我的觀察名單,其結果如下圖

100105

我把這個選股策略啟動每日自動報行之後,就可以每天看到根據多空分數所跑出來的交易訊號了。

接下來是把除了多空分數之外,其他的交易訊號規則也寫在腳本中,xs的腳本透過兩個語法
來定義選股結果欄位的名稱及欄位呈現的內容

setoutputname1(“多空分數交易訊號”); 代表的是欄位的名稱
outputfield1(“超賣”); 代表的是這個欄位的輸出結果

所以如果有第二個交易訊號的定義時,我們就可以用setoutputname2及outputfield2來呈現,

例如我們可以寫出

setoutputname2("RSI交易訊號");
IF RSI cross over 20
then begin
ret=1;
outputfield2("買進");

end;

這樣我們就可以在選股結果頁出現第二個交易訊號欄位。

透過這樣的方式,我們就可以每天看到我們觀察名單中的股票,根據特定標準,那些該進場,那些該出場了。

這樣一來,是不是可以節省不少時間呢?

 

 

 

xqlite banner