Author Archives: 發財橘子

脫歐後的交易策略探討~開低殺低後重新站回開盤價的隔日沖勝率

英國脫歐搞得全球股市大跌,短線上,什麼訊號才是止跌訊號,應該是大家比較關心的課題,以前老營業員有個口訣,開低殺低後若站回開盤價之上,可以搶短,我想今天就用實證回測的數據,來跟大家探討,這樣的口訣,到底對不對? 可以應用在什麼樣的股票? 可以應用在什麼樣的情況?

首先當然是先把口訣寫成一個腳本

input:ratio(10,"近十日最小下跌幅度");
if open*1.025<close[1]//開盤重挫
and close>open //收盤比開盤高
and close*(1+ratio/100)<close[9]
//近十日跌幅超過N%
and low*1.01<open
//開低後又殺低
then ret=1;

我用的是日線,首先我先前十天的下跌幅度是訂在10%,持有最大期數訂為兩天,然後我用有量的中小型股票去跑,過去三年的回測報告如下:

062601

我們可以發現,這樣的設定在大盤急挫的時候,還是會虧錢,於是,我就把過去十天的下跌幅度放大到15%,20%,25%,以下是他們分別的回測報告

過去十天跌幅超過15%的股票勝率提高到55%062603

當近十日跌幅超過兩成時,勝率進一步提昇到59.6%

062604

如果把十日跌幅設定在25%,勝率更超過六成,達到63%

062605

不過如果把跌幅再往上拉,勝率反而就下滑了,這樣的現象顯示,對於有量的中小型股而言,隨著大盤的利空而下跌,跌到有一天,開低下殺後,如果能回到開盤價之上且站穩到收盤,隔天有六成以上的機率,還有高點可以獲利了結。

我也試著把這個腳本用權值股去跑,結果我發現效果並不好

062602

顯示賺的時候小賺,賠的時候是大賠,代表權值股逆勢持續拉昇的力道是比較不夠的。

 

值此大盤危疑之際,這個策略的實證數字告訴我們,在操作上,要搶急跌後的短線,有三個原則

1.要有量的中小型股

2.近期要跌的夠慘

3.開低走低後若能站回開盤價且站好站穩

那就有六成的機率明天有比今天收盤價高的價位可以賣。

 

 

xqlite banner

 

 

 

 

外盤量異常突出的買進策略

昨天有網友希望我寫外盤量相關的交易策略,我這個標準差魔人第一時間想到的就是用bbnad,試寫了一下,效果還可以,敬呈批閱。

我的思考邏輯是

1.拿外盤量這個欄位來計算(因為用getfield語法,這欄位只support日線以上,所以用日線)

2.計算外盤量佔總量的比重

3.因為一天的暴量有可能是一日行情,所以外盤量比重取三日移動平均

4.拿外盤量比重三日平均算bband

5.如果bbandwidth從底部翻揚,代表從平凡要轉向絢爛

6.如果外般量比重三日平均突破bband上限,代表這個轉向是往多頭轉

根據上述的邏輯,我寫了以下的指標,

var:bv(0),bva(0);
if volume<>0 then 
bv=GetField("外盤量")/volume*100;
bva=average(bv,3);

input:length(20);
variable:up1(0),down1(0),mid1(0),bbandwidth(0);
up1 = bollingerband(bva, Length, 1);
down1 = bollingerband(bva, Length, -1 );
mid1 = (up1 + down1) / 2;
bbandwidth = 100 * (up1 - down1) / mid1;
plot1(up1);
plot2(down1);
plot3(bva);
plot4(bbandwidth);

我用郭董最近講的很豪邁的2317鴻海來作例子

062305

各位可以發現,在郭董說話的前一陣子,外盤買進佔成交量的比重就出現我上面說到的多頭訊號

1.bbandwidth 向上翻揚

2.外盤量三日均線突破bband上限

我就把這個指標改寫成交易策略如下:

var:bv(0),bva(0);
if volume<>0 then 
bv=GetField("外盤量")/volume*100;
bva=average(bv,3);

input:length(20);
variable:up1(0),down1(0),mid1(0),bbandwidth(0);
up1 = bollingerband(bva, Length, 1);
down1 = bollingerband(bva, Length, -1 );
mid1 = (up1 + down1) / 2;
bbandwidth = 100 * (up1 - down1) / mid1;
if bbandwidth cross over 20
and bva cross over up1
then ret=1;

