排行語法

2025-06-09 18:42:12
「排行語法」讓使用者可直接在選股腳本中撰寫排行條件,無需額外撰寫函數腳本,並可靈活運用不同的排行名次作為篩選條件。  

語法

基礎範例

rank myRank begin
Value1 = Average(Close, 10);
retval = (Close - Value1);
end;

if myRank.pos <= 100 then ret = 1;
OutputField1(myRank.value);
上面範例中,使用了 rank 宣告了 myRank 的物件,並將收盤價和移動平均線的差距來當作排行的條件。 接著透過呼叫 myRank 物件的 pos 屬性,將前一百名的商品篩選出,並使用 OutputField 將符合條件商品的收盤價和移動平均線差距輸出。 rank 語法只支援選股腳本,其他的腳本都無法使用。 每個排行透過 rank 函數宣告排行物件,並在 beginend 區塊內撰寫排行條件所需的計算數值,最後透過 retval 回傳作為排行依據的數值,預設為由大到小。 當 rank 物件運算完成後,即可使用其屬性來進行排序與篩選等相關操作。 以下為 rank 物件支援的屬性:
屬性名稱 說明
pos 排行名次,整數,從 1 開始,1 是第一名。
range 排行 %,等於 pos / <參與排行商品數> * 100。這是一個實數 (有小數點),數值範圍介於 0 ~ 100 之間,越小排名越前面。
pr Percentile Rank %。PR = (N - pos) / (N - 1) * 100。這是一個實數,數值範圍介於 100 ~ 0 之間,第一名是 100,PR95 表示是 95% 之前。
count 參與排行的商品個數。這個數值對任何一檔商品而言都是固定的。
value rank object 的回傳數值,也就是 retval 的回傳數值。
avgvalue 所有商品 rank.value 的平均值。可以使用這個數值來決定目前商品是否是在平均值以上或是平均值以下。這個數值對任何一檔商品而言都是固定的。
medvalue 所有商品 rank.value 的中位數 (median value)。可以使用這個數值來決定目前商品是否是在中位數以上或是中位數以下。這個數值對任何一檔商品而言都是固定的。

rank 語法的注意點

一、同個腳本當中可以有多個 rank 物件,但每個物件的名稱不能和彼此、腳本中變數以及參數重複。 (X) 錯誤的案例:
var: myRank(0);
rank myRank begin
Value1 = Average(Close, 10);
retval = (Close - Value1);
end;
  (O) 正確的案例:
rank myRank1 begin
retval = Close;
end;
rank myRank2 begin
retval = Volume;
end;

  二、rank 物件不能夠放在任何的條件或是 begin … end 之間,需要放在最上面一層。 (X) 錯誤的案例:
if close > open then begin
rank myRank begin
Value1 = Average(Close, 10);
retval = (Close - Value1);
end;
end;
 
    • 排行的結果是一個序列。
rank myRank begin
retval = Close;
end;
if myRank.pos[1] <> myRank.pos then ret = 1;
//篩選出前期排行與當期排行不同的商品
 
  三、rank 排行預設為大到小,但可以透過 desc 和 asc 來設定是大到小還是小到大。
//大到小
rank myRank1 desc begin
retval = Close;
end;

//小到大
rank myRank2 asc begin
retval = Close;
end;
 
  四、rank 物件內是獨立空間,無法傳入腳本他處的參數和變數。
    • rank 物件使用的變數需另行在 rank 區間內宣告 (亦可使用內建的 Value1 等變數)。
    • 變數即使有相同的名字,但不會互相影響 (內建變數亦相同)。
(X) 錯誤的案例:
//錯誤訊息要特別註明
Input: len(10);
rank myRank begin
Value1 = Average(Close, len);
retval = (Close - Value1);
end;
  (O) 正確的案例:
//編譯時禁止 rank 內宣告相同名稱的變數
var: _price(0);
_price = Open;
rank myRank begin
var: _price(0);
_price = Average(Close, 10);
retval = (Close - _price);
end;
// rank 物件內 _price 會是 10 期收盤價移動平均值,物件外的 _price 會是開盤價
 
  五、rank 內雖然不能夠使用外部的參數變數,但可以使用前面其他 rank 運算出來的結果。 舉例來說,在 Alpha 101 的因子內,有些因子會需要針對某些排行結果再做另外一次排行。其中 Alpha 13=-1 * rank(covariance(rank(close), rank(volume), 5)),這個因子的邏輯是:
      • 首先統計過去 5 日每一日 close 在母體內排名以及每一日 volume 在母體內的排名。
      • 如果這 5 日的排名正相關的話 (>1),那就賣出這檔股票,如果是負相關的話 (<-1),那就買進這檔股票。
注意到這個因子必須針對過去 5 日的排行數值的運算結果 (covariance) 再做一次排行。以下是模擬 Alpha 13 的腳本範例:
//收盤價排行

rank rank_close begin
retval = close;
end;

//成交量排行

rank rank_volume begin
retval = volume;
end;

//上述兩個排行的相關性

rank rank_alpha_13 begin
retval = Covariance(rank_close.pr, rank_volume.pr, 5);
end;
ret = 1;

OutputField1(rank_alpha_13.value, "相關性");