(尚未回應) 為什麼在回測中,測試的目標相同,卻有不同的結果,出現 (失敗) -> "不合法的欄位資料"?

  •   80 
  • 最後發表   Sadless  2020 八月 23
Sadless 發文於   2020/08/23

回測結果如附件。

我寫了一個做多的警示,使用到兩個自訂函數。

請問小幫手,為什麼每一次回測的結果(失敗) 都不同呢?

 

不合法的欄位資料又是甚麼意思?

 

警示腳本如下:

//警示功能:如果每分鐘K棒的收盤價 比 昨天的收盤價上漲2%
//且預估成交量是昨天的兩倍以上,則買進

input:observing_days_for_estimation(2);
settotalbar(60*4.5*(observing_days_for_estimation+1));

variable:v_estimated_accumulated_volume_per_minute(0);

v_estimated_accumulated_volume_per_minute
= f_estimated_accumulated_volume_per_minute(2);

//買進策略
if close > 1.02 * GetField("收盤價")[1]
then begin

    //如果今天的預估成交量是前1天的兩倍以上
    if v_estimated_accumulated_volume_per_minute > 2 * GetField("Volume", "D")[1]
    then ret=1;

end;

 

 

附加文件

Sadless 發文於   2020/08/23

自訂函數 f_estimated_accumulated_volume_per_minute 如下:

//函數功能:計算估計成交量
//關鍵:該分鐘累積成交量/過去N日該分鐘的累績成交量平均占比
//輸入參數:回頭觀察的天數


//宣告
setbarmode(2);

inputs:number_of_observing_days(NumericSimple); //預設回頭觀察2天

variable:number_of_bars_per_day(270);

Array:array_volume_of_observing_day_per_minute[](0);
Array:array_volume_of_observing_day_per_day[](0);
Array:array_volume_percentage_of_observing_day_per_minute[](0);

Array_SetMaxIndex(array_volume_of_observing_day_per_minute, number_of_observing_days);
Array_SetMaxIndex(array_volume_of_observing_day_per_day, number_of_observing_days);
Array_SetMaxIndex(array_volume_percentage_of_observing_day_per_minute, number_of_observing_days);


//計算過去N日該分鐘的成交量占比
variable:i(0);

for i = 1 to number_of_observing_days
begin
    //取得該分鐘的累計成交量
    array_volume_of_observing_day_per_minute[i] 
    = f_accumulated_volume_per_minute[number_of_bars_per_day*i];

    //取得該日的累計成交量
    array_volume_of_observing_day_per_day[i] 
    = getfield("成交量","D")[i];

    //取得成交量占比:該日該分鐘的累計成交量/該日的累計成交量
    if array_volume_of_observing_day_per_day[i] = 0 //檢查除數不為0
    then array_volume_percentage_of_observing_day_per_minute[i] = 0
    else    
        array_volume_percentage_of_observing_day_per_minute[i]
        = array_volume_of_observing_day_per_minute[i] 
        / array_volume_of_observing_day_per_day[i]; 
end;


//計算過去N日該分鐘的成交量平均占比
variable:accumulated_volume_per_minute_percentage(0);


if number_of_observing_days = 0                     //檢查除數不為0
then accumulated_volume_per_minute_percentage = 0
else accumulated_volume_per_minute_percentage       //該分鐘過去N天的成交量平均占比
    = Array_Sum(array_volume_percentage_of_observing_day_per_minute, 1, number_of_observing_days)
    / number_of_observing_days;


//計算該分鐘的估計成交量
if accumulated_volume_per_minute_percentage = 0     //檢查除數不為0
then f_estimated_accumulated_volume_per_minute = 0
else f_estimated_accumulated_volume_per_minute      //用成交量佔比,去反推該分鐘的估計成交量
    = f_accumulated_volume_per_minute
    / accumulated_volume_per_minute_percentage;


//依照不同時間,對估計成交量,給予不同的低估權重,因為預估成交量在前期會過度高估
if time < 93000  
then f_estimated_accumulated_volume_per_minute 
= f_estimated_accumulated_volume_per_minute * 0.8

else if time < 100000
then f_estimated_accumulated_volume_per_minute 
= f_estimated_accumulated_volume_per_minute * 0.85

else if time < 110000
then f_estimated_accumulated_volume_per_minute 
= f_estimated_accumulated_volume_per_minute * 0.9;


自訂函數 f_accumulated_volume_per_minute 如下:

//函數功能:計算該日每分鐘的累積成交量,功能與getfield("成交量","D") 類似
//但getfield("成交量","D") 無法取得前一天的每分鐘累積成交量,而這個函數可以

//宣告
SetBarMode(2);

variable:v_minute_bar_local_number_in_a_day(0);

//如果09:00:00是當日編號1號的分K棒,計算現在這根分K棒的當日編號,也就現在距離09:00:00幾分鐘
v_minute_bar_local_number_in_a_day 
= 1 + timediff(time,90000,"M");

//計算該日每分鐘的累積成交量
if  v_minute_bar_local_number_in_a_day > 0 
then f_accumulated_volume_per_minute 
    = Summation(volume, v_minute_bar_local_number_in_a_day)

else  
    f_accumulated_volume_per_minute =0;

發表回覆
Close