Author Archives: 發財橘子

重獲市場垂青的低價股

要怎麼判斷一檔低價股開始重新獲利市場的青睞? 例如像底下達運這樣的走勢呢?

2017121202

我的老市場朋友給了我兩條不算複雜的規則

規則一: 資金明顯回流到這檔股票

規則二: 連續多日主力買超

就這麼簡單嗎?

哦! 還有一個是盤不能太差

意思是大盤不太差時如果低價股出現資金明顯回流且主力連續多日買超,就該留意。

問題來了,資金要回流到什麼程度才算呢?

於是我寫了以下的腳本,回測了幾個不同的比例,最後發現,如果資金流向的比例是過去60天移動平均的四倍,回測出來的勝率最高,以下是我寫的腳本

//所有股票
//進場後20天出場

value1=GetField("資金流向");
value2=GetField("主力買賣超張數");

if value1 crosses over average(value1,60)*4
//資金流向明顯回昇
and trueall(value2>200,5)
//過去五日主力都買超超過兩百張
and tselsindex(10,6)=1
//大盤外資買多於賣
and close<40
//股價不高於40元
then ret=1;

回測報告如下

2017121301

大家也可以用這個簡單的腳本作基礎,調整資金回流的比例,然後再加上其他技術面的條件,可能會有更好的結果。

綜合抄底策略

近期的股價修正,讓抄底策略開始有了用武之地,之前跟大家提過,在股價修正四成之後,有不少抄底型的交易策略勝率會大幅攀昇,今天跟大家介紹的方法是,把不同的抄底策略全部綜合在一個腳本中,只要股價修正超過四成之後,符合其中任何一種現象,都會觸發訊號。

自從有了XS之後,我應該寫超過500個腳本,回測下來,跌幅超過四成後的各種訊號,勝率真的比較高。

例如到昨天收盤價為止,近百日跌幅超過四成,成交量超過五百張且股價高於十元的股票如下圖

2017120201

這些股票反彈起來,有不少還真的是又兇又猛。

並不是所有跌四成的股票都能買,之前跟大家分享過幾個抄底策略,如果下跌四成後又出現這些現象,進場作多的勝率往往超過六成。我把這些策略綜合在一個腳本中,希望可以節省各位的時間,

我寫的腳本如下

if close*1.4<highest(close,60)then begin
variable:count(0);
count=0;
//之前無長紅,最近兩根長紅
input:ratio(5,"長紅的漲幅下限");
if countif(close[5]>=close[6]*(1+ratio/100),60)=0
and countif(close>=close[1]*(1+ratio/100),5)>=2
then count=count+1;

//均線糾結後上漲
input: s1(5,"短期均線期數");
input: s2(10,"中期均線期數");
input: s3(20,"長期均線期數");
input: Percent(2,"均線糾結區間%");
input: Volpercent(25,"放量幅度%");
//帶量突破的量是超過最長期的均量多少%
variable: shortaverage(0);
variable: midaverage(0);
variable: Longaverage(0);

if volume > average(volume,s3) * (1 + volpercent * 0.01)
//放量25%
and lowest(volume,s3)<1000
//區間最低量小於一千張
and volume>2000
//今日成交量突破2000張
then begin
shortaverage = average(close,s1);
midaverage = average(close,s2);
Longaverage = average(close,s3);
value1= absvalue(shortaverage -midaverage);
value2= absvalue(midaverage -Longaverage);
value3= absvalue(Longaverage -shortaverage);
value4= maxlist(value1,value2,value3);
if value4*100 < Percent*Close
and linearregangle(value4,5)<10
then count=count+1;
end;
//低檔五連陽
if trueall(close>open,5) 
then condition3=true;
//急拉
value11=barslast(close>=close[1]*1.07);
if value11[1]>50
//超過50天沒有單日上漲超過7%
and value11=0
//今天上漲超過7%
and average(volume,100)>500
and volume>1000
then count=count+1;
//連續跳空上漲

if countif(open > close[1],5)>=3
//過去五天有三天以上開盤比前一天收盤高
and average(volume,5)>2000
//五日均量大於2000張
then count=count+1;

