Author Archives: 發財橘子

一條公式選股術的回測報告

鏡週刊這一期介紹了一位教授,他用一條公式來挑股票,每年賺15%,我試著用XS來寫出這個選股公司,分享給大家。

這篇文章的連結如下

連結在此

這位淡江大 土木工程系的葉怡成教授,發展了一個叫GVI(Growth Value Index)的指數,

GVI=(B/P)×(1+ROE)^5

這個指數的意思是用淨值/股價去乘上(1+股東權益報酬率)的5次方,這個數字當然是愈大愈好。

教授認為,可以從市值超過兩百億的股票裡去篩選出GVI排名前20名的公司,然後做成投資組合,之後再根據最新的數據做再配置。

根據這樣的公式,我寫了一個函數的腳本如下

value1=GetField("股價淨值比","D");
value2=GetField("股東權益報酬率","Q");
value3=GetField("總市值(億)","D");
if value3>=200 then 
GVI=1/value1*(1+value2/100)*(1+value2/100)*(1+value2/100)*(1+value2/100)*(1+value2/100)
else GVI=0;

把這個GVI在選股時作為排行的函數

20180910

最新的排行結果如下

20180910

不過這裡要說的是,用這個方式挑股票時,要過濾掉那些因為業外獲利造成的假象,以及ROE正在變差的股票,不然像宏達電,南電這樣的公司也是會被納進來的

所以我就再加上營業利益率要大於零的條件,把腳本重新改寫如下

value1=GetField("股價淨值比","D");
value2=GetField("股東權益報酬率","Q");
value3=GetField("總市值(億)","D");
value4=GetField("營業利益率","Q");
if value3>=200 and value4>0 then 
GVI=1/value1*(1+value2/100)*(1+value2/100)*(1+value2/100)*(1+value2/100)*(1+value2/100)
else GVI=0;

改成這個腳本後挑出來的20檔股票名單如下

2018091001

我把這腳本拿去回測,持有期間是220天,過去10年的回測數據如下:

gvi

年平均投資報酬率有10%,不過倒也不是每年的年報酬率都是正的,大盤不好的時候拉回的幅度也是不小。

我試著把前二十檔改成十檔,回測報告如下

2018091002

勝率及平均年報酬率都增加,只是最大區間虧損還是太大了

 

 

 

籌碼大數據之券商分點特定個股買賣差金額

在籌碼大數據這個功能裡,進階個股籌碼分析中,有一個籌碼分析的功能,在這個功能中,我們透過數據,顯示一段期間內,各種不同勢力對一檔個股的買賣超數據,讓使用者了解籌碼的流向,其中,我們把每個券商分公司針對單一個股的交易金額,分成五個級距,然後把不同級距的買張及賣張作合計,分別呈現不同交易金額的勢力,對該個股的買賣超狀況。

以台積電為例,昨天的多空勢力分析表格如下

2018083002

透過這個表格,我們發現,最近一日,單一分公司交易金額在一億以下的四個級距,都是賣超,但超過一億的分公司,反而是大買超,表示台積電昨天的籌碼是從散戶手裡流向大戶手裡。

我們可以觀察這兩個不同級距長期的買賣超情況如下圖

2018083001

然後我們就會發現,當大戶在賣超而小戶買超時,台積電的股價呈現下跌趨勢,反觀大戶買超而小戶賣超時,台積電便展開其上漲走勢。

這個數據由於每天更新一次,所以我們便可以在第一時間,了解到一檔股票最近一個交易日,籌碼的流動方向,比集保庫存裡的股東結構更及時。

籌碼大數據裡的高手券商的設計理念與應用

在籌碼大數據這個模組中,有一個高手券商的選單,這個功能是想要找出散在各券商分公司的民間高手,然後找到值得追蹤的對象,知道這些股市常勝軍最近在買什麼? 以做為選股時的參考。

高手券商的定義是根據使用者設定的計算期間及交易金額,把券商分公司假設成一個單一的個體,然後把這個分公司在設定期間,符合交易金額以上的,非前100大權值股的交易,都過濾出來,然後去計算這些交易的次數,平均持有天數,勝率及平均報酬率。

以下圖為例,在過去一年,交易金額超過三百萬,且交易標的濾掉前100大權值股之後,全市場勝率最高的券商分公司如下圖

高手券商一

這些券商分點裡都隱藏著真正的高手,單日交易一檔個股的金額可以超過三百萬,且在一整年下來,勝率超過七成。

接下來我們可以根據他們的持有天數,勝率及平均報酬率,找出你想追蹤的券商,把它們存成自訂的券商群組。