拿這策略拿有量的中小型股去回測半年,一年,兩年及三年,回測報告分別如下:

062301 062302 062303 062304

 

當然這個策略還可以有進一步優化的空間,但初步的結果,應該算是一個可以拿來好好運用的方法。

 

xqlite banner

當沖腳本之開高不拉回後的創新高

連著介紹了基金投資,波段操作的一些腳本,結果被同事笑說不食人間煙火,他們說大家既不會選股也看不懂國際財經情勢,最好能介紹那些可以每天當沖的交易策略,只要能賺多賠少,回家前平倉無掛念,這樣才是王道。

為了滿足同事們的需求,接下來我盡量多介紹一些當沖的交易策略,首先要跟大家介紹的當沖策略,它的成形必須具備幾個條件

1.大盤多頭。加權指數5日均線大於20日均線。

2.開高。 開盤價要比昨收價高出2.5%以上。

3.不拉回。開盤後超過一定時間最低價不低於最高價的1.5%

4.創新高。 開高不跌後一旦再創新高就買進。

從分時圖來看,就是類似下面的這張圖

062203

要滿足上述四個條件,我寫的腳本如下:

if barfreq <>"Min" or barinterval<> 1
then raiseruntimeerror("歹勢,本腳本只適用於1分鐘線");

var:count(0);
count=count+1;
if date<>date[1]
then count=1;
 
if GetField("開盤價","D")> GetField("收盤價","D")[1]*1.025
and count>5
and lowest(low[1],count-1)*1.015>highest(high[1],count-1)

and close =highest(high,count)
then ret=1;

這個腳本是用1分鐘線及日線的跨頻率寫成的,其中最重要的概念就是1分鐘線開高後要維持一陣子,我自己實驗的結果,開高後橫盤10分鐘以上再創新高,其勝率比橫盤5分鐘的勝率高

這是最近的多頭走勢裡,橫盤五分鐘以上創新高的回測報告,

062202

如果改成橫盤10分鐘以上,回測的數據如下:

062204撐十分鐘以上

交易次數只比五分鐘的少了一點,在最近一個月裡也是有35次交易的機會,勝率是57.14%,總報酬是17.2%,以當沖策略來看,這樣的數據應該算是很不錯了。

如果把盤整的時間拉長到超過20分鐘,在過去一個月有25次的交易機會,其中16次可以順利獲利了結,勝率是64%,總報酬達19.84%

0622 20

這個策略的迷人之處在於,如果我們把同樣的邏輯用在空頭策略,我們可以寫出下面的放空腳本

if barfreq <>"Min" or barinterval<> 1
then raiseruntimeerror("歹勢,本腳本只適用於1分鐘線");

var:count(0);
count=count+1;
if date<>date[1]
then count=1;
 
if GetField("開盤價","D")*1.025< GetField("收盤價","D")[1] 
and count>10
and lowest(low[1],count-1)*1.015>highest(high[1],count-1)

and close =lowest(low,count)
then ret=1;

這個腳本近一個月的回測報告如下

062205

意思是雖然最近一個月指數是多頭,但用這個策略放空依然是work的

所以我們就可以試著在盤中兩頭都作,這樣不管大盤是拉尾盤還是殺尾盤我們都不用害怕。

以上是第一個當沖的策略腳本,我們下次見

 

xqlite banner

定存股該不該波段操作?

定存股怎麼操作比較好? 我的建議是buy and hold!!

why?   有數字為證

首先我們先來定義什麼是定存股,我設了四個條件

1.年營收要大於十億元。有一定的經營規模比較不會受到單一客戶或特殊事件的影響。

2.連續五年營收每年就算衰退也不會超過5%。代表本業穩固

3.連績五年每年EPS超過兩元。

4.毛利率沒有掉的很兇。

其中第四項用條列式挑不出來,所以我寫成腳本如下

value1=GetField("營業毛利率","Q");
input:ratio(10,"毛利率單季衰退幅度上限");
input:period(10,"計算的期間,單位是季");

if trueall(value1>value1[1]*(1-ratio/100),period)
then ret=1;

台股中符合這四項的股票共有83檔

062102

 

 

