Author Archives: 發財橘子

結合多個選股條件的綜合選股方法

昨天介紹的作法被朋友打槍,他說這太難,大部份的人選股沒那麼複雜,而且沒有必要把高勝率的腳本綜合一起看,符合其中一個就可以留意了,他是個作短線的人,覺得選股打不贏內線,應該是透過一些條件,挑出一些符合多個多頭股票會有的共同特徵的標的,然後再從盤中的表現來決定怎麼操作,他建議我列出轉強股會有的共同特徵,而且是大家都看得懂的,然後幫大家計算出那幾檔股票符合最多這些特徵,進出場的事情交給大家自己來處理。

雖然覺得他的講法沒有完全都對,但還是有一定的道理,所以我列了二十個一般投資人都看得懂的選股條件,包括價值分析,籌碼分析,技術分析等等面向,然後透過計數器,挑出符合一定數量條件的股票

我寫的綜合選股腳本如下

input:lowlimit(9,"符合條件數下限");
var:counts(0);//宣告計數器
counts=0;//每根bar計算前計數器要歸零
//條件一: 本益比小於12
value1=GetField("本益比","D");
if value1<=12 then counts=counts+1;
//條件二:股價淨值比小於2
value2=GetField("股價淨值比","D");
if value2<2 then counts=counts+1;
//條件三:殖利率大於4
value3=GetField("殖利率","D");
if value3>4 then counts=counts+1;
//條件四:開盤委買量創20日高點
value4=GetField("開盤委買","D");
if value4=highest(value4,20) 
then counts=counts+1;
//條件五:佔全市場成交量比創20日高點
value5=GetField("佔全市場成交量比","D");
if value5=highest(value5,20)
then counts=counts+1;
//條件六:月營收維持兩位數成長
value6=GetField("月營收年增率","M");
if value6>=10 then counts=counts+1;
//條件七:現金股利超過一元
value7=GetField("現金股利","Y");
if value7>=1 then counts=counts+1;
//條件八: 外資買超
value8=GetField("外資買賣超","D");
if value8>=300 then counts=counts+1;
//條件九: 投信買超
value9=GetField("投信買賣超","D");
if value9>=300 then counts=counts+1;
//條件十: 董監事持股高於一定比例
value10=GetField("董監持股佔股本比例","D");
if value10>=25 then counts=counts+1;
//條件十一:主力連三日買超
value11=GetField("主力買賣超張數","D");
if trueall(value11>300,3) then counts=counts+1;
//條件十二:近一週千張大戶比前一週多
if GetFieldDate("大戶持股人數","W") <> date then begin
value20 = GetField("大戶持股人數","W",param := 1000)[1];
value21 = GetField("大戶持股人數","W",param := 1000)[2];
end
else begin
value20 = GetField("大戶持股人數","W",param := 1000);
value21 = GetField("大戶持股人數","W",param := 1000)[1];
end;
if value20>value21
then counts=counts+1;
//條件十三:地緣券商買超
value12=GetField("地緣券商買賣超張數","D");
if value12>100 then counts=counts+1;
//條件十四:分公司淨賣超家數超過淨買超的兩倍
//代表籌碼被收集
value13=GetField("分公司淨買超金額家數","D");
value14=GetField("分公司淨賣超金額家數","D");
if value14>2*value13 then counts=counts+1;
//條件十五: 近三日動量指標有突破零
if barslast(Momentum(Close, 10) Crosses Above 0)<=3
then counts=counts+1;
//條件十六:近三日有RSI黃金交叉
if barslast(RSI(Close, 5) Crosses Above RSI(Close, 10))<=3
then counts=counts+1;
//條件十七:關鍵券商買超
value15=GetField("關鍵券商買賣超張數","D");
if value15>0 then counts=counts+1;
//條件十八: 股價突破兩倍的真實波動區間
value16=average(truerange,20);
value17=average(close,20)+2*value16;
if close crosses over value17 
then counts=counts+1;
//條件十九:上漲角度突破30度
value18=rateofchange(close,20);
value19=arctangent(value18/20*100);
if value19 crosses over 30
then counts=counts+1;
//條件二十: 出量
if volume >=average(volume,20)*1.3
then counts=counts+1;
if counts>=lowlimit then ret=1;
outputfield(1,counts,0,"符合條件數");

這個腳本前天跑出來的股票清單如下

 

不過今天介紹這個方法的主要目的還是在說明計數器的用法,以及barslast的概念,大家不見得同意我這二十項條件的設法,透過計數器及barslast的語法,大家可以自行設計自己的綜合選股法。

 

