Author Archives: 發財橘子

報復性反彈

股票市場情緒很極端,漲的時候眾星拱月,跌的時候棄如敝屣,超漲超跌時有所見,超跌的股票,往往像是過街老鼠,人人喊打,但真的跌的太過頭了,也會有報復性上漲的一天,今天我們就來探討,像這樣的公司,要透過什麼策略程式,才能提早發現。

報復性上漲的例子很多,這幾年,最有名的例子大約有下面幾個

050302 050301

這些股票的特徵如下:

1.從還原月線看,股價都連續跌了好幾個月

2.從日線看,在報復性反彈時,成交量佔大盤的比重回昇,股價比大盤強且都有出現至少一根的長紅棒

根據這兩個特徵,我使用XS即將上線的跨頻率語法,寫了一個用月線RSI找超跌,用日線找短線轉強的股票,腳本如下:

//先來找出月線RSI小於5的股票
input:period(6,"RSI期別");
var:x(0),up(0),down(0);
up=0;
down=0;
for x=0 to period-1
begin
if GetField("收盤價","AM")[x]>GetField("收盤價","AM")[x+1]
//取得還原月線的收盤價 並計算RSI
then
up=up+GetField("收盤價","AM")[x]-GetField("收盤價","AM")[x+1]
else
down=down+GetField("收盤價","AM")[x+1]-GetField("收盤價","AM")[x];
end;
value1=up/(up+down)*100;

value2=GetField("資金流向");
value3=GetField("強弱指標","D");

if value1<=25
then begin
if countif(value3>0,5)>=4
or countif(value2-value2[1]>0,5)>=3
or countif(close>=close[1]*1.04,3)>=1
then ret=1;
end;

之所以月線要這麼不厭其煩的用Getfield的方式來模擬RSI,主要是因為跨頻率如果以是日線為計算基準時,若直接套用RSI的期別時,電腦計算期別時是以日線為準,這時候,每天的月RSI其實是同樣的數字,這樣算出來的結果,就不是我們想要的了。

今早用這個腳本跑出來的股票有潤泰全,三商壽這兩檔,由於這個腳本對於日線轉強的標準訂的比較低,後續還是要搭配日線其他指標及籌碼來觀察是否真的轉強

 

 

 

 

撰寫交易策略的SOP

隨著開始使用XS寫交易策略的朋友們愈來愈多,我們愈來愈常被求救,問題看多了,歸納整理後,我寫了一個撰寫交易策略的SOP,我認為在撰寫交易腳本時,有四大步驟,嚴謹且按步就班地作好每個步驟,應該可以協助我們完成交易策略的撰寫。

這四個步驟如下圖

撰寫腳本的SOP

 

茲分項說明之

一,準備數據

程式交易語法跟其他如C++,Java等不同之處,是在於它的目標很明確~透過大量金融數據的運算,作成交易決策,所以在一個程式交易腳本中,最基本的課題是: “要拿那些金融數據進來運算?”

每個腳本,都像一道食譜,每個食譜,都會要我們先準備食材,腳本的食材,就是我們要拿下去運算的每個元素,在XS的腳本中,這些要拿來加減乘除作運算的元素,可以歸類為以下幾種

1. 即時行情的數據。包括單量,當日漲幅,內盤量,外盤量,五檔委買賣的價與委託量等等,我們可以用 Getquote的語法把它們拉出來使用。

2. 盤後數據。包括法人進出,資券變化,主力進出等等數據,我們用Getfield的語法把這些欄位拿到腳本中來使用

3. 回傳值。開高低收成交量等語法中最基本的元素,在以K棒為基礎的架構裡,我們可以用Close[n]之類的語法,把K棒中 的每一個被存下來的值拿來運算。

4. 參數。為了更改參數方便而由使用者以INPUT的語法所設定的參數,也是可以被拿來腳本中作運算。

5. 變數。為了運算方便,由使用者自行宣告的變數,也是腳本中常見的元素。

6. 常數。有的時候,就是會運用到簡單的阿拉伯數字,或是True及false這兩個布林值,這些都是腳本運算中常用的元素。當我們要要撰寫一個腳本時,就像食譜要先準備的食材一樣,我們得先決定要用上述六大類裡的那些元素,這個決定的工作,就像是煮一道菜之前,先把相關的食材從冰箱裡取出來。

