Author Archives: 發財橘子

主力與投信共襄盛舉的交易策略

跟投信有關的交易策略有很多,有網友教了我一個,說是多頭市場非常好用,我回測了一下,數字不錯,細想其概念,頗有道理,不敢藏私,跟大家分享。

這位網友觀察到,當投信開始買一檔中小型股時,如果這家公司各投信的持股不多,那就有兩種可能,一種是這檔股票特定投信因為特定原因而進場,但市場沒有共鳴,等到這家投信買完了,行情就結束了,另外一種則是這家公司的基本面有了非常正向的變化,各投信及市場各方勢力一起共襄盛舉,因為大家手上原本可能都沒有籌碼,所以大家都爭著進場,股價就會有一波漲勢。

那要如何判斷市場有沒有共鳴呢? 網友的看法是,如果當日主力買超的張數比投信買超的張數多超過一千張,那就可以代表除了投信之外,市場還有其他人看上這檔股票。

根據這樣的邏輯,我寫了一個腳本如下:

value1=GetField("主力買張");
value2=GetField("投信買張");
value3=GetField("投信買賣超張數");
value4=GetField("投信持股比例");
value5=GetField("股本(億)","D");
if value4<5
//投信持股比例不到5%
and value1>value2+1000
//主力買進張數大於投信買進張數一千張
and value3>1000
//投信買超大於1000張
and value5<50
//股本小於50億
then ret=1;

用這個腳本去回測,為了避免偷看答案,所以進場點是用隔一日的開盤價,回測過去三年的數字如下

雖然勝率不到50%,但三年有252個交易機會,平均一年有超過80次,報酬率達到204%,遠遠打敗大盤的14%,網友有特別交代,這個策略在多頭市場表現會非常好

所以我回測了兩段多頭市場,一個是前兩年

另一個則是最近三個月

然後我們會發現,其實這個策略的勝率就差不多五成左右,但多頭市場會找到飆股,其漲幅足以cover空頭市場的損失

例如下面幾檔是這個策略過去三年跑出來報酬率最高的股票

 

 

 

我們會發現,這類股票在出現訊號前,共同的特徵都是整理過一段時間

於是未來我們用這個策略挑出來的股票,可以觀察之前是否有一段整理期間。

 

以上是網友分享的好想法,我借花獻佛,大家多交流

 

Moneydj固定收益專區上線

隨著中美貿易大戰愈演愈烈,全球景氣陷入衰退的風險愈來愈大,在亂世之中,可以確定的事情是,各國央行愈來愈有降息的壓力,於是,償債能力良好的公司債及特別股,會是不安定的世道中,少數能夠帶來穩定配息,而且有可能會有資本利得的投資商品,Moneydj整合了美元小額投資等級公司債及特別股,成立了Moeneydj固定收益專區,提供給大家一個年配息還有5%上下的投資管道,特別是,一旦景氣往下,收益率可能會更好,也有資本利得的意外之財,不確定的年代,這個專區陪大家一起尋找穩定的收益。

Moneydj固定頻道的位置如下,從www.moneydj.com 網站裡最上方固定收益這四個字點下去

會看到下面的畫面,在這畫面的上方有三個連結,除了特別收益專區之外,也有債券及特別股的入口

而大家如果想要直接從moendy下單買美債或特別股,可以參加人人都是巴菲特方案,按立即開戶,到國證券開戶,這樣就可以享有XQ操盤高手美股版的權限。

在固定收益專裡,最先看到的是不同到期日可以買到的最高收益的商品圖

也可以比較美債與特別股之間的差異

在網站的下方收集了不同到期日根據收益率排序的債券與特別股商品

從上圖來看,目前特別股還有不少6.3%以上年報酬率的商品,像我自己膽子比較小,所以就挑了EBAY及AT&T的特別股進到觀察名單裡,準備收益率進到我設定的目標,就開始買進。

 

若要自行設定搜尋特別股的條件,也可以直接進到特別股頻道中,從搜尋工具中來設條件

結合了美債及美國特別股的線上交易平台,是Moneydj所提供的一個追求穩定收益的線上下單平台,如果您的目標是穩穩當當,4-7%的收益,每季或每半非配息一次,那麼這個平台值得您細細研究。

人人都是巴菲特專案

我尋找潛力股的方法之二~ 自由現金流穩定的公司股價夠低

照往例,盤不好的時候就來作功課,繼續來介紹我在空頭市場尋找潛力股的方法,今天跟大家介紹的是自由現金流穩定,而且股價夠低的選股方法。

所自謂自由現金流就是來自營運的現金流量-資本支出-利息支出-所得稅。這個數字代表的是公司真金白銀收進來而不會再出去的現金淨流入,如果這個數字長期都維持在一定的水準之上,等到股價跌到一定的水準之下,就值得留意。

為了挑出這樣的股票,我寫了兩個腳本

一個是自由現金流量過去n年每年都超過m億元

value1=GetField("來自營運之現金流量","Y");//單位百萬
value2=GetField("資本支出金額","Y");//單位百萬
value3=GetField("利息支出","Y");//單位百萬
value4=GetField("所得稅費用","Y");//單位百萬
value5=value1-value2-value3-value4;//自由現金流量
input:lm(1,"自由現金流量下限,單位億元");
input:years(8,"符合條件年數");
if trueall(value5>=lm,years) then ret=1;

另一個則是股價每股自由現金流量比低於一定值

value1=GetField("來自營運之現金流量","Q");//單位百萬
value2=GetField("資本支出金額","Q");//單位百萬
value3=GetField("利息支出","Q");//單位百萬
value4=GetField("所得稅費用","Q");//單位百萬
value5=value1-value2-value3-value4;//自由現金流量
value6=GetField("普通股股本","Q");//單位億元
value7=value5/value6/10;//每股自由現金流
value8=close/value7;
input:ratio(5,"低標");
if value8<5 and value8 >0 then ret=1;

