Author Archives: 發財橘子

葛拉罕留下來的投資智慧

昨天看到這篇文章

https://www.hkcompanysearch.com/post/35406920/

看到巴菲特的老師,82歲的葛拉罕接受媒體訪問的中譯文

在訪談中,葛拉罕提出了兩條挑股票的標準

1.總市值低於過去一年獲利的七倍

2.一個公司擁有的應該兩倍於它所欠下的。

我試著寫了一個選股腳本,在台股裡,挑符合這兩個腳本的股票

我寫的腳本如下

value1=GetField("本期稅後淨利","Q")+GetField("本期稅後淨利","Q")[1]
+GetField("本期稅後淨利","Q")[2]+GetField("本期稅後淨利","Q")[3];
//單位:百萬
value2=GetField("負債總額","Q");
value3=GetField("資產總額","Q");
value4=GetField("總市值","D");//單位:億

if value4<value1*7/100
and value3>value2*2
then ret=1;
outputfield(1,value1/100,0,"近四季獲利(億)");
outputfield(2,value1/100*7,0,"獲利的七倍(億)");
outputfield(3,value4,0,"總市值");
outputfield(4,value2,0,"負債");
outputfield(5,value3,0,"資產");

挑出來的股票如下表

100201

 

選股DIY腳本之1:Z日均量低於N而連M日量大於K

坊間選股工具很多,不過可供選擇的選股條件大多老生常談,例如XX 指標黃金交叉之類的,由於大盤最近開始進到小型股常有表現的百家爭鳴階段,接下來幾天想跟大家分享一些很容易寫,可以常常被拿來作為選股條件之一的常用選股腳本,這些腳本可以用OR或AND串在一起,織成一張選股網,找到一些值得進一步研究的小型股。

今天首先跟大家介紹的是最近一段時間沒有啥量,但近N日開始出量的股票。

我寫的選股腳本如下:

input:z(20,"均量計算天期");
input:n(2000,"均量上限");
input:m(2,"近幾日天期數");
input:k(4000,"近幾日量下限");

if average(volume,z)[m-1]<n
and trueall(volume>k,m)
then ret=1;

這個腳本可以找出過去20天的移動平均量都不到2000張,近2日每天都超過4000張的股票,要找小型股的時候,這是一個不錯的方法,例如最近大漲的幾檔小型股,起漲時都符合這樣的條件

2017082901

至於要連續幾天沒有量? 還是量要縮到什麼程度才叫量縮? 要連續幾天出量? 要成交量超過多少才算出量? 我都把它設成參數,讓使用者自己來決定。

未來這一系列介紹的選股腳本,都會是類似這樣,簡單,有多個參數可以調整,使用者只要把它複制到自己的XS選股裡就可以使用了。 如果各位希望DIY出什麼選股策略,也可以留言,我會試著寫出來。

 

 

程式交易在基金投資上的應用之14~突破中長線的糾結均線

糾結均線突破,是市場耳熟能詳的一個交易策略,它的概念是當短中長期持股者的成本都接近時,一旦股價突破,代表空頭完敗,新的力量帶動了多頭行情。把它用在基金操作上,回測的效果也不錯。

糾結均線突破的腳本如下

input: shortlength(10,"短期均線期數");
input: midlength(20,"中期均線期數");
input: Longlength(40,"長期均線期數");
 input: Percent(2,"均線糾結區間%");
input: Volpercent(20,"放量幅度%");//帶量突破的量是超過最長期的均量多少%
variable: shortaverage(0);
variable: midaverage(0);
variable: Longaverage(0);
variable:yearaverage(0);

if volume > average(volume,Longlength) * (1 + volpercent * 0.01)and volume>1000 then
begin
 shortaverage = average(close,shortlength);
 midaverage = average(close,midlength);
 Longaverage = average(close,Longlength);
 
 value2= maxlist(shortaverage,midaverage,Longaverage );
 value3= minlist(shortaverage,midaverage,Longaverage );
 if Close crosses over value2
 and (value2-value3)*100 < Percent*Close 
 and GetSymbolField("tse.tw","收盤價","W")
>average(GetSymbolField("tse.tw","收盤價","W"),13)
 then ret=1;
 
end;

這腳本加了兩個濾網,一個是成交量也要超過均量一定的百分比,另一個則是空頭市場不使用本策略,我用單一國家ETF及全球產業ETF回測,持有20天後出場,回測報告如下

081501