intrabarpersist的用法

intrabarpersist是用在逐筆洗價時的一個語法,XS程式執行時,變數的值是延續前一根Bar的值,然後跟據最新一根的價位來計算最近一根的值。

interbar1

但這個邏輯在使用逐筆洗價時,在有些特別的情況下,必須在同一根bar,把之前進來的數據,當成前一根的數據來計算新進的數據,這時候就可以使用intrabarpersist這個宣告。

intrabar2

這個函數最常被用在計算累計大單這樣的腳本中,下面就是一個很典型的應用範例

intrabar3

這樣的話,就可以把每一筆的大單都累計進來了,當超過N筆單時就可以觸發訊號。

CV指標

 

腳本

// XQ: CV指標
//
Variable: _cv(0);

If CurrentBar = 1 then
 _cv = Close * Volume
else 
 _cv = _cv[1] + (Close - Close[1]) * Volume;

Plot1(_cv, "CV");

參考圖表

CV

PSY心理線

腳本

// XQ: 心理線
//
input: Length1(12), Length2(24);

SetInputName(1, "天數一");
SetInputName(2, "天數二");

Value1 = 100 * CountIf(Close > Close[1], Length1) / Length1;
Value2 = 100 * CountIf(Close > Close[1], Length2) / Length2;

Plot1(Value1, "PSY1");
Plot2(Value2, "PSY2");

參考圖表

PSY

MO指標

 

腳本

// XQ: MO指標
//
input: Length(10);
variable: mo(0);

SetInputName(1, "天數");

mo = 100 * Close / Close[Length];

Plot1(mo, "MO");

參考圖表

MO

即將召開法說會且主力買超的股票

這兩天台郡的股價蠻強的,原因是法說會裡提到了軟板局5G天線有成,雖然第一季受手機市場清淡影響表現一般,但今年全年仍會成長(如以下的新聞)

2019021904

14日法說會結束,15日股價漲停,昨日股價繼續上漲。

但由於之前幾個月營收衰退,所以XS選股平台系統內建的“即將召開法說會”策略沒有出碧台郡這檔股票。

小弟回家後自我檢討,了解到原有的策略較合適過去一季表現不錯的公司,但不合適過去不好,股價修正,但未來會不錯的公司。

於是我想了一下,公司近一季表現不好,即將召開法說會,但公佈的內容足以激勵人心,事先會不會有什麼徵兆? 後來我想到春江水暖鴨先知,如果法說會要公佈的消息是正向的,那麼法說會前幾天的主力買超的機率應該是比較大的。

於是我把即將召開法說會的條件加上主力買超的條件,合寫成以下的策略

2019021903

然後回頭去檢視過往幾天挑出來的股票,結果11日台郡就出現了

2019021902

我們回頭去檢視台郡的K線圖

2019021901

當時台郡的股價還不到80元。

不過我拿這個策略回測時發現,勝率其實不突出,代表這些挑出來的股票還需要再過濾

後來我加上了推估本益比低於一定水平等其他條件,回測的數據顯示,這樣的策略在多頭市場是管用的

至於怎麼強化這個策略,就交給大家自行增加選股條件囉。

NVI指標

 

PVI ( Positive Volume Index ) 正量指標 及  NVI ( Negative Volume Index ) 負量指標

 這兩個指標必須放在一起看,才能對股票量價的變動有整體的瞭解.基本上這兩個指標是用來體現所謂的「量價關係」,從指標的變動方向與股價的變動方向來綜合研判價格未來可能的變化方向.

  1. PVI的計算公式如下:

假如 今日成交量「大於」昨日成交量,則

   今日PVI = 昨日 PVI + 今日股價漲跌幅

否則

      今日PVI = 昨日 PVI + 0

  1. NVI的計算公式如下:

假如 今日成交量「小於」昨日成交量,則

   今日NVI = 昨日 NVI + 今日股價漲跌幅

否則

      今日NVI = 昨日 NVI + 0

腳本

// XQ: NVI指標
//
Variable: _nvi(1);

if CurrentBar = 1 then
 _nvi = 1
else
 begin 
 if Volume < Volume[1] then
 _nvi = _nvi[1] + (Close - Close[1]) / Close[1]
 else
 _nvi = _nvi[1];
 end;
 
Plot1(_nvi, "NVI");

參考圖形

NVI

威廉多空力度線

 

函數腳本

SetBarMode(2);