結合這兩個腳本及其他價量的條件,組成一個選股策略如下

用這個腳本去回測過去三年所有普通股,停損設7%,20天後出場,回測報告如下

過去三年這個策略每年平均約有三成的報酬率。

未來在中美大戰下,市場可能比較艱難,可以趁這時候學些價值型投資的方法,畢竟好公司也只有這時候才有便宜的價位可以買。

 

 

 

當沖語法支援的欄位說明

近來局勢詭譎多變,很多人選擇不留倉,不少網友問的問題都是跟盤中數據的演算有關,所以我想完整的跟大家說明盤中到底有那些欄位可以拿來運算,並且應用在策略雷達中。

盤中會即時跳動的數據,可以像下面這張圖般,分成幾類

1。最近的買價,賣價,成交價及最新一筆的成交量

2。五檔的委買價及委買量

3。五檔的委賣價及委賣量

除了上述的數據之外,期貨,選擇權及權證分別有一些根據上述數據跟其合約內容所衍生計算出來的欄位,綜合成以下的即時報價相關欄位

 

價的欄位主要是當天會跳動的價位,還有一些內建的統計數據值,如前N價,先前特定時點的收盤價

量的欄位包括單量,總量,委託量等,

期權相關的欄位

權證的欄位

 

指數相關的欄位

營收及財報欄位

當然沒有人可以完全記得住這些價位,只要在語法編輯器中打G之後選GetQuote(插入)

即可以進到下面的視窗中去選擇您需要使用的欄位

下面是系統內建的幾個腳本,給大家作個參考

盤中大單

input: atVolume(50,"大單門檻");
input: LaTime(10,"大單筆數");
input: TXT("須逐筆洗價","使用限制");

settotalbar(3);

variable: intrabarpersist Xtime(0);
//計數器
variable: intrabarpersist Volumestamp(0);

Volumestamp =q_DailyVolume;
if time < time[1] 
or Volumestamp = Volumestamp[1]
then Xtime =0; //開盤那根要歸0次數

if q_tickvolume > atVolume
//單筆tick成交量超過大單門檻
and GetQuote("BidAskFlag")=1
//外盤成交
then Xtime+=1; 
//量夠大就加1次
if Xtime > LaTime then begin
ret=1; 
Xtime=0;
end;

 

參考的腳本 盤中委買遠大於委賣

input:v1(2000,"委買五檔總金額(萬)");
input:v2(500,"委賣五檔總金額(萬)");
input:v3(1500,"委買委賣總差額(萬)");
input:v4(400,"單一價位委買金額下限");
input:v5(100,"單一價位委賣金額上限");

variable:bidtv(0),asktv(0),tb(0),ta(0),b1(0),b2(0),b3(0),b4(0),b5(0),s1(0),s2(0),s3(0),s4(0),s5(0);
condition1=false;
condition2=false;
condition3=false;

bidtv=q_SumBidSize;//總委買
asktv=q_SumAskSize;//總委賣

value1=q_BestBidSize1;//委買一
value2=q_BestBidSize2;
value3=q_bestbidsize3;
value4=q_bestbidsize4;
value5=q_bestbidsize5;

value6=q_bestasksize1;//委賣一
value7=q_bestasksize2;
value8=q_bestasksize3;
value9=q_bestasksize4;
value10=q_bestasksize5;

tb=bidtv*close/10;
ta=asktv*close/10;

if tb>v1 and ta<v2 and tb-ta>v3
then condition1=true;

b1=value1*close/10;
b2=value2*close/10;
b3=value3*close/10;
b4=value4*close/10;
b5=value5*close/10;
s1=value6*close/10;
s2=value7*close/10;
s3=value8*close/10;
s4=value9*close/10;
s5=value10*close/10;

if minlist(b1,b2,b3,b4,b5)>v4
then condition2=true;

if maxlist(s1,s2,s3,s4,s5)<v5
then condition3=true;

if close<>q_DailyUplimit then begin
if condition1 
or (condition2 and condition3)
then ret=1; 
end;

 

目前用getquote所撰寫的腳本,因為數據量太大,沒有提供回測的功能,但大家還是可以透過這樣的語法,像上面兩個例子般,找出盤中特殊的交易機會。

 

 

如何在XS選股中心用財報數字選股

8/14剛過,第二季季報全部已揭露,趁這個時候,跟大家比較完整的介紹XS選股中心裡的財報欄位,內建的相關腳本,讓大家可以在每一季財報公佈後,可以按個鍵就完成財報相關的選股工作。

一,系統內建的可供選股的財務面欄位

目前選股中心裡,提供了152個財報欄位,大致可以分成以下幾類

A.資產負債表相關欄位

資產負債表的相關欄位
現金及約當現金 季,年
短期投資 季,年
應收帳款及票據 季,年
其他應收款 季,年
短期借支 季,年
存貨 季,年
預付費用及預付款 季,年
其他流動資產 季,年
流動資產 季,年
長期投資 季,年
未完工程及預付款 季,年
固定資產 季,年
遞延資產 季,年
無形資產 季,年
其他資產 季,年
資產總額 季,年
短期借款 季,年
應付商業本票 季,年
應付帳款及票據 季,年
預收款項 季,年
其他應付款 季,年
一年內到期長期負債 季,年
其他流動負債 季,年
流動負債 季,年
長期負債 季,年
遞延貸項 季,年
退休金準備 季,年
遞延所得稅 季,年
負債總額 季,年
普通股股本 季,年
特別股股本 季,年
預收股款 季,年
資本公積 季,年
法定盈餘公積 季,年
特別盈餘公積 季,年
未分配盈餘 季,年
外幣換算調整數 季,年
庫藏股帳面值 季,年
股東權益總額 季,年
負債及股東權益總額 季,年

 

B.損益表相關欄位