如果在三年前買進這八十三檔,然後不除權息,其中63檔賺錢,20檔賠錢,平均報酬率是42.63%。

同時期加權指數是漲了8.05%

當然這種買下去就一直抱的操作方式不見得大家會接受,所以我也試著用波段的方式來操作,波段操作有三種方法,一種是大盤週線突破月線時買定存股,另一種則是不管大盤,個股週線突破月線時進場,最後一種則是大盤週線大於月線且個股週線突破月線時進場

第一種的回測報告如下:

062101

這個回測報告是以進場後持有70天為計算基礎

第二種的回測報告如下

062103

第三種的回測報告如下:

062104

我們從這三種不同的回測報告可以發現,如果我們把定存股拿來作市場時機操作,在大盤多翻空時出場,在大盤空翻多時進場,確實可以降低系統風險,但不會讓報酬率比buy and hold的操作方式高到那裡去,但交易次數會多上很多。

如果我們把定存股再作篩選,只留下那些護城河很高的股票(如下圖),

062105那麼不管用上面的那一種方法,風險會降低,但報酬率及每一筆的平均報酬不會更好,勝率也沒有比用83檔時高。

總的來說,

1.定存股如果條件寬鬆一點,且用buy and hold,長期下來,勝率最高,平均報酬率也最高,但在空頭市場跌起來也夠嚇人。

2.如果把條件定嚴一點,然後用buy and hold,長期下來,勝率OK,風險最低,總報酬也夠 迷人。

3.Play market timing時,在大盤空翻多時才進場,可以降低風險,但報酬率會拉低。

以上大約是我把定存股拿來回測時觀察到的現象,或許未來我如果有找到適合定存股的交易策略時,再來跟大家報告

 

xqlite banner

 

 

找大碗底型態的大型股

每次都用有量的中小型股當投資標的,生性保守的朋友說能不能介一些適合大型股的交易策略,最好是進出次數不要太多的。我試了幾種方法,發現大股票在多頭市場出現大碗底型態時,績效不錯,推荐給大家。

 

所謂的大碗底,就是類似像下面這種型態的股票

061602

上圖在紅色箭頭處附近呈現了一個碗狀的底部區。

為了尋找這類型的股票,我寫了一個腳本如下:

value1=lowestbar(low,100);
value2=lowest(low,100);
value3=highestbar(high,100);
value4=highest(high,100);
 
if value4>value2*1.2
and value3-value1>15

then begin
if value1>15
and value2*1.05>close[1]
and average(volume[1],15)<5000
and close>close[1]*1.02
and volume>average(volume[1],15)*1.2
and GetSymbolField("tse.tw","收盤價")>
average(GetSymbolField("tse.tw","收盤價"),20)


then ret=1;
end;

我用這個腳本去跑大型股,回測報告如下:

061601

兩年的時間總交易次數是43次,其中23次賺錢,但賺錢時賺10%,虧錢時虧5%,手氣最差的時候是連續虧了17.56%,意思是在權值股及中型100成份股中,如果出現這樣的碗型底,站在買方是值得一試的交易

不過如果拿去跑小型股,出來的數字就不優了。

之所以這個腳本比較適合大型股,原因在於大型股的籌碼比較凌亂,需要比較長的時間來整理及換手,所以比較容易出現較長時間的落底打底過程。

 

 

xqlite banner

周線,日線跟60分鐘線兼顧的交易策略

以前老師父教我們用週線抓波段,用日線抓進場日期,用60分鐘線抓交易時機,他們總是要我們週線日線及60分鐘線要同時看,所以我們看盤的螢幕就愈來愈大,愈來愈多,做為後生小輩,師父的話都有聽,但坦白說,知其然,不知其所以然,後來讀到一本書,Alexander Elder的著作: “Trading for a living”,這是一本同時使用不同頻率來制定交易策略的著作,我試著參照書裡的思考邏輯,寫出對應的交易策略,回測的效果還不錯,跟大家分享這個策略,各位不妨以此為基礎,進一步調整成勝率更高的私房策略。