//連續多日價量回溫
input:period(5,"回溫期數");
value21=GetField("資金流向");
value22=GetField("強弱指標","D");
if countif(value21>value21[1]and value22>0,period)>= 4
and volume>average(volume,20)*1.3
then count=count+1;

//主力回頭收集
input:period1(20);
value31=GetField("分公司賣出家數")[1];
value32=GetField("分公司買進家數")[1]; 
if linearregslope(value31,period1)>0
//賣出的家數愈來愈多
and linearregslope(value32,period1)<0
//買進的家數愈來愈少
and 
close*1.03<close[1]
//今天又跌超過3%
 
then count=count+1;


if count>=1 then ret=1;
end;

我拿這個腳本去回測,並且對照單一腳本在沒有選股,沒有大盤濾網下的回測數據,作成以下的這張表

抄底策略統計表

以上是跑所有股票,回測過去兩年,二十天後出場的回測數據比較。

這個綜合的策略,交易次數夠多,勝率也夠高,除了在大空頭市場之外,表現非常的平穩。

抄底策略不只這幾個,例如我先前介紹過的大跌後的吊人線等,各位可以把收集得到,勝率夠高的策略都用同樣的寫法放在一起,這是小弟我認為最靠譜的交易策略了。

這種抄底策略的另一個好處是,停損點很好設,破底就停損。

雞尾酒策略雷達的函數化

因著雲端策略中心愈來愈普及於券商的下單系統,開始出現一種需求,希望可以綜合多個交易策略來考量,只有在特定幾個交易策略近N天內出現多個以上的交易訊號時才出現進場訊號。 這個需求PM應該是有收到,但考慮到 XQ一年才換三次版,且前面已經排了不少需求,所以我想從腳本下手,找出一個方法可以綜合多個腳本考量後再出訊號。

我想舉雲端策略中心裡的例子來跟大家說明這個方法

假設雲端策略裡長線作多的策略裡,我訂閱的策略如下表

2017121001

共有

1.跌不下去的高殖利率股

2.股價突破籌碼沈澱區

3.投信強買發動

4.爆量剛起漲

5.突破糾結均線

6.低PB股的逆襲

7.即將鎖第一根漲停的中小型股

一共七個策略,或希望如果這個七個腳本有超過兩個在三天內都有出訊號時,系統再通知我,我的作法是寫一個函數來計算近三天這七個腳本共出現多少個訊號。

我寫的函數腳本如下:

var:count(0);
count=0;

condition1=false;
condition2=false;
condition3=false;
condition4=false;
condition5=false;
condition6=false;
condition7=false;

//跌不下去的高殖利率股

 
condition8 = L = Lowest(L,20);
condition9 = H = Highest(H,20);
 
if GetSymbolField("tse.tw","收盤價")
>average(GetSymbolField("tse.tw","收盤價"),60)
//大盤處於多頭市場
then begin 
 if condition9
 //股價創區間以來高點
 and TrueAll(Condition8=false,20)
 //這段區間都未破底
 and close<close[19]*1.05
 //區間股價漲幅不大
 then condition1=true;
end;

if barslast(condition1=true)<3
then count=count+1;

//股價突破籌碼沈澱區

condition10=false; 

if v[1] > 0 then value1 = (v[1] - GetField("當沖張數")[1])/v[1];
//實質成交比例
 
if value1[1] >0 then value2 = 100*value1/value1[1]-100;
//實質成交比例日變動百分比
value3 = standarddev(value2,5,1);
//實質成交比例日變動百分比的不同天期標準差
value4 = standarddev(value2,10,1);
value5 = standarddev(value2,20,1);
if value3 = lowest(value3 ,20) and
 value4 = lowest(value4 ,20) and
 value5 = lowest(value5 ,20) 
//現在各不同天期的成交比例日變動百分比標準差都處在期間最低點
then condition10=true;
 
// 成交量判斷
 

if tselsindex(10,6)=1
and condition10 
and close crosses over highest(high[1],10)
then condition2=true;
if barslast(condition2=true)<3
then count=count+1;