營業收入淨額 季,年
營業成本 季,年
營業毛利 季,年
聯屬公司間未實現銷貨 季,年
營業費用率 季,年
推銷費用 季,年
管理費用 季,年
研發費用 季,年
營業利益 季,年
利息收入 季,年
投資收入/股利收入 季,年
處分投資利得 季,年
投資跌價損失回轉 季,年
處分資產利得 季,年
兌換盈益 季,年
其他收入 季,年
營業外收入合計 季,年
利息支出 季,年
處分投資損失 季,年
投資跌價損失 季,年
處分資產損失 季,年
兌換損失 季,年
稅前淨利 季,年
所得稅費用 季,年
經常利益 季,年
停業部門損益 季,年
本期稅後淨利 季,年
加權平均股數 季,年
稅前息前淨利 季,年
稅前息前折舊前淨利 季,年
常續性利益(稅後) 季,年

C.現金流量表裡的欄位

投資活動之現金流量 季,年
來自營運之現金流量 季,年
理財活動之現金流量 季,年

D.各種財務比率

獲利能力

每股稅前淨利 季,年
每股稅後淨利 季,年
營業毛利率 季,年
營業利益率 季,年
營業淨利率 季,年
稅前淨利率 季,年
稅後淨利率 季,年
每股淨值 季,年
股東權益報酬率 季,年
資產報酬率 季,年
每股營業額 季,年
每股營業利益 季,年

成長力

營收成長率 季,年
營業利益成長率 季,年
稅前淨利成長率 季,年
稅後淨利成長率 季,年
總資產成長率 季,年
淨值成長率 季,年
固定資產成長率 季,年

償債能力

流動比率 季,年
速動比率 季,年
負債比率 季,年
利息保障倍數 季,年
應收帳款週轉率 季,年

經營能力

存貨週轉率 季,年
固定資產週轉率 季,年
總資產週轉率 季,年
員工平均營業額 季,年
淨值週轉率 季,年
負債對淨值比率 季,年
長期資金適合率 季,年

E.其他財報欄位及比率

營業費用率 季,年
用人費用率 季,年
研發費用率 季,年
現金流量比率 季,年
有息負債利率 季,年
有效稅率 季,年
借款依存度 季,年
或有負債比率 季,年
存貨及應用帳款/淨值 季,年
應付帳款付現天數 季,年
利息支出率
稅額扣抵比率
(存貨+應收帳款)/季營收
市值營收比 季,年
每人營業利益 季,年
每股現金流量 季,年
固定資產報酬率 季,年
市研率 季,年
每股流動淨資產 季,年
企業價值 季,年
存貨營收比 季,年
盈餘殖利率 季,年
淨值自由現金流量比 季,年
盈餘成長係數 季,年
營業現金流/營業利益 季,年
股價自由現金流量比 季,年
自由現金流量營收比 季,年
杜邦型ROA 季,年
杜邦型ROE 季,年
盈餘營收成長率比 季,年
銷售費用比 季,年
誠信指標 季,年
營運資金 季,年
管理費用/季營收 季,年
現金流量允當% 季,年
現金再投資% 季,年
應收帳款週轉次數 季,年
平均收帳天數 季,年
平均售貨天數 季,年
淨營業週期 季,年
管理+銷售費用/營收 季,年
資本支出營收比 季,年
現金派息比率
資本支出金額 季,年
企業價值營收比 季,年
長短期負債比率 季,年

上述的這些欄位,系統都有內建一些選股的條件,讓大家可以直接按加號把它加到選股條件中

除了系統內建的條件之外,對於有一些常用的,但運算可能比較複雜, 或是需要用到的不只一個欄位的選股條件,系統內建了不少財務面選股腳本,茲列出如下

如果上述的條件敘述及腳本都不符合您的需求,才真的需要自己動手用XS來寫選股程式。

總的來說,如果各位在財務面選股僅僅只是用到毛利率創新高,EPS超過一元之類簡單的選股條件,其實不需要用XS的選股平台就可以在坊間找到免費的資源來使用,但如果您自己有一些想法,需要透過財報欄位來預估EPS,來挑出可能的地雷股,那麼透過XS的選股平台就可以把財報選股完全自動化,舉個例子,我之前曾經介紹過一個叫作Growth Value Index的指標,這個指標是淡江大學土木工程系的葉怡成教授所發明的,計算的公式如下:

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

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

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

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

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;

 

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

然後用這個排行榜來跑一個選股策略

這樣就可以完成一個有20檔股票的投資組合。

用這個選股策略去回測過去三年,持有時間設為60天,回測報告如下

這個選股策略的績效是可以打敗大盤的。

從這個例子就可以理解,財務面的指標,是可以創造出獨特的選股策略,以前我老板總說:只有想不到,沒有做不到,我們可以試著從財務面來研判一家公司的體質,管理能力,產業地位等等,然後設定一些規則,從1700多檔股票中,挑到真的符合我們設定條件的公司。

以下是其他一些透過財務面指標所設計的選股策略,也供大家參考。

如何預估EPS

用季營業利益估的EPS來算出低本益比的公司

從資本支出來挑未來可能大好大壞的股票

總市值小於流動資產減總負債的2/3的選股法

現金總市值比高的選股法

盈餘穩定且低本益比選股法

用市研率挑股票的選股法

計算估值後挑高折價的股票

獲利穩定的公司落難時

高毛利率低獲利高成長股

財報公佈前要特別小心留意的公司

 

美股特別股操作實務

如果台幣趨貶,全球景氣變差,資金應該擺在那裡?

我認為,如果是非專業投資人,買投資等級公司債是個辦法,但如果對投資有一定的了解,可以留意美股的特別股。

在 XQ操盤高手美股版中,有一個美股特別股的搜尋功能

可以透過條件的設定,找出殖利率夠高且財報表現不錯的特別股。

例如下面這些美股特別股的年收益率有不少都還在6-7%

以e-Bay為例,前兩天的收益率都還有5.58%

買特別股最怕的是公司配不出股息,所以要挑的標的最好業務容易了解,財報健全,現金流量穩定,足以穩定配息。所以可以從上述畫面的發行公司進去了解相關的財報

 

 