{
XQ: WA/D 指標
}

variable: wadt(0), adt(0);

if CurrentBar = 1 then
 wadt = 0
else
 begin
 if close = close[1] then
 adt = 0
 else
 begin
 if close < close[1] then
 adt = close - TrueHigh
 else
 adt = close - TrueLow;
 end;

 wadt = adt + wadt[1];
 end;

WAD = wadt;

指標腳本

// XQ: WA/D 指標
//

variable: wad(0), _ad(0);

if CurrentBar = 1 then
 wad = 0
else
 begin 
 if close = close[1] then
 _ad = 0
 else 
 begin
 if close < close[1] then
 _ad = close - TrueHigh
 else { close > close[1] }
 _ad = close - TrueLow;
 end;

 wad = _ad + wad[1];
 end;
 
Plot1(wad, "WA/D");

參考圖

 

MA移動平均線

公式

(簡單)n日移動平均 MA_t = (P_t + P_[t-1] + P_[t-2] +…+ P_[t-n+1] ) / n
即把最近n個資料作平均即得,這種方式中各天的價格權數均相等.
另一種指數平滑移動平均則為
E_t = E_[t-1] + a * (P_t + E_[t-1] )
即離目前越近的資料, 在計算平均時其給的權數越高.

意義

移動平均的概念是由統計學領域應用而來,在技術分析上,移動平均的作用可以引伸成四層意義:平滑作用、趨勢線、成本線及支撐壓力

  1. 平滑作用–由於價格資料具波動,因此單純觀察每日價格通常會因為價格的波動大而受干擾,無法看穿本質。因此將價格作移動平均後,將可使價格在呈現上具平滑功能,以便利觀察。
  2. 趨勢線–平滑後的價格會較具明確的方向性,亦即以較多的觀察樣本較能顯現出股價較長期的的趨勢性,因此移動平均線可視為一趨勢線。
  3. 成本線–由於移動平均線的計算參考了最近n個交易收盤價的資料,因此大致上來說,移動平均是最近n日市場的買賣平均價格。也就是說,最近市場交易買方的成本會落在移動平均的附近,因此移動平均可視為近期市場買進者的成本。
  4. 支撐壓力–由心理面來說,移動平均落在某一價位,代表該價位為目前股票擁有者的成本區,並且對該群人而言,這個價位是一個值得買進的價位(所以才會擁有部位),因此當股價由上而下跌至均線附近時,便會再度落到該群人認為值得買進的價位區,因此再引發買進的動作,這樣便會使得當股價跌至均線附近時便會引發止跌的買盤,因此移動平均線可視為一支撐線。

    在另一方面,當外在環境惡劣,使得均線的支撐力道不足而使股價跌破均線時,則此發生套牢現象–股價低於買進成本,而造成投資人發生帳面虧損,使其不願在此虧損階段賣股票。在這個時候,投資人會產生一個心態,便是等股價回本便趕快賣股票以解套。所以當股價由下方往上觸至均線時,便會產生賣壓而造成股價再往下壓,因此這時均線反而成為一壓力線。

應用時機

  • 一般可將移動平均線視為支撐或壓力線。短線看6日(週)或12日均線,更長期則有24日(月)、72日(季)、144日(半年均線)及288日(年均線)等等。長天期的移動平均線其支撐或壓力較短天期來得強,因此股價跌破長天期均線時通常代表著行情反轉的表徵。
  • 由於移動平均線代表著一趨勢線,因此利用長短天期不同的移動平均線來檢視趨勢的改變與否。長天期的移動平均線代表原來趨勢,而當短天期移動平均線與長天期發生交叉時,可能代表趨勢開始轉變,為買賣訊號;當短天期移動平均線由下往上向長天期移動平均線交叉時,為買進訊號。
  • 當股價均線呈現越短天期的均線排列在越上方時,則稱為多頭排列,為有大行情的前兆;相反的,若越長天期均線蓋在越上面,則為空頭排列,為空頭行情表徵。
  • 年均線通常代表多頭及空頭的分界線,為一重要指標。而在過去幾次的大空頭中,當股價跌至10年均線時均為長線的大底部,為重要買點。

缺點

移動平均線為一落後指標,因此單純效果有限

補救措施

配合其他指標使用.

 

函數腳本

SetBarMode(1);

input:thePrice(numericseries); //"價格序列"
input:Length(numericsimple); //"計算期間"
 
if Length > 0 then
 Average = Summation(thePrice, Length) / Length
else 
 Average =0;