//投信強買發動

variable: SumForce(0), SumTotalVolume(0),Kprice(0), Kdate(0);
SumForce = Summation(GetField("投信買賣超")[1], 3);
sumTotalVolume = Summation(Volume[1], 3);

if SumForce > SumTotalVolume * 15/100 And Average(Volume[1], 5) >= 1000 then 
begin
 Kprice =highest(avgprice[1],3);
 Kdate = date[1];
end; 

Condition11 = C crosses above Kprice and datediff(date, kdate) <= 60; 
Condition12 = Average(Volume[1], 5) >= 1000;
Condition13 = Volume > Average(Volume[1], 5) * 1.2;
Condition14 = C > C[1];
condition15 = tselsindex(10,6)=1;
if Condition1 And Condition2 And Condition3 And Condition4 And condition5
then condition3=true;
if barslast(condition3=true)<3
then count=count+1;


//爆量剛起漲

 
Condition16 = H=highest(H,60);
 //今日最高創區間最高價
 
Condition17 = V=highest(v,60);
 //今日成交量創區間最大量
 
Condition18 = highest(H,60) < lowest(L,60)*(1 + 14*0.01);
 //今日最高價距離區間最低價漲幅尚不大
 
if Condition1 And Condition2 And Condition3
and tselsindex(10,6)=1
then condition4=true;
if barslast(condition4=true)<3
then count=count+1;

//突破糾結均線
variable: Shortaverage(0),Midaverage(0),Longaverage(0);
variable: AvgHLp(0),AvgH(0),AvgL(0);

//透過Z的時間安排來決定現在用的是那一根Bar的資料 
variable: Z(0);
if currenttime > 180000 
or currenttime < 083000 then 
 Z =0 
else 
 Z=1;

Shortaverage = average(close,5);
Midaverage = average(close,10);
Longaverage = average(close,20);
AvgH = maxlist(Shortaverage,Midaverage,Longaverage);
AvgL = minlist(Shortaverage,Midaverage,Longaverage);

if AvgL > 0 then AvgHLp = 100*AvgH/AvgL -100;

condition19 = trueAll(AvgHLp < 5,20);
condition20 = V > average(V[1],20)*(1+25/100) ;
condition21 = C > AvgH *(1.02) and H > highest(H[1],20);
condition22 = average(volume[1], 5) >= 1000; 
condition23 = tselsindex(10,6)[Z]=1;

if condition19
and condition20 
and condition21 
and condition22
and condition23
then condition5=true;
if barslast(condition5=true)<3
then count=count+1;

//低PB股的逆襲

if GetSymbolField("tse.tw","收盤價") > average(GetSymbolField("tse.tw","收盤價"),10)
then begin
 if close<12
 and H = highest(H,20)
 and close<lowest(low,20)*1.07
 and highest(h,40)>close*1.1
 then
 condition6=true;
end;
if barslast(condition6=true)<3
then count=count+1;

//即將鎖第一根漲停的中小型股
 
Condition24 = Close >= GetField("uplimit") * (1 - 1/100);
Condition25 = TrueAll(Close < GetField("uplimit"), 20);
Condition26 = Average(Volume, 5) >= 1000;
Condition27 = Close > Highest(High[1], 20);
Condition28 = Volume >= Highest(Volume[1], 20);
Condition29 = GetSymbolField("tse.tw","收盤價") > average(GetSymbolField("tse.tw","收盤價"),10); 
if Condition24 And Condition25 And Condition26 And Condition27 And Condition28 and condition29
then condition7=true;
if barslast(condition7=true)<3
then count=count+1;
entrycount=count;

這個腳本的作法是用計數器的寫法來計算每個腳本是否符合三天內出訊號的條件,用barslast這個函數來計算特定策略三天內是否出現訊號,最後完成這個函數,透過這個函數寫的警示腳本就可以變的很簡單

if entrycount cross over 1 then ret=1;

有了這個函數之後,如果我們要找出這七個腳本在三天內不只出現一個訊號,一行就寫完了。