雖然勝率還不到三戰兩勝,但從累計獲利曲線上來看,一直維持著大漲小回的走勢,七年的總交易次數有341次,平均一個月進場機會約四次,是屬於極具可操作性的策略。

程式交易在基金投資上的應用之13~尋找剛轉彎才剛開始加速的市場

在尋找基金波段操作策略時,從賽車來的靈感是,如果剛轉彎後開始加速,根據慣性定律,只要沒有踫到更大的阻礙,車子會開始沿著這個方向飆一陣子。所以如果去尋找跌勢終止,漲勢剛開始加速的市場,應該也是一個可行的方向。根據這個原理,寫出來的腳本,回測的效果不差。

漲勢加速是什麼概念?

就像下面這張圖

漲勢加速

要怎麼在股價從粉紅色變成橘色時被能夠讓電腦通知我們呢? 最簡單的作法就是算出上漲的角度,當角度愈來愈陡時就代表漲勢加速。

angle的說明

上漲的角度怎麼算?

XS裡有個內建函數Angle,它的語法如下:

計算任意二個日期的走勢角度。
回傳數值=Angle(日期1,日期2)
傳入二個參數:
– 第一個參數是日期1。
– 第二個參數是日期2,需大於日期1。

我們來看一下這個函數的語法

input:Date1(numeric),Date2(numeric);
variable:Date1Bar(0),Date2Bar(0),Date1Price(0),Date2Price(0),_Slope(0);
Date1Bar = getbaroffset(date1); Date1Price =Open[Date1Bar];
Date2Bar = getbaroffset(date2); Date2Price =Close[Date2Bar];
if Date1Bar > Date2Bar then
 _Slope = (Date2Price/Date1Price-1)*100 / (Date1Bar-Date2Bar);
Angle = arcTangent(_Slope);

如果用圖形來看,可以參考下圖

從這個算法來看,angle是正的代表上漲,是負的代表下跌,絕對值愈大表示上漲跌的角度愈大,愈接近零代表處於橫向盤整。

接下來就可以把這個函數應用到漲勢加速上

我寫了一個腳本如下

value1=angle(date[7],date);
value2=average(value1,5);
value3=average(value1,20);
if value2[4]<10
and value2[4]>0
and value2>20
and value2<50
and tselsindex(10,6)=1
and value3<10
then ret=1;

這個腳本的概念就是價位從原本的下跌或盤整變成上漲且上漲的角度在變陡中,我拿它來回測加權指數,雖然出現的次數不多,但勝率超過八成

081101

拿這個腳本,把過濾條件改成以下的腳本,

value1=angle(date[7],date);
value2=average(value1,5);
value3=average(value1,20);
if value2[4]<10
and value2[4]>0
and value2>20
and value2<50
and value3<10
and GetSymbolField("tse.tw","收盤價","W")
>average(GetSymbolField("tse.tw","收盤價","W"),13)
then ret=1;

去操作32個全球產業及單一國家ETF,進場後持有四十天,回測的勝率也接近65%。

081102

 

程式交易在基金投資上的應用之12 BBand

BBand這個指標蠻多人愛用,我試著拿來用在基金波段操作上,效果也不錯。

首先還是跟大家介紹BBand的算法,請先看以下的程式碼

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

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

從這兩行code可以了解,bband就是一段區間的移動平均線加上同區間的N個標準差。

接下來就跟大家介紹我寫的波段操作腳本

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

bbandwidth = 100 * (up1 - down1) / mid1;

if bbandwidth crosses above 1 
and GetSymbolField("tse.tw","收盤價","W")
>average(GetSymbolField("tse.tw","收盤價","W"),13)
then ret=1;

這個腳本的概念是在多頭市場當上下Band縮到極致開始放大時,就是波段的進場點。以下圖為例,台灣50在今年四月就出現過這樣的進場訊號。

081001

 

我拿這個腳本去回測我挑出來的32個單一國家及全球型單一產業的ETF,出場點設為進場後20天,回測報告如下

081002

從2010年到現在,共出現103個交易的機會,其中有64次可以獲利出場,最大連續虧損是一成左右,還在可以接受的範圍。

以最近出現訊號的印度為例

081003

BBandwith從底部回升的概念就是在尋找upband與downband之間的差距縮到極致之後的回昇。這種情沿通常是出現在區間修正或盤整結束的時候。

這個交易策略如果能夠輔以更敏銳的出場訊號,應該可以成為更好的交易策略。