0 42201 

決定好之後,接下來要做的是事情有兩個

第一個是宣告: 我們先透過宣告的方式,把要用的變數及參數先準備好,我們為它們取名字,設初始值。

第二個是指定: 然後接下來我們用getquote及getfield的語法,把盤後資料及盤中資料指定到特定的某個變數

二,建構演算

以上的這兩個步驟,就好像是煮菜之前的備料工作。備完料,接下來就是建構演算的機制,在這當中,若是有需要,會使用到系統或自訂的 函數。    大家可以透過先前學會的流程控,以及各種函數,透過數學及邏輯運算,完成各種運算。

這部份主要是看個人的功力,只能多看多寫,多看別人寫過的好語法。

三,設定輸出條件

接下來,就是建立輸出條件,我們用if ……..then  ret=1; 來指定策略雷達的觸發條件,以及選股的符合條件,用if………then plot1…;來輸出自訂指標。

我與個例子來說明以上的流程

我們希望電腦在個股符合下列三個條件時通知我們,

  1.    十日法人買超的移動平均超過1000張
  2.    當日外盤量佔成交量超過五成
  3.    當日股價比前一日上漲

那麼我們可以寫下一個腳本如下:

各位可以看到,我們依以下的步驟在完成一個警示腳本

步驟一: 宣告參數

步驟二: 宣告變數

步驟三: 取得盤後資料

步驟四: 取得即時數據

步驟五: 建構運算關係

步驟六: 設立觸發,畫指標或確認 函數的敘述式

當然在實作上,步驟一到步驟五的任何一項 ,都可能因為沒有用到相關數據而被省略,最簡單的警示腳本如if close=high then ret=1;就只有步驟六而已。

但如果大家記得這六個基本的步驟,應該可以很快的把各式各樣的數據,同步放在一個警示腳本中來使用。

042202

 

 

 四,編譯與勘誤

接下來的編譯及勘誤,是另一個重點,很多朋友就算是提供了中文的勘誤,還是無法自行找出程式碼的問題之所在,所以我把大家常見的程式上的疏誤,以及在勘誤時系統會出現的訊息做了一個對照表如下,供大家參考。

XS的勘誤方式,跟其他的IDE類似,在使用者按下編譯按鈕之後,如果程式有Bug,會在訊息視窗中,以表格的方式來呈現錯誤的地方,其呈現方式如下:

 

物件名稱 行號 字元 錯誤描述
呈現腳本的名稱 顯示錯誤的敘述在第幾行 錯誤的地方是從該行的第幾個字元開始 表達錯誤的可能原因,俾使用者正確地找到錯誤。

 

根據我自己使用的經驗,User通常會出現的錯誤,以及XS編輯器對應會出現的勘誤訊息,大致有以下幾類。

 文字上的小失誤

 

錯誤描述 原因說明及備註
未知的關鍵字 “xxx”,請檢查是否有宣告此變數或是拼字是否有誤。 可能是自己宣告的參數或變數的名稱打字時打錯了,造成電腦無法理解這個字代表的意思
需要輸入更多參數。 通常是像plot1之類的忘了把裡頭的參數輸進去,如果是函數忘了輸入正確的參數個數,系統會直接呈現”需要輸入x個參數”
需要輸入 x ~ y 個參數。 輸入的參數比系統要求的多時會出現這個message
在 “xxxxxx” 之前可能少了”;”, “DOWNTO”, “TO”, “OR”, “XOR”, “AND”, “=”, “<>”, “<“, “>”, “<=”, “>=”, “Crosses Above”, “Crosses Over”, “Crosses Below”, “Crosses Under”, “+”, “-“, “*”, “/” 最有可能的是前一行忘了打分號。
編譯器看到了一個無法辨認的字 “x”,請檢查這個字有沒有寫錯。 這種情況通常是輸入了之前沒有宣告過的文字格式內容

 流程的錯誤

 