在這本書裡,Alexander 提出了一個觀念: 叫作三重濾網交易系統(Triple Screen Trading System),它的概念是把股價波動的趨勢分成三種,一是主趨勢,二是中期趨勢,三是短期趨勢,他用Tide(潮汐),波浪(Wave)與小漣漪(Ripple)三種海浪的變化來代表這三種不同的趨勢,顧名思義,潮汐是長線的主要趨勢,漲潮時,海水會愈來愈逼近海岸,退潮時則海水會離海岸愈來愈遠。在漲潮退潮的過程中,海浪則是一波波打向岸邊,不斷地往前衝然後後退,漣漪則是海浪踫到不同地形地物時所激起的浪花,雖然漂亮而惹人注目,但對於大方向無關緊要。

Alexander的三重濾網交易系統的概念就是

1.掌握主要趨勢。(週線)

2.在短期超買超賣後尋找進場時機(日線)

3.從股價的波動中確認進場點(盤中)

這樣的觀念,等於在一個交易系統中,同時使用了週線,日線及盤中洗價(例如60分鐘線)這樣的概念,這是一個跨三種頻率的交易策略,這樣的策略該怎麼建構呢?

首先是挑選週,日及60分鐘所用的指標及觸發條件

第一重看長線,可以用趨勢型的指標,所以我挑選MA移動平均線

第二重是要找在長線上昇趨勢中的回檔相對低點,所以我選擇動能指標MTM

第三重則是用突破型交易策略,當60分鐘線創20小時來新高。

這三者合在一起,就可以找出在對的趨勢裡,短期整理後又重新往趨勢前進的股票。

根據上述的邏輯,對應的腳本如下:

//週線多頭排列
if GetField("收盤價","W")
>=average(GetField("收盤價","W"),4)
and 
average(GetField("收盤價","W"),4)
>=average(getfield("收盤價","w"),15)
and 
//日線動能小於0
GetField("收盤價","d")-GetField("收盤價","d")[10]
<0
then begin
//60分鐘線創20小時來新高
if close=highest(high,20)
then ret=1;
end;

用這個腳本去作六個月期及三年期回測,跑有量的中小型股,回測報告如下圖

061901

 

061902

其實我也試著把大型拿來用這個策略跑過,雖然總報酬率還是有300多%,但勝率只有39%,效果還是遠不如有量的中小型股票好

 

在寫這種跨頻率腳本時,要特別留意資料對齊的問題,所以非基準頻率的欄位,最好不要透過宣告變數來使用。直接用引號[x]來代表前x期的該欄位數據,才能精準的取得前x期的數據。

跨頻率的交易策略我覺得確實值得一試,推薦給大家。

 

xqlite banner

從OTC與加權指數表現落差觀察大盤轉折點

 入行27年,用新台幣,學到了不少經驗,其中一個是,”當大家都不好的時候,代表大環境讓公司派偏空,這樣的大環境如果無法改善,連原本還可以的公司,也會不如預期”。

因為這樣的經驗,我一直相信一個原則,那就是”行情要落底,OTC的股票要先抗跌 ,行情要作頭,OTC的股票先回頭”。

這樣的經驗來自民國84年,前一年是大多頭,隔年call公司時,我發現大部份的公司都說的很保守,特別是那些股本不大的公司,受景氣影響波動會比較大的公司,好不容易看到一家表現還比83年好的,二話不說,我就全押在這一檔身上,不只自己押,我還敲鑼打鼓叫親朋好友也都押,一開始大部份的股票在下跌時,這檔還很抗跌,甚至還逆市上漲,但隨著大環境的持續惡化,這家公司開出來的數字跟原先的預期還是有些落差,最後還是跌了下來,那一次對我是很大的打撃,我有位很要好的朋友因為這一檔,把原本要買房子的錢都賠光了,從此,我很留意中小型公司對於未來業績的看法,因為我發現,當一整片都悲觀的時候,樂觀的,後來會被證明太樂觀。

最近XS支援跨商品時,我試著想把這樣的觀察用數據來印證,我試著用一個指標來印證我的觀察, 底下的腳本就是這個指標,我稱之為小型股表現指標。

這個指標的腳本如下:

input:period(5,"移動平均天期");
value1=GetSymbolField("otc.tw","收盤價");
value2=rateofchange(value1,2);
value3=rateofchange(close,2);
if value2>=0 
then value4=value2-value3
else
if value2<0 and value2>=value3
then value4= absvalue(value3)-absvalue(value2)
else
value4=absvalue(value2)-absvalue(value3);
value5=average(value4,5);
plot1(value5);

這個指標是把OTC指數的漲幅減加權指數的漲幅相減,在把這數字作移動平均,畫出來的圖如下:

061402
一直以來,我有觀察到一個現象,那就是OTC的股票,公司派表態的情況比較普遍 ,所以指數落底前,OTC會先抗跌,相反的,OTC漲不動,加權指數再漲的話 ,反轉的機率會昇高。

這些年,我之所以還能存活在市場上,我自己覺得有兩個重要因素,一個是我會控制持股比例,不再重押全梭,另一個則是,透過一些指標及數據,我站對邊的機率變高了,特別是在反轉的過程中,我會更警覺,會更小心。

這可能也是我漸漸從消息面操作者,變成數據派操作者的關係吧,我想。

xqlite banner

有量的中小型股才是操作者的核心標的

是不是盤好的時候買什麼都一樣?我寫了一個腳本如下,就是當大盤週線在月線之上時,個股不需要其他條件就直接進場。

if average(GetSymbolField("tse.tw","收盤價"),5)>
average(GetSymbolField("tse.tw","收盤價"),20)
then ret=1;

首先我拿這腳本來跑所有股票

060904

看這回測報告就知道,就算大盤很好,亂槍打鳥還是會輸的很慘。

接下來我用同樣的腳本跑權值股及中型100成份股,底下是回測報告

060905

原本認為權值股及中型100會比較貼近大盤,實際上去跑回測反而輸的更慘

權值股不見得能順著大盤上漲,那麼我就不跑大型股,換作來跑股本10億以下的小型股,一共有719檔,底下是回測報告。

060906

勝率只有36.51%,總報酬雖然很好,但那是總交易次數推出來的,基本上算是隨波逐流。

 

最後還是用我最常用的有量的中小型股下去跑(五日均量超過1000張,股本小於40億),下面是回測報告。

060907

這個勝率41%,然後淨值上下波動的幅度沒有前幾種大,意思是盤如果不錯,這些股票是能漲的,但如果盤不好,這些股票還是會跌的很慘,可是我們漲的時候停利用10%,跌的時候停損用5%,也就是贏一次就可以抵掉輸了兩次,也因此三年下來才會出現5366%的總報酬率,但3年7706次的總交易次數還是太多,一年平均進場2500多次,一個月平均進場200次,一天進場10次,實在是太多了。

但從上面的實測,我們可以確定一點:” 有量的中小型股,是在大盤上漲時,最有機會展現一段多頭行情股票群體”

 

因此,我的思考的方向改成,”在大盤表現不錯的時候,透過一些方法,在這個群體中,找出真正轉強的股票”,試著濾掉那些無謂的交易次數。

例如以下的這個腳本

condition1 = GetField("投信持股")[1]<=1000 and getField("投信買賣超")[1]=0;

if H>H[1]
and TrueAll(condition1[1],60)
and GetField("投信買賣超")[1]*C>1000
and average(GetSymbolField("tse.tw","收盤價"),5)>
average(GetSymbolField("tse.tw","收盤價"),20)
then ret=1;

 

這個腳本就是在大盤好的時候,去尋找投信才剛剛介入的有量中小型股,

它的回測報告如下

060908

我們會發現,過去三年,才出現42次的觸發交易,淨值也不會像波浪一樣,呈現太大幅度的上下震盪,而是基本穩定往上走。

 

這樣的方法就是透過一個有效的策略,過濾雜訊,找出真正值得交易的訊號。

 

 

xqlite banner

 

 

盤上成交是否真的是重要指標?

老師父們一向很重視一檔股票今天有多少成交量是在盤上成交,他們認為,盤上成交代表的是買盤勇於用比前一天收盤價更高的價格來買進,這是一種積極性買盤的表徵,我試著以這樣的邏輯,建構出一個勝率還不錯的交易策略。

要算盤上成交的比例,XS有內建一個欄位叫上漲量,所以我就寫了一個簡單的自訂指標腳本

value1=GetField("上漲量","D");
if volume<>0
then value2=value1/volume;
plot1(average(value2,5));

但寫完之後覺得這樣似乎完全沒有考慮到當天分時交易的多空拼搏,所以我又另外用一分鐘線最後是收在昨日收盤價之上與否,來決定是否把那一分鐘的成交量納入累積的盤上成交量,根據這個原則,寫了另一個自訂指標腳本如下