做法是在券商名稱按滑鼠右鍵,會有加入自選券商的選項,按下後會跳出如下的視窗

高手券商二

例如我個人喜歡追那些平均持有天數超過十天,且勝率及平均報酬率有一定水準,交易次數適中的券商,我就設了一個券商組合叫波段高手,然後把符合條件的券商都加到波段高手這個券商組合中

這麼一來,我每天在看券商進出股票分析這個功能時,就可以如下圖般,知道波段高手們可能在進出什麼樣的標的了

高手券商三

又或者 ,可以透過高手券商選單中的高手券商股票進出,知道現在這些高手券商在買進什麼標的

高手券商四

不過這裡在應用時要留意,不要去追那些隔日沖型的高手券商,因為當你看到他買超時,可能就是他準備要賣出的時候了。

以上是高手券商的設計理念及應用方式的基本介紹。

 

盤中即時主力的動向怎麼抓?

今天被問到一個好難的問題,網友的問題是:“如何在盤中就找出主力的動向“

我想了一下,跟大家分享一個腳本,這個腳本是我用來嚐試在盤中去監控今天主力可能站在買方或賣方的股票,我寫的腳本如下

if barfreq<>"tick" then raiseruntimeerror("資料頻率請改用tick");
input:valuelowlimit(500,"單筆成交下限,單位萬元");
if q_Last*q_TickVolume/10>valuelowlimit

and q_BidAskFlag=1//外盤成交
then ret=1;

這裡是挑出外盤買進的大單,如果要挑出內盤賣出的大單,則請把

q_BidAskFlag=1改成=-1

接下來我們就把這個警示腳本加進策略雷達
2018062201

記得一定要指定頻率設成tick 我自己會把這個腳本獨立成一個螢幕來監控,所以會設一個自訂的頁面,設法如下 2018062202

先是開啟新頁,選即時監控,然後設定如下 2018062203 然後我另外切一欄放個股分時圖,組出來的畫面如下圖 2018062204以上是我自己在盤中抓主力的方法,我這裡對大單的定義是單筆成交超過500萬,我有把它設成參數,大家可以改成自己對大單的定義金額, 現在由於還不是逐筆撮合,所以單筆成交金額可能要設高一點。 以上大致是我的作法,僅供參考。

籌碼分析中的券商分公司買賣數據目前在XS上的應用

不少XS的使用者提出來希望可以把券商分公司的買賣數據,拿來寫成腳本,例如可以盯住幾個隔日沖特定券商分點的標的,或是盯住幾家法人及代操大戶有在進出的分公司。這部份我們還在研究如果用簡單的語法來解析這些數據,短期內還是無法滿足各位的需求,在此僅能跟大家說聲抱歉。

目前跟券商分公司相關,可以拿來在XS上寫腳本的欄位主要是下圖幾個

2018062001

 

我自己寫的腳本中我覺得還不錯用的,大致有幾個

//跑全部股票 停損停利都是7%

value1=GetField("分公司買進家數");
value2=GetField("分公司賣出家數");
value3=value2-value1;
value4=countif(value3>40,10);
//計算買進家數與賣出家數的差距夠大的天數
if value4>6 
and GetSymbolField("tse.tw","收盤價","D")
>average(GetSymbolField("tse.tw","收盤價","D"),10)
and close[30]>close*1.1

then ret=1;

這個出的股票不多,但勝率不錯,如果想要出多一點訊號,把條件放寬一些也是可以的

 

另外雲 端策略中心裡有個腳本我把它改成下面這個,

// 作多, 持有期別: 20
//
input:period(20);
value1=GetField("分公司賣出家數")[1];
value2=GetField("分公司買進家數")[1]; 
 
 if linearregslope(value1,period)>0
 //賣出的家數愈來愈多
 and linearregslope(value2,period)<0
 //買進的家數愈來愈少 
 and value1>200
 and average(volume,5)>=10000
 
 then ret=1;

雖然勝率不是很突出,但一些飆股會挑到,例如下面這兩檔

2016082002

2016082003

所以我會把挑出來的股票再用其他的盤中sensor去跑,挑出真的要動的股票

再次跟大家說聲抱歉。

 

 

 

移動停利的腳本寫法

有網友問到如何撰寫移動停利的腳本,我以RSI低檔回昇的進場腳本為例,請優秀的同仁寫出對應的停利腳本作為出場腳本,跟大家說明如何用停利腳本來作回測。

首先,RSI低檔回昇的腳本如下

if rsi(close,12) cross over 20
then ret=1;

那麼這個進場腳本的移動停利腳本寫法可以如下

input:ratio(10);
//設定回檔幅度