各位可以利用這樣的寫法,把同頻率的策略雷達合成一個腳本去跑,如果要當天同時都出訊號,就不要用barslast就可以。

透過這樣的方法,就可以達到綜合多個策略考量,當不只一個策略出訊號時才通知的效果。

 

 

 

大跌後出現什麼K線型態可以進場?

這一波的下跌來勢不善,陸續被問到大跌後踫到什麼情況可以進場買股票? 今天我從K線型態出發,來看看股價如果跌三成後,出現的幾種K線組合,那一種回昇的機率較高。

 

首先我寫了一個函數叫BKPatterm,把幾個常見的多頭反轉K 線組合都包含在這個函數裡,由於此函數回傳類型為字串型態,故新增函數腳本時記得回傳類型勾選"字串"

20171208_字串

我寫的腳本如下:

settotalbar(5);
condition2 = (minlist(open,close)-Low) > absvalue(open-close)*3; 
condition3 = minlist(open, close) > low* (100 + 2)/100;

if trueall( condition2 and condition3, 3)
then bkpatterm="三長下影線";


{[檔名:] 紅三兵 
[說明:] 連續三根上漲實體K棒 
} 
 
condition1= ( close - open ) >(high -low) * 0.75;
//狀況1:實體上漲K棒
condition4= ( close[1] - open[1] ) >(high[1] -low[1]) * 0.75;
//狀況2:前一根也是實體上漲K棒
condition5= ( close[2] - open[2] ) >(high[2] -low[2]) * 0.75;
//狀況3:前前根也是實體上漲K棒
condition6= close > close[1];
//狀況4: 上漲
condition7= close[1] > close[2];//狀況5:上漲
{結果判斷} 
IF 
 condition1
 and condition4
 and condition5
 and condition6
 and condition7
THEN bkpatterm="紅三兵"; 

condition8= ( open[2] - close[2] ) >(high[2] -low[2]) * 0.75;
//狀況1:實體下跌K棒
condition9= ( close[1] - open[1] ) >(high[1] -low[1]) * 0.75;
//狀況2:實體上漲K棒
condition10= high[1] < high[2] and low[1] > low[2];
//狀況3:前期內包於前前期
condition11=( close - open ) > 0.75 *(high -low);
//狀況4:當期實體上漲K棒
condition12=close > open[2];
//狀況5:現價突破前前期開盤價
IF condition8
 and condition9
 and condition10
 and condition11
 and condition12
THEN bkpatterm="內困三日翻紅"; 


condition13=open = High and close < open ;//狀況1: 開高收低留黑棒
 condition14=(high -low) > 2 *(high[1]-low[1]) ;//狀況2: 波動倍增
 condition15=(close-low)> (open-close) *2 ;//狀況3: 下影線為實體兩倍以上
 
IF condition13
 and condition14
 and condition15
THEN bkpatterm="吊人線"; 


condition16=(open[1] - close[1] ) >(high[1] -low[1])*0.75;
//狀況1:前期出黑K棒
condition17=( close - open ) >(high -low) * 0.75;
//狀況2:當期紅棒
condition18=high > high[1];
//狀況3:高過昨高
condition19=open<low[1];
//狀況4:開低破昨低 
IF condition16
 and condition17
 and condition18
 and condition19
THEN bkpatterm="多頭吞噬"; 

{ 
[檔名:] 多頭執帶 
[說明:] 開在最低點一路走高收在最高點附近的K棒 
}
condition20=close>open; 
condition21=(Close-Open)>(high-low)*0.9;
condition22=Close>Close[1]+high[1]-low[1]; 
IF condition20
 and condition21
 and condition22
THEN bkpatterm="多頭執帶"; 

{ 
[檔名:] 多頭母子 
[說明:] 前期收長黑K棒 今期開高小幅收紅不過昨高 
} 
 
 
condition23=( open[1] - close[1] ) >(high[1] -low[1])*0.75;
//狀況1:前期出長黑K棒
condition24=close[3]-close[2]<close[2]-close[1]; 
//狀況2:前期呈波動放大下跌
condition25=( close - open ) >(high -low) * 0.75;
//狀況3:當期紅棒
condition26=high < high[1];
//狀況4:高不過昨高
condition27=low>low[1];
//狀況5:低不破昨低
 