錯誤描述 原因說明及備註
for 迴圈的變數型態應為數值。 for的用法為for 某變數=xx to xxxxx及xxx必須都是數值
「IF/Once/While/Repeat」後面需要一個真偽值或是真偽值的判斷式。 這些流程的後面必須是一個布林值的判斷式,不能是一個結果是特定數值的運算式

 

 函數的錯誤使用

 

錯誤描述 原因說明及備註
需要輸入x個參數 這代表使用這函數所需要輸入的參數的個數與user實際輸入的參數並不相符,可能是漏打或是多打了某個參數。
函數 xxxxx:第 x 個參數應該是 Numeric(string)。 這代表使用者輸入的函數參數格式錯了,該是數字的地方使用了文字,或是該是文字的地方使用了數字。
函數宣告的輸入型態有誤,應該是 Numeric,NumericSimple,NumeircSeries, String,StringSimple,StringSeries,TrueFalse,TrueFalseSimple,TrueFalseSeries。 在自訂函數宣告參數時必須宣告資料的型態而不是直接使用初始值
函數 xxxxx:第 x 個參數應該是 Numeric 函數裡每一個參數的格式(type)必須是對的,不能把文字放到該填數值的函數去
參數的數值不可以在函數中被修改,如果有需修改參數值,請將參數型態改為 NumericRef(數值)或是 NumericArray(陣列)。 在函數中的參數,它的數值是不能在宣告後直接被賦予特定值的,例如不能寫input:abc(numeric);abc=1;

 

 用到不該用的欄位

 

錯誤描述 原因說明及備註
在「警示」腳本中無法使用「plot」 在警示類的腳本中不能使用plot
此欄位無法使用 [ ](無法索引前期值)。 例如在getquote的欄位裡使用前期值的語法
在「指標」腳本中無法使用「xxxxx」。 在指標類型的腳本中不能使用getquote的欄位

 

 數值與布林值使用上的混淆

 

錯誤描述 原因說明及備註
“=” 左右兩邊的型態不同。 數值是無法等於布林值的,例如不能寫value1=true; 因為value1是數值變數,true是布林值,應該要寫成condition1=true;
“+” 左右兩邊的型態不同。 數值跟布林值是無法相加的
“AND” 與左右兩邊的型態不同。 and的兩邊必須都是布林值的敘述,不能有數值
“-” 與右邊的型態不同 減號的兩邊都必須是數值
“not” 與右邊的型態不同。 not的兩邊都必須是布林值

 

 宣告參數時容易發生的失誤

 

錯誤描述 原因說明及備註
在指標跟警示裡面不用型態的方式,請修正。 在指標跟警示裡,使用input宣告參數時直接用初始值,而不是宣告資料型態。

 

 變數使用上的錯誤

 

錯誤描述 原因說明及備註
變數 “xxx” 為系統保留文字,請更改變數名稱。 宣告變數時用到了其他關鍵字, 或是重覆宣告了同名字的變數
變數 “xxx” 沒有宣告,請用 Vars: 的方式宣告,冒號後面是變數名稱再用括號填入預設值。例如: Vars:varA(100); 如果要宣告陣列請用 Arrays: 冒號後面是名稱再用 [] 設定維度與大小,括號填入預設值。例如 Arrays:arr1[10](0);。 直接使用了某個電腦看不懂的英文字詞,電腦會提醒把這個字詞宣告成變數後再來使用
xxxx不是陣列,不能在後面加 [ ],請把  [ ] 與裡面的數字移除掉。 在使用變數前一期值時要小心,不要直接指定特定一期值為某常數,因為這是陣列才會有的行為,例如可以寫value1=value1[1]+value1[2];但不能寫value1[1]=5;

 

 陣列使用上出現的疏誤

 

錯誤描述 原因說明及備註
變數宣告為 Array 但沒有宣告陣列維度,例:Array:arr[X](numericarray); 使用陣列時只記得宣告是陣列卻忘了宣告陣列的維度
有宣告陣列維度但變數並不是宣告為 Array。 宣告了陣列的參數,但忘了宣告陣列格式的變數,兩邊對不起來
陣列參照不正確。 宣告陣列後,必須按陣列的格式來assign值或變數,而不能像非陣列的assign方式,例如宣告了一個陣列如下:array:arr1[5](0);arr1[1]=1; 這樣寫是可以的,但不能寫成