//用condition1來代表進場的觸發條件
condition1=false;

if rsi(close,12) cross over 20
then condition1=true;

value1=barslast(condition1);
//計算上一次觸發到現在共歷經幾根bar
value2=highest(high,value1);
//計算觸發後到目前為止的最高價

if close*(1+ratio/100)<value2
then condition2=true
else condition2=false;
value3=barslast(condition2);
if value3 cross under value1 then ret=1;
//觸發移動停利

這當中用condition1代表進場的條件,用barslast來計算符合進場條件後至今共有幾根bar,再拿這數字去找出條件成立後的最高點,接下來就是計算最新價跟這最高價之間是否差了一成以上,如果是的話就是出場條件成立。如果股價往上走,這個自觸發後以來的最高價就會一直走高,也就達到移動停利的目的。

接下來就可以把這個腳本加在回測的出場設定中  如下圖

2018061901

這樣就可以在回測中做到移動停利了。

大家可以把自己的進場腳本設為condition1的條件,其餘的,follow這個出場腳本的寫法就可以作出特定進場策略的移動停利腳本了。

 

以週轉率為例,介紹自訂函數及其應用

網友希望可以訂出一個選股條件,這個條件是個股的近五日平均週轉率要高於二十日平均週轉率。

首先,因著週轉率的公式是成交張數除以發行張數,我們可以先自訂一個叫turnoverrate的函數,它的腳本如下

input:period(numericsimple);
value1=GetField("普通股股本","Q")*10000;
value2=average(volume,period);
if value1<>0
then value3=value2/value1*100;
turnoverrate=value3;

要寫自訂函數的眉角有幾個

1.要先確定新增腳本時勾選的是函數腳本

2.一開始命名就要取好函數的名稱,例如我是取turnoverrate

3.在設參數的時候必須宣告參數的資料型態,例如這裡用period來代表計算天期的參數,天期的參數是一個絕對的整數值,所以就用numericsimple。

4.計算出來的週轉率值再用trunoverrate=xx這樣的方式來指定該數值就是函數值

有了這個函數,上述的選股條件就很好寫了

if turnoverrate(5)>turnoverrate(20)
then ret=1;
outputfield(1,turnoverrate(5),1,"5日平均週轉率");
outputfield(2,turnoverrate(20),1,"20日平均週轉率");

用這個條件剛剛挑出來的股票如下圖

2018052301

這樣就可以把週轉率列為選股條件之一了。

 

私房策略分享之獲利穩定公司落難時

之前有跟大家分享過,大跌後的股票,進場抄底勝率較大,我寫了一個60天內跌四成的腳本,拿所有普通股去回測過去五年,停損停利都設兩成,勝率剛好六成,但交易次數多達4176次,平均一年800次,一般人不會這樣交易。

這個腳本如下

input:n(40,"下跌的幅度");
input:period(60,"計算天數");
if close*(1+n/100)<close[period-1]
then ret=1;

這三十年來,我發現上市櫃公司,如果是好公司,就算短期踫到困難,股價大跌,只要給公司時間,往往可以恢復往日榮耀,所以我就寫了個腳本,去尋找那些獲利穩定的公司,找到後再用上個腳本去回測,我發現勝率可以拉到七成七。

我寫的選股腳本如下

value1=GetField("每股稅後淨利(元)","Y");
if trueall(value1>=2,5)//過去五年每年都賺超過兩元
and highest(value1,5)<lowest(value1,5)*1.5//獲利的高低差距在忍受範圍
then ret=1;
outputfield(1,highest(value1,5),1,"最高EPS");
outputfield(2,lowest(value1,5),1,"最低EPS");

用這個腳本最近一期挑出來的股票有100檔,前40檔如附圖

2018052201

我用這個選股法每年選出的股票,去跑上面大跌四成的腳本,結果過去五年一共出現53次進場的機會,其中有41次都可以獲利20%停利出場,只有12次是虧錢出場,虧錢的交易記錄如下

2018052202

我們可以發現,這些失敗的交易主要是出現在2015股票市場大崩盤的時候,另外這些失敗交易的標的,股本大多相對較小,跌起來往往會超跌。

所以我會先用這個方式濾出股票,再仔細檢查這檔股票有沒有止跌的跡像,或是法人介入的情況,然後再進場。

以上是我這幾年用起來比較有心得的策略之一,出的標的不多,但值得每檔好好追蹤。

 

 

 

上漲下跌家數在期指波段交易上的應用