IF 
 condition23
 and condition24
 and condition25
 and condition26
 and condition27
THEN bkpatterm="多頭母子";

{ 
[檔名:] 多頭遭遇 
[說明:] 前期收黑K棒 當期開低走高紅棒嘗試反攻昨收 
}
 
condition28= (open[1] - close[1] ) >(high[1] -low[1]) * 0.75;
//狀況1:前期出黑K棒
condition29= close[1] < close[2];
//狀況2:前期收跌
condition30= ( close - open ) >(high -low) * 0.75;
//狀況3:當期收紅K棒
condition31= open < close[1] and close < close[1];
//狀況4:開低且收跌
condition32= low < low[1];//狀況5:破前期低點
{結果判斷} 
IF 
 condition28
 and condition29
 and condition30
 and condition31
 and condition32
THEN bkpatterm="多頭遭遇";

有了這個腳本,接下來的策略腳本就變的很簡單寫,例如我如果要找大跌三成後出現紅三兵的股票,就可以像下面這樣寫

if close*1.3<close[30]
and bkpatterm="紅三兵"
then ret=1;

如果想找跌三成後出現吊人線的股票,就把腳本中的紅三兵改成吊人線就可以了。

在這個腳本裡,我一共把八種多頭K線型態包含到BKPatterm這個函數中,分別是

三長下影線

三長下影線

紅三兵

紅三兵

內困三日翻紅

內困三日翻紅

吊人線

吊人線

多頭吞噬

多頭吞噬

多頭執帶

多頭執帶

多頭母子

多頭母子

多頭遭遇

多頭相逢

接下來就用上面的腳本分別回測這些型態在個股大跌三成後出現該型態後的二十天後股價是上漲還是下跌,以下是過去三年的回測數字

大跌後的K線型態勝率

從這些數字來看,多頭遭遇出現的次數多,勝率高且平均報酬率也高,是最具實戰意義的K線型態。

 

大跌之後買啥好?

市場偏空了,持股高的一片哀嚎,空手的覺得機會來了,開始問說下一波要買什麼? 之前有跟大家介紹過一個投信之前大買過,最近幾日又開始出現籌碼收集的交易策略,我覺得這策略還蠻合適最近的情況的。

首先還是先看腳本

condition1=false;
value1=GetField("分公司買進家數");
value2=GetField("分公司賣出家數");
value3=value2-value1;
value4=countif(value3>20,10);
value5=GetField("投信買張");
value6=summation(value5,5);
if countif(value6>=2000,60)>=1
then condition1=true;
//過去60個交易日投信曾五天買超過2000張
if value4>=6 
//最近十天有六天以上,籌碼是收集的
and GetSymbolField("tse.tw","收盤價","D")
>average(GetSymbolField("tse.tw","收盤價","D"),20)
and close[30]>close*1.1
//最近三十天跌超過一成
and condition1
then ret=1;

這個腳本的概念是說,如果前一陣子投信曾經大買過,然後最近跌了一成以上,然後最近十天有六天以上山現籌碼收集的現象,然後大盤又重回月線之上,那麼就進場,拿這個腳本去回測所有的股票,出場點設為進場二十天後,結果回測報告如下

2017120801

勝率剛好六成,MDD在可接受範圍,交易次數也還可接受,如果覺得六成勝率太低,可以把近三十天跌幅拉到兩成,這樣勝率會超過七成,不過交易次數就會少很多。

這個腳本的概念是,投信大買後如果被套牢,可能是之前知道公司有什麼利多,進場佈局,但買完後如果大盤不好,利多又還未曝光,股價可能會修正,但如果盤OK,又開始有人進來收籌碼,那後市上漲的機率就比較高。

剛好時序進到十二月,年底有作帳行情,明年初美國又有換股佈局的元月效應,所以提出這個策略跟大家分享,不過前提是要股價有先修正過且指數回到月線之上。