arr1=1; 因為在陣列中的每一個變數都是獨立的,不能透過這種語法想要一次assign所有陣列的值都是1

同樣的,也不能寫成

value1=arr1;

因為左邊是一個變數,右邊是一個陣列。
另外維度兩邊對不起來時也可能出現陣列參照不正確的訊息

陣列(Array)宣告不支援超過9維的維度。 這種情況代表使用者宣告的陣列維度超過九個,這超出了系統所能提供的上限。

 

 

當編譯後出現錯誤訊息後,即可根據上面表格的說明,找出錯誤的原因並且加上修正,如此一來可以縮短程式開發的速度,並且讓程式可以忠實呈現使用者的想法。

 

 

 

xqlite banner

魚骨圖在投資決策上的實踐方式

魚骨圖又被稱為特性要因圖,是經理人們常用的工具,在要解決一個問題時,透過魚骨圖的方式,列出會影響結果的每個重要環節,然後透過腦力激盪,找出每個重要環節的核心要素。在進行投資決策時,魚骨圖也是一個蠻好用的工具,可以讓我們找出真正會影響股價波動的要素。

以下圖為例

魚骨圖範例

我每天都會把漲幅較大,且有一定成交量的股票,拿出來研究一翻,然後我歸納出這些股票常有的共同特徵

1.線型上在上昇趨勢中

2.籌碼是穩定的

3.今天開盤就明顯比較強

所以我就試著以魚骨圖的方式,列出要符合上述三個特徵,它們各別的要素是什麼,然後把這些要素寫成腳本

//先準備需要被拿來運算的資料
value1=GetField("法人買賣超張數");
value2=GetField("主力買賣超張數");
value3=GetField("融券增減張數");
value4=q_BoughtLotsAtOpen;//開盤委買張數
value5=q_SoldLotsAtOpen;//開盤委賣張數

//先宣告魚骨圖的魚骨數並先為false
condition1=false;
condition2=false;
condition3=false;
//描述魚骨在什麼情況下由false變成true
if value1[1]>0 and value2[1]>0 and value3[1]>0 
then condition1=true; //符合籌碼穩定的條件
//===============MACD =================================
input: FastLength(12,"DIF短期期數"), SlowLength(26,"DIF長期期數");
input: MACDLength(9,"MACD期數");
variable: difValue(0), macdValue(0), oscValue(0);
MACD(weightedclose(), FastLength, SlowLength, MACDLength, difValue, macdValue, oscValue);

if oscValue > 0 and average(close,5)>average(close,20)
then condition2=true; //符合上昇趨勢的條件

if open > close[1]*1.015 and value4>highest(value4[1],20) or value4-value5>200
then condition3=true; //符合開盤走強

if condition1 and condition2 and condition3
then ret=1;

這個腳本的結構,主要是用condition1………到conditionN來界定投資決策的重要環節,然後列出所有該環節底下的核心要素,並寫成條件式,然後再透過關係運算子and或是or來建構核心要素與該環節的成立要件,而投資決策的形成,必須是所有環節都成立。

在語法上,它的架構就如下圖

魚骨圖架構

在擬定交易策略時,針對當沖,隔日沖,短線,波段等不同的交易方式,會影響績效的環節不會一樣,每個環節裡的核心要素也不一樣,我的研究方法是把不同交易方式裡成功的例子拿出來研究,尋找真正會影響績效的環節,然後再透過各種嚐試及回測,找出最能代表每個環節表現的核心要素,然後透過上述的語法結構,完成一個投資決策的腳本。各位不妨試著以類似的方法完成自己的交易決策魚骨圖,然後根據上面的語法範例完成自己的投資決策腳本。

 

xqlite banner

 

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

檢查表(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

 

 

 

 

 

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

 

xqlite banner

 

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

 

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

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

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

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

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

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

 

xqlite banner

 

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

 

 

 

xqlite banner

 

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

現在的上市櫃股票超過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

 

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

 

xqlite banner

 

 

大盤不錯才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

 

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

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

 

xqlite banner

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

最近朋友傳來一篇文章,網址如下: 大意是說有位不到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

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

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

 

xqlite banner