這兩天有網友問我上漲下跌家數如果要拿來做期指選擇權交易時,用幾天期的參數比較合適? 類似這樣的問題,我總會建議大家,回測看看,我常說回測是檢驗策略的唯一道路。 今天我就以上漲下跌家數為策略的核心,舉一個例子來說明我的心路歷程。

一開始我跟大家一樣,會看上漲下跌家數來研判大盤短期方向,後來我就寫了一個指標,這個指標的概念如下

1.先算出每天上漲家數佔所有上漲家數與下跌家數總和的比例

2.把這個比例取五天及20天平均

3.用五天平均去減20天平均

然後把這樣的概念寫成一個畫指標的腳本

input:days1(5,"短天期");
input:days2(20,"長天期");
value1=GetField("上漲家數");
value2=GetField("下跌家數");
value3=value1+value2;
if value3 = 0 then value4 = 0 else value4=value1/value3*100;
value5=average(value4,days1);
value6=average(value4,days2);
value7=value5-value6;
plot1(value7,"上漲下跌家數差指標");

這個腳本畫出來的線與加權指數對照圖如下

2018051701

然後透過觀察這個指標與加權指數的對照圖,我發現當這個指標從零以上轉正時,往往是大盤短線空翻多的時候,所以我就把這指標改成以下的交易策略

input:days1(5,"短天期");
input:days2(20,"長天期");
value1=GetField("上漲家數");
value2=GetField("下跌家數");
value3=value1+value2;
if value3 = 0 then value4 = 0 else value4=value1/value3*100;
value5=average(value4,days1);
value6=average(value4,days2);
value7=value5-value6;

if value7 cross over 0 
then ret=1;

我拿這個腳本去回測過去十二年的加權指數,持有天期只一天,回測報告如下

2018051704

我發現過去十二年裡這樣的概念確實有七成的勝率,但因為持有一天,所以平均報酬率很低,所以就算獲利出場的機率很高,但總報酬率也有限,所以我就把持有天數從一天改成三天,結果平均報酬率變成0.42%,總報酬變成65%,但勝率也降到62.8%。

後來我把持有期間再改成10天,回測報告如下圖

2018051705

勝率又站回七成以上,回測期間改成最近三年,勝率也在七成以上。

用這個例子是要跟大家說明,很多時候,可以實戰的交易策略,往往是經過不斷的改變參數及進出場條件後,慢慢找出來的。

大家不要太拘泥於專家或高手們提出的作法或參數,多測多檢討,祝大家都能找到最適合自己交易風格的策略。

 

 

 

介紹RSV的概念~以華南三把刀為例

網友拿了華南投顧的華南三把刀選股來問我

2018051502

前面兩把刀比較容易理解,至於第三把刀營業利益率指標,我倒是沒有聽過,網友附上公式如下

2018051503

他讓我解說一下這個指標的用法與意義。

根據這個公式,如果最新一季營業利益率創過去八季新高,那麼這個營業利益率指標就會等於100

如果最新一季營業利益率創八季新低,那麼這個指標的值就會是0

有沒有覺得跟什麼指標很像呢?

我們在計算KD值時,會先計算一個未成熟隨機值( Raw Stochastic Value),簡寫為RSV

RSV的公式如下

2018051504

RSV的概念有點像是多空雙方拔河時,以兩邊曾經拉到最接近勝利的兩點距離作為分母,多方目前的位置為分子,這樣可以衡量多方當下的力量強度在什麼刻度。超過五十代表多方佔上風,低於五十代表空方佔上風,類似這樣的概念,除了用在KD指標之外,也會被用在其他地方,我個人在自訂指標時,也不時會用這樣的概念試試看。華南三把刀裡的營業利益率指標大約就是這樣的概念。

我把這指標寫成一個函數,腳本如下

value1=GetField("營業利益率","Q");
value2=highest(value1,8)-lowest(value1,8);
value3=value1-lowest(value1,8);
if value2<>0 then value4=value3/value2*100;
ret=value4;

用這個函數寫成以下的選股腳本

if barfreq<>"Q" then raiseruntimeerror("頻率請用季");

if netprofitrsi cross over 50 
then ret=1;

outputfield(1,netprofitrsi,1,"營業淨利率RSI");
outputfield(2,value1,0,"最新資料日期");

再用這腳本搭配其他兩個選股條件寫了一個三把刀選股策略的複刻版,挑出來的股票如下:

2018051505

至於這個指標要突破多少比較有效,主要是看你要挑什麼股票,成長股當然是愈接近100愈好,轉機股應該是挑這數字突破50的,那一種比較準呢?  回測是檢驗真理的唯一標準,XS下一個版本會支援選股回測,到時候就可以直接拿過往的選股結果看看這三把刀利不利了。