這樣就可以挑到收益率不錯的標的。

美股特別股每季配息一次,特別是在股市走空時,特別股往往會跟著普通股稍為修正,收益率會變的很迷人,這時就是我們從裡頭挑到好標的之最好時機。

歡迎各位參加人人都是巴菲特專案,免費取得美股即時報價,並可以透過XQ全球贏家美股版,線上下單,交易美股特別股。

台灣50專屬交易指標之創新高與新低指標

昨天跟大家介紹了台灣50的多空指標,有使用者問說在這樣的思維下,能否示範如何創造類似的指標,剛好觸發我寫0050多空指標的這位朋友,他原本就是專心在操作0050及00632R,所以原來就有一些私房的觀察指標,在取得他同意之後,今天來跟大家分享創新高與創新低指標。

這兩個指標的寫法跟昨天介紹的多空指標類似

腳本分別如下

創新高家數指標

value1=GetSymbolField("1101.tw","收盤價","D");
value2=GetSymbolField("1102.tw","收盤價","D");
value3=GetSymbolField("1216.tw","收盤價","D");
value4=GetSymbolField("1301.tw","收盤價","D");
value5=GetSymbolField("1303.tw","收盤價","D");
value6=GetSymbolField("1326.tw","收盤價","D");
value7=GetSymbolField("1402.tw","收盤價","D");
value8=GetSymbolField("2002.tw","收盤價","D");
value9=GetSymbolField("2105.tw","收盤價","D");
value10=GetSymbolField("2207.tw","收盤價","D");
value11=GetSymbolField("2301.tw","收盤價","D");
value12=GetSymbolField("2303.tw","收盤價","D");
value13=GetSymbolField("2308.tw","收盤價","D");
value14=GetSymbolField("2317.tw","收盤價","D");
value15=GetSymbolField("2327.tw","收盤價","D");
value16=GetSymbolField("2330.tw","收盤價","D");
value17=GetSymbolField("2357.tw","收盤價","D");
value18=GetSymbolField("2382.tw","收盤價","D");
value19=GetSymbolField("2395.tw","收盤價","D");
value20=GetSymbolField("2408.tw","收盤價","D");
value21=GetSymbolField("2409.tw","收盤價","D");
value22=GetSymbolField("2412.tw","收盤價","D");
value23=GetSymbolField("2454.tw","收盤價","D");
value24=GetSymbolField("2474.tw","收盤價","D");
value25=GetSymbolField("2633.tw","收盤價","D");
value26=GetSymbolField("2801.tw","收盤價","D");
value27=GetSymbolField("2880.tw","收盤價","D");
value28=GetSymbolField("2881.tw","收盤價","D");
value29=GetSymbolField("2882.tw","收盤價","D");
value30=GetSymbolField("2883.tw","收盤價","D");
value31=GetSymbolField("2884.tw","收盤價","D");
value32=GetSymbolField("2885.tw","收盤價","D");
value33=GetSymbolField("2886.tw","收盤價","D");
value34=GetSymbolField("2887.tw","收盤價","D");
value35=GetSymbolField("2890.tw","收盤價","D");
value36=GetSymbolField("2891.tw","收盤價","D");
value37=GetSymbolField("2892.tw","收盤價","D");
value38=GetSymbolField("2912.tw","收盤價","D");
value39=GetSymbolField("3008.tw","收盤價","D");
value40=GetSymbolField("3045.tw","收盤價","D");
value41=GetSymbolField("3711.tw","收盤價","D");
value42=GetSymbolField("4904.tw","收盤價","D");
value43=GetSymbolField("4938.tw","收盤價","D");
value44=GetSymbolField("5871.tw","收盤價","D");
value45=GetSymbolField("5876.tw","收盤價","D");
value46=GetSymbolField("5880.tw","收盤價","D");
value47=GetSymbolField("6505.tw","收盤價","D");
value48=GetSymbolField("9904.tw","收盤價","D");
value49=GetSymbolField("9910.tw","收盤價","D");
value50=GetSymbolField("2823.tw","收盤價","D");


variable:count(0);
input:period(20);
count=0;
if value1=highest(value1,period) then count=count+1;
if value2=highest(value2,period) then count=count+1;
if value3=highest(value3,period) then count=count+1;
if value4=highest(value4,period) then count=count+1;
if value5=highest(value5,period) then count=count+1;
if value6=highest(value6,period) then count=count+1;
if value7=highest(value7,period) then count=count+1;
if value8=highest(value8,period) then count=count+1;
if value9=highest(value9,period) then count=count+1;
if value10=highest(value10,period) then count=count+1;
if value11=highest(value11,period) then count=count+1;
if value12=highest(value12,period) then count=count+1;
if value13=highest(value13,period) then count=count+1;
if value14=highest(value14,period) then count=count+1;
if value15=highest(value15,period) then count=count+1;
if value16=highest(value16,period) then count=count+1;
if value17=highest(value17,period) then count=count+1;
if value18=highest(value18,period) then count=count+1;
if value19=highest(value19,period) then count=count+1;
if value20=highest(value20,period) then count=count+1;
if value21=highest(value21,period) then count=count+1;
if value22=highest(value22,period) then count=count+1;
if value23=highest(value23,period) then count=count+1;
if value24=highest(value24,period) then count=count+1;
if value25=highest(value25,period) then count=count+1;
if value26=highest(value26,period) then count=count+1;
if value27=highest(value27,period) then count=count+1;
if value28=highest(value28,period) then count=count+1;
if value29=highest(value29,period) then count=count+1;
if value30=highest(value30,period) then count=count+1;
if value31=highest(value31,period) then count=count+1;
if value32=highest(value32,period) then count=count+1;
if value33=highest(value33,period) then count=count+1;
if value34=highest(value34,period) then count=count+1;
if value35=highest(value35,period) then count=count+1;
if value36=highest(value36,period) then count=count+1;
if value37=highest(value37,period) then count=count+1;
if value38=highest(value38,period) then count=count+1;
if value39=highest(value39,period) then count=count+1;
if value40=highest(value40,period) then count=count+1;
if value41=highest(value41,period) then count=count+1;
if value42=highest(value42,period) then count=count+1;
if value43=highest(value43,period) then count=count+1;
if value44=highest(value44,period) then count=count+1;
if value45=highest(value45,period) then count=count+1;
if value46=highest(value46,period) then count=count+1;
if value47=highest(value47,period) then count=count+1;
if value48=highest(value48,period) then count=count+1;
if value49=highest(value49,period) then count=count+1;
if value50=highest(value50,period) then count=count+1;