array: x[240](0);
var:i(0);

for i=1 to 240
begin
if GetField("收盤價","1")[i-1]>close[1]
then 
x[i]=GetField("成交量","1")[i-1]
else
x[i]=0;
end;
value1=array_sum(x,1,240);
if volume<>0
then 
value2=value1/volume;
value3=average(value2,5);

plot1(value3);

這個腳本我是宣告一個陣列來代表每天的240根1分鐘線我要被加計進量的成交量,如果當根1分鐘線的收盤價大於前一天日線的收盤價,那麼當根1分鐘線的成交量就被算進來,不然陣列的那一格就是0,然後我再用array_sum這個把陣列裡每個值全部都加總起來的函數來計算這240格的總和,這就是當天1分鐘線收在盤上的成交量總和。

然後再把這兩個指標跟加權指數擺在一起看,會如下圖

060903

從這張圖我們可以明顯的看到,當這個值由低檔往上走的時候,代表積極性的買盤,佔整個買盤的比重在成長,這往往是止跌回昇的前兆,而用1分鐘線來計算的盤上累計成交量,由於考慮到每一分鐘多空拼搏的角力,其數字對多空趨勢又比單純用上漲量來得敏感許多,所以我就用1分鐘線的累積盤上成交量作為策略的核心,寫了下面這個腳本

array: x[240](0);
var:i(0);

for i=1 to 240
begin
if GetField("收盤價","1")[i-1]>close[1]
then 
x[i]=GetField("成交量","1")[i-1]
else
x[i]=0;
end;
value1=array_sum(x,1,240);
if volume<>0
then 
value2=value1/volume;
value3=average(value2,5);
if value3 cross over 0.2
and GetSymbolField("tse.tw","收盤價","D")
>average(GetSymbolField("tse.tw","收盤價","D"),10)
and volume>average(volume,20)*1.2
then ret=1;

要特別說明的是,我依然只跑有量中小型股,停利用10%,停損用6%

這部份的回測蠻花時間,所以我試跑了最近三個月,回測報表如下

060909

 

各位不妨也試試看用盤上成交比例這樣的概念來開展自己的交易策略。

 

xqlite banner

有沒有多空都能賺錢的交易策略??

“我希望有一個策略,大盤在漲的時候我會賺錢,大盤在跌的時候我也會賺錢。” 這是先前來學程式交易的某網友,許的願望。(我很想跟他說你直接叫我乾爹,我給你零用錢比較快)

不過正所謂需求創造供給,這陣子有空就在想如何建構一個多空都要能賺錢的交易策略,搭捷運時想,走路時想,有時候連睡覺前都在想,想來想去,想到了一招,我寫了一個小程式,似乎可行,今天就來跟大家分享這個嚐試。

請大家先看下面這張圖

0050 and 00632r

TSE,0050及00632R擺在一起看,TSE漲時,0050會漲,TSE跌時,00632R會漲,所以我們如果有個策略,可以抓到多空轉折點(不用太精準,大勢看對有接對就行),那麼應該可以實現一個策略多空都賺的願望。

於是,我寫了一個腳本如下: 用0050及00632R這兩檔ETF去跑

if symbol="0050.TW"
then begin
if average(GetSymbolField("tse.TW","收盤價"),5)
crosses over average(GetSymbolField("tse.TW","收盤價"),20)
then ret=1;
end;

if symbol="00632R.TW"
then begin
if average(GetSymbolField("tse.TW","收盤價"),5)
crosses under average(GetSymbolField("tse.TW","收盤價"),20)
then ret=1;
end;

今年以來,回測的報告真的不錯

060701

如果從00632R上市的時候2014年11月起跑回測,也還OK

060702

這個腳本的概念就是當加權指數週線突破月線時進場買0050,當週線跌破月線時,進場買00632R

用這個方法,會輸錢都是輸在均線假突破跟假跌破,至於怎麼濾掉假突破跟假跌破,先賣個關子,下次有機會再來討論

在腳本中有用到symbol這個函數,它的用法是

symbol=”商品代碼”

不過這邊有個小陷阱,商品代碼的英文字母記得一定要用大寫,小寫電腦不認識。

 

 

xqlite banner