value51=count;

plot1(value51,"台灣50創新高家數指標");

創新低家數指標

value1=GetSymbolField("1101.tw","收盤價","D");
value2=GetSymbolField("1102.tw","收盤價","D");
value3=GetSymbolField("1216.tw","收盤價","D");
value4=GetSymbolField("1301.tw","收盤價","D");
value5=GetSymbolField("1303.tw","收盤價","D");
value6=GetSymbolField("1326.tw","收盤價","D");
value7=GetSymbolField("1402.tw","收盤價","D");
value8=GetSymbolField("2002.tw","收盤價","D");
value9=GetSymbolField("2105.tw","收盤價","D");
value10=GetSymbolField("2207.tw","收盤價","D");
value11=GetSymbolField("2301.tw","收盤價","D");
value12=GetSymbolField("2303.tw","收盤價","D");
value13=GetSymbolField("2308.tw","收盤價","D");
value14=GetSymbolField("2317.tw","收盤價","D");
value15=GetSymbolField("2327.tw","收盤價","D");
value16=GetSymbolField("2330.tw","收盤價","D");
value17=GetSymbolField("2357.tw","收盤價","D");
value18=GetSymbolField("2382.tw","收盤價","D");
value19=GetSymbolField("2395.tw","收盤價","D");
value20=GetSymbolField("2408.tw","收盤價","D");
value21=GetSymbolField("2409.tw","收盤價","D");
value22=GetSymbolField("2412.tw","收盤價","D");
value23=GetSymbolField("2454.tw","收盤價","D");
value24=GetSymbolField("2474.tw","收盤價","D");
value25=GetSymbolField("2633.tw","收盤價","D");
value26=GetSymbolField("2801.tw","收盤價","D");
value27=GetSymbolField("2880.tw","收盤價","D");
value28=GetSymbolField("2881.tw","收盤價","D");
value29=GetSymbolField("2882.tw","收盤價","D");
value30=GetSymbolField("2883.tw","收盤價","D");
value31=GetSymbolField("2884.tw","收盤價","D");
value32=GetSymbolField("2885.tw","收盤價","D");
value33=GetSymbolField("2886.tw","收盤價","D");
value34=GetSymbolField("2887.tw","收盤價","D");
value35=GetSymbolField("2890.tw","收盤價","D");
value36=GetSymbolField("2891.tw","收盤價","D");
value37=GetSymbolField("2892.tw","收盤價","D");
value38=GetSymbolField("2912.tw","收盤價","D");
value39=GetSymbolField("3008.tw","收盤價","D");
value40=GetSymbolField("3045.tw","收盤價","D");
value41=GetSymbolField("3711.tw","收盤價","D");
value42=GetSymbolField("4904.tw","收盤價","D");
value43=GetSymbolField("4938.tw","收盤價","D");
value44=GetSymbolField("5871.tw","收盤價","D");
value45=GetSymbolField("5876.tw","收盤價","D");
value46=GetSymbolField("5880.tw","收盤價","D");
value47=GetSymbolField("6505.tw","收盤價","D");
value48=GetSymbolField("9904.tw","收盤價","D");
value49=GetSymbolField("9910.tw","收盤價","D");
value50=GetSymbolField("2823.tw","收盤價","D");


variable:count(0);
input:period(20);
count=0;
if value1=lowest(value1,period) then count=count+1;
if value2=lowest(value2,period) then count=count+1;
if value3=lowest(value3,period) then count=count+1;
if value4=lowest(value4,period) then count=count+1;
if value5=lowest(value5,period) then count=count+1;
if value6=lowest(value6,period) then count=count+1;
if value7=lowest(value7,period) then count=count+1;
if value8=lowest(value8,period) then count=count+1;
if value9=lowest(value9,period) then count=count+1;
if value10=lowest(value10,period) then count=count+1;
if value11=lowest(value11,period) then count=count+1;
if value12=lowest(value12,period) then count=count+1;
if value13=lowest(value13,period) then count=count+1;
if value14=lowest(value14,period) then count=count+1;
if value15=lowest(value15,period) then count=count+1;
if value16=lowest(value16,period) then count=count+1;
if value17=lowest(value17,period) then count=count+1;
if value18=lowest(value18,period) then count=count+1;
if value19=lowest(value19,period) then count=count+1;
if value20=lowest(value20,period) then count=count+1;
if value21=lowest(value21,period) then count=count+1;
if value22=lowest(value22,period) then count=count+1;
if value23=lowest(value23,period) then count=count+1;
if value24=lowest(value24,period) then count=count+1;
if value25=lowest(value25,period) then count=count+1;
if value26=lowest(value26,period) then count=count+1;
if value27=lowest(value27,period) then count=count+1;
if value28=lowest(value28,period) then count=count+1;
if value29=lowest(value29,period) then count=count+1;
if value30=lowest(value30,period) then count=count+1;
if value31=lowest(value31,period) then count=count+1;
if value32=lowest(value32,period) then count=count+1;
if value33=lowest(value33,period) then count=count+1;
if value34=lowest(value34,period) then count=count+1;
if value35=lowest(value35,period) then count=count+1;
if value36=lowest(value36,period) then count=count+1;
if value37=lowest(value37,period) then count=count+1;
if value38=lowest(value38,period) then count=count+1;
if value39=lowest(value39,period) then count=count+1;
if value40=lowest(value40,period) then count=count+1;
if value41=lowest(value41,period) then count=count+1;
if value42=lowest(value42,period) then count=count+1;
if value43=lowest(value43,period) then count=count+1;
if value44=lowest(value44,period) then count=count+1;
if value45=lowest(value45,period) then count=count+1;
if value46=lowest(value46,period) then count=count+1;
if value47=lowest(value47,period) then count=count+1;
if value48=lowest(value48,period) then count=count+1;
if value49=lowest(value49,period) then count=count+1;
if value50=lowest(value50,period) then count=count+1;

value51=count;
 
plot1(value51,"台灣50創新低家數指標");

下圖是一張創新高新低家數指標與台灣50日線的對照圖

我有把使用的原則寫在圖上,至於為何參數用20天,我朋友試過後說20天最好用,所以我就沒有試過其他天期。

下圖則是00632R的指標對照圖

我這位朋友用這對指標,以及昨天介紹的多空指標,以及他的一些私房指標,專注在操作0050及00632R,算是0050的操作達人。

另外跟大家分享一下,在自己發明私房的0050相關指標時,可以善用”取代“這個功能,直接一次修改50行的敘述,例如我要把average換成highest就直接填完按全部取代就好了

這樣就不用一行一行改了。

 

台灣50專屬多空指標

很久之前有跟大家分享過一個台灣50的多空指標,那就是計算前面十檔台灣50指數成份股有多少檔站在月線之上。上週五颱風假在假閒閒沒事,想說要不要乾脆把50檔成份股都納進來算,結果50檔裡有多少檔站在月線之上這樣的數據,對照台灣50的走勢,確實是有一定的參考價值,所以我想就直接跟大家分享腳本,讓大家不必辛苦的敲半天,然後也可以根據這樣的想法,透過計算有多少檔成份股RSI在50以上之類的數據,創造自己專屬的多空指標。

有不少朋友喜歡看多大盤時買0050,看壞大盤後市時買00632R,所以需要一個研究台灣50後市的多空依據,以下的腳本是用來計算台灣50裡的50檔成份股,有多少檔站在月線之上。

腳本

value1=GetSymbolField("1101.tw","收盤價");
value2=GetSymbolField("1102.tw","收盤價");
value3=GetSymbolField("1216.tw","收盤價");
value4=GetSymbolField("1301.tw","收盤價");
value5=GetSymbolField("1303.tw","收盤價");
value6=GetSymbolField("1326.tw","收盤價");
value7=GetSymbolField("1402.tw","收盤價");
value8=GetSymbolField("2002.tw","收盤價");
value9=GetSymbolField("2105.tw","收盤價");
value10=GetSymbolField("2207.tw","收盤價");
value11=GetSymbolField("2301.tw","收盤價");
value12=GetSymbolField("2303.tw","收盤價");
value13=GetSymbolField("2308.tw","收盤價");
value14=GetSymbolField("2317.tw","收盤價");
value15=GetSymbolField("2327.tw","收盤價");
value16=GetSymbolField("2330.tw","收盤價");
value17=GetSymbolField("2357.tw","收盤價");
value18=GetSymbolField("2382.tw","收盤價");
value19=GetSymbolField("2395.tw","收盤價");
value20=GetSymbolField("2408.tw","收盤價");
value21=GetSymbolField("2409.tw","收盤價");
value22=GetSymbolField("2412.tw","收盤價");
value23=GetSymbolField("2454.tw","收盤價");
value24=GetSymbolField("2474.tw","收盤價");
value25=GetSymbolField("2633.tw","收盤價");
value26=GetSymbolField("2801.tw","收盤價");
value27=GetSymbolField("2880.tw","收盤價");
value28=GetSymbolField("2881.tw","收盤價");
value29=GetSymbolField("2882.tw","收盤價");
value30=GetSymbolField("2883.tw","收盤價");
value31=GetSymbolField("2884.tw","收盤價");
value32=GetSymbolField("2885.tw","收盤價");
value33=GetSymbolField("2886.tw","收盤價");
value34=GetSymbolField("2887.tw","收盤價");
value35=GetSymbolField("2890.tw","收盤價");
value36=GetSymbolField("2891.tw","收盤價");
value37=GetSymbolField("2892.tw","收盤價");
value38=GetSymbolField("2912.tw","收盤價");
value39=GetSymbolField("3008.tw","收盤價");
value40=GetSymbolField("3045.tw","收盤價");
value41=GetSymbolField("3711.tw","收盤價");
value42=GetSymbolField("4904.tw","收盤價");
value43=GetSymbolField("4938.tw","收盤價");
value44=GetSymbolField("5871.tw","收盤價");
value45=GetSymbolField("5876.tw","收盤價");
value46=GetSymbolField("5880.tw","收盤價");
value47=GetSymbolField("6505.tw","收盤價");
value48=GetSymbolField("9904.tw","收盤價");
value49=GetSymbolField("9910.tw","收盤價");
value50=GetSymbolField("2823.tw","收盤價");

variable:count(0);
input:period(20);
count=0;
if value1>average(value1,period) then count=count+1;
if value2>average(value2,period) then count=count+1;
if value3>average(value3,period) then count=count+1;
if value4>average(value4,period) then count=count+1;
if value5>average(value5,period) then count=count+1;
if value6>average(value6,period) then count=count+1;
if value7>average(value7,period) then count=count+1;
if value8>average(value8,period) then count=count+1;
if value9>average(value9,period) then count=count+1;
if value10>average(value10,period) then count=count+1;
if value11>average(value11,period) then count=count+1;
if value12>average(value12,period) then count=count+1;
if value13>average(value13,period) then count=count+1;
if value14>average(value14,period) then count=count+1;
if value15>average(value15,period) then count=count+1;
if value16>average(value16,period) then count=count+1;
if value17>average(value17,period) then count=count+1;
if value18>average(value18,period) then count=count+1;
if value19>average(value19,period) then count=count+1;
if value20>average(value20,period) then count=count+1;
if value21>average(value21,period) then count=count+1;
if value22>average(value22,period) then count=count+1;
if value23>average(value23,period) then count=count+1;
if value24>average(value24,period) then count=count+1;
if value25>average(value25,period) then count=count+1;
if value26>average(value26,period) then count=count+1;
if value27>average(value27,period) then count=count+1;
if value28>average(value28,period) then count=count+1;
if value29>average(value29,period) then count=count+1;
if value30>average(value30,period) then count=count+1;
if value31>average(value31,period) then count=count+1;
if value32>average(value32,period) then count=count+1;
if value33>average(value33,period) then count=count+1;
if value34>average(value34,period) then count=count+1;
if value35>average(value35,period) then count=count+1;
if value36>average(value36,period) then count=count+1;
if value37>average(value37,period) then count=count+1;
if value38>average(value38,period) then count=count+1;
if value39>average(value39,period) then count=count+1;
if value40>average(value40,period) then count=count+1;
if value41>average(value41,period) then count=count+1;
if value42>average(value42,period) then count=count+1;
if value43>average(value43,period) then count=count+1;
if value44>average(value44,period) then count=count+1;
if value45>average(value45,period) then count=count+1;
if value46>average(value46,period) then count=count+1;
if value47>average(value47,period) then count=count+1;
if value48>average(value48,period) then count=count+1;
if value49>average(value49,period) then count=count+1;
if value50>average(value50,period) then count=count+1;

value51=count-25;

plot1(value51,"台灣50多頭指數");


用這個腳本可以畫出下面這張圖

觀察這樣的對照圖,我們有丝個結論

一,當這個指標在20以上快速下跌時,往往是多頭市場的結束

二,當這個指標在-20左右快速往上走時,往往是多頭市場的開始

三,當這個指標穩定的維持紅柱體時,代表大多數的成份股是站在月線之上,屬於多頭架構

四,當這個指標穩定維持在0以下時,代表大多數的成份股站在月線之下,屬於空頭架構

五,當指標與台灣50背離時,往往是反轉訊號。

下圖則是這個指標與台灣50一分鐘的對照圖,這裡代表的是20分鐘移動平均線,如果大家覺得應該調整參數,請直接修改。

 

以上大致是這個指標的作法與應用,我做的是苦工,目的是讓大家不用自己敲50檔成份股的股票代碼,剩下的就讓大家自由發揮了。

 

 

 

 

如何使用跨頻率技術指標來建構策略雷達

有網友想要了解如何同時用不同頻率的指標來建構一個策略雷達,我今天舉例來跟大家說明。

 

目前XS內建有28個跨頻率的函數,依序如下,大家可以在函數頁籤下的系統選單中找到

運用這些函數,可以直接在一個警示腳本中使用不同頻率的指標。

舉個例子,如果我希望電腦可以在個股週RSI小於20且日KD低檔黃金交叉時發出訊號,那麼就可以使用像下面這樣的腳本

input: Length_D(9,"日KD期間");

variable:rsv_d(0),kk_d(0),dd_d(0),c5(0);

stochastic(Length_D, 3, 3, rsv_d, kk_d, dd_d);

if xf_RSI("w",close,5)<=20 and kk_d <=30 
and kk_d crosses over dd_d

then ret=1;

用這個腳本去跑過去兩年的權值股加中型100指數成份股,KD死亡交叉後出場,其回測報告如下

這個腳本轉門尋找那些大跌後的中大型股

 

這當中的xf_RSI就是在日線底下使用的跨頻率函數,大家也可以看一下這種跨頻率函數的寫法

SetBarMode(2);

// 跨頻率RSI函數
//
// FreqType是預期要引用的頻率, 支援"D", "W", "M"
// 輸入: FreqType, Series, Length
//
input:
FreqType(string), //引用頻率
Series(numericseries), //價格序列
Length(numericsimple); //計算期間

variable: 
SumUp(0), SumDown(0), 
LastSumUp(0), LastSumDown(0),LastRefSeries(Series), 
up(0), down(0),
closePeriod(0);

condition1 = xf_getdtvalue(FreqType, Date) <> xf_getdtvalue(FreqType, Date[1]);
if condition1 then
begin
LastSumUp = SumUp[1];
LastSumDown = SumDown[1];
LastRefSeries = Series[1];
end;

if xf_GetCurrentBar(FreqType) = 1 then
begin
SumUp = Average(maxlist(Series - LastRefSeries, 0), Length); 
SumDown = Average(maxlist(LastRefSeries - Series, 0), Length); 
end
else
begin
up = maxlist(Series - LastRefSeries, 0);
down = maxlist(LastRefSeries - Series, 0);

SumUp = LastSumUp + (up - LastSumUp) / Length;
SumDown = LastSumDown + (down - LastSumDown) / Length;
end;

if SumUp + SumDown = 0 then
xf_RSI = 0
else
xf_RSI = 100 * SumUp / (SumUp + SumDown);

 

這樣的語法目前系統內建的指標都是常用的指標,如果需要其他的指標,可以用類似的方法來自訂一個函數,例如跨頻率的加權移動平均線EMA就可以像下面這樣的寫法

SetBarMode(2);

// 跨頻率EMA
//
// FreqType是預期要比對的期別, 支援"D", "W", "M"
// 輸入: FreqType, Series, Length
//
input:
FreqType(string), //引用頻率
Series(numericseries), //價格序列
Length(numericsimple); //計算期間

variable:
Factor(0), lastEMA(0);

condition1 = xf_getdtvalue(FreqType, Date) <> xf_getdtvalue(FreqType, Date[1]);
if condition1 then
lastEMA = xf_EMA[1];

value1 = xf_GetCurrentBar(FreqType);

if Length + 1 = 0 then Factor = 1 else Factor = 2 / (Length + 1);

if value1 = 1 then
xf_EMA = Series
else if value1 <= Length then
xf_EMA = (Series + (lastEMA * (value1 - 1)))/value1
else
xf_EMA = lastEMA + Factor * (Series - lastEMA);

大家是否有留意到,這類跨頻率指標的寫法都會用到兩個函數,一個是xf_getdtvalue ,一個是xf_GetCurrentBar,要自訂跨頻率函數時,基本上都必須用到這兩個函數,大家可以直接看這兩個系統提供的跨頻率腳本常用函數是怎麼寫的。

以上大致是跨頻率指標同時應用的基本概念,未來有機會再跟大家介紹回測績效不錯的跨頻率函數。

 

 

 

 

XS系統化決策結構說明文

XS是一套系統化的決策系統, 不少網友來信問到XS的使用方式,以及免費版與收費版的差異, 我想跟大家分享我使用XS的步驟及方式,用實際的例子來說明XS的設計結構,然後也跟大家說明什麼情況使用免費版即可,什麼情況下才需要用到付費版。

由於我是從投信操盤體系出身,所以當初在發想XS的時候,是希望可以把整個投信投資決策流程都自動化,而以往當我在操盤的時候,整個決策流程如下

這四大項就變成XS四個獨立但可以串連的四大部份。

接下來分別跟大家說明這四大項的功能,雖然投資決策的第一項是先決定多空比例,但為了說明方便,我把它放在最後

一,選股

XS的選股是在“選股中心”這個功能中來進行的,使用者可以透過自己撰寫程式,選擇系統內建的條件或腳本,來進行選股,免費版與收費版的差異如下

使用者可以免費的透過回測功能,不斷地試驗,最終找到自己最中意的選股策略,然後每天利用XS的選股平台來執行選股,只要您每天執行的次數不大於十次,都是免費的。

這個平台用的資料是日資料以上,它的功能是讓使用者在收盤後,隔天開盤前,運用各種數據,挑出符合自己心目中理想的標的,由於大家在選股時,不見得會僅僅使用到價量資料,可能會用到籌碼,集保,法人,營收,財報等等資料,這些資料有些是日資料,有些是週資料,有些一個月公佈一次,有一些是一季公佈一次,要把這些資料全部放在盤中運算,既要消耗電腦資源,又有跨頻率資料對齊的問題,所以先在選股中心,透過AND或OR的交集聯集,先挑出隔一天開盤後會願意用日線或分鐘線去洗價的股票。這樣洗價時就不用一次洗1700檔,然後把電腦的CPU吃的滿滿的。

如果是付費的使用者,則每天可以讓系統自動執行100組的選股策略,您每天打開電腦,就可以直接看到有那些個股符合最多的選股策略,然後再把當中想要列入觀察名單的標的存到自選股去,這樣每天做,就會有一份自己非常有興趣進場的自選股清單。

所以如果您並沒有很多的選股策略,或是還在學習使用XS選股,其實免費版就夠用了,等到您手上有夠多靠譜的選股策略,才有需要進階到收費版。

我最近在整理一些大家常用的選股腳本,目的就是讓大家在選股中心可以不用寫程式就能完成自己心目中理想的選股策略,然後透過回測來驗證它。

二,策略雷達

在透過選股完成一份觀察名單之後,在投資流程上,名單上的股票,如果盤中符合某些價量條件,就可能符合您所設定的進場條件 ,策略雷達的功能,就是讓您設計特定的進場條件,例如我最常用的預估量爆增,整理後創新高等等,都是透過策略雷達,讓電腦幫我洗價,然後在符合條件的時候用訊號來通知我。

這個功能的免費版與收費版的差異如下圖

免費版的功能主要是讓大家先透過練習,回測,最重要的是學會寫腳本,所以只限定用日線的基本欄位,然後只限跑五檔商品,同時也僅能跑五個策略,等到學會寫腳本了,再進到收費版,這時候因為已經會程式了,也有了自己愛用的策略,這錢就不會浪費了。

但由於這樣的規定,所以像是要用到分鐘線的程式,包括指標,要盤中能更新,就必須要是收費版的會員才能使用,所以之前跟大家介紹的一些如盤中大戶散戶的指標,就必須是收費版的使用者才能使用,這點要跟大家說歹勢。

另外要稍為介紹一下策略雷達的自動排程功能

如果把選股結果直接拿來跑一些自動排程的策略雷達,就可以自動化的選股及盤中洗價,然後讓電腦自動運算出進場訊號

三,執行交易

出現進場訊號之後,目前策略雷達是有提供簡易的下單設定

您可以分配進場的資金,張數等。

這樣的設定跟目前常用程式交易平台,有很大的不一樣,一個完善的程式交易平台,是用語法來設定進場點,加碼條件,減碼條件及平倉點,但我當時在投信不會做當沖,每天都是收到對帳單及報表後才來擬定個股的出場條件等投後管理動作,所以XS並不符合時下流行的程式交易作法,這點我們會在明年逐筆撮合前完成交易語法的開發,讓XS既合乎法人的決策流程,也符合當沖,短線及期指操作的特性。

 

四,大盤多空觀測。

我很常跟朋友說,在台灣股票市場如果要賺錢,最重要的事情是避開崩盤及隨之而來的空頭市場。以往在投信時,我有自己一套觀察大盤多空方向的方法,我會用這方法來決定管理資金的持股比例,所以在XS上,我也想要把這個概念加進來,後來PM就使用了參照商品這樣的概念。

參照商品的意思是,如有在參照商品符合某個條件,電腦才會開始去跑策略雷達裡設定的策略,符合條件時才會發出訊號。

以下圖為例,我希望加權指數在月線之上才啟動某一策略,我就可以在策略雷達的設定視窗裡勾選參數商品,然後像下圖這樣的設定

以上是XS目前的架構,免費的使用者可以學寫程式,設計選股策略,決定進場時點,等到真的有些把握了,再轉成收費的使用者,這樣比較OK