前些日子配合策略開發,要將結算日處理邏輯加入策略中,急就章寫了一支笨笨的函式來判斷,我將之分享於COCO上 分享檢核台指結算日之函式 有興趣的網友可以參考看看。

近日想將 [N天後結算] 之概念實作於選擇權的策略中,在 AmiBroker 官網中挖出了 Days to Third Friday 這個範例,發現只要將其稍作改寫即可滿足我的需求,亦可取代原來 分享檢核台指結算日之函式,與各位 AmiBroker 同好 update 一下,先來看看程式碼 ~

↓下列函式用於計算[每個月分天數] 

function DaysInMonth( MonthNum, YearNum )
{
    _DaysInMonth    = IIf( MonthNum == 1
                           OR MonthNum == 3
                           OR MonthNum == 5
                           OR MonthNum == 7
                           OR MonthNum == 8
                           OR MonthNum == 10
                           OR MonthNum == 12
                           , 31
                           , 30 );
    _DaysInFebruary = IIf( ( YearNum % 4 == 0 ), 29, 28 );
    _DaysInMonth    = IIf( MonthNum == 2, _DaysInFebruary, _DaysInMonth );
    return _DaysInMonth;
}

↓下列函式用於計算[距結算日尚有N天],有因應 2008/12 前後之結算日規則不同加以調整

function DaysToClearing()
{
    _Day             = Day();
    _DayOfWeek       = DayOfWeek();
    _ShitfDays       = ( ( Year() * 100 + Month() ) < 200812 );
    _eyDay           = 3 + _ShitfDays;
    _DaysToWednesday = IIf( _eyDay - _DayOfWeek < 0
                            , ( 7 + _eyDay - _DayOfWeek ) % 7
                            , ( _eyDay - _DayOfWeek ) % 7 );
    _ThirdWednesday  = ( ( _Day + _DaysToWednesday ) % 7 ) + 14;
    _ThirdWednesday  = IIf( _ThirdWednesday <= 14 + _ShitfDays
                            , _ThirdWednesday + 7
                            , _ThirdWednesday );
    _DaysToClearing  = _ThirdWednesday - _Day;
    _DaysToClearing  = IIf( _DaysToClearing >= 0
                            , _DaysToClearing
                            , _ThirdWednesday + IIf( _ThirdWednesday + 14 - _ShitfDays > DaysInMonth( Month(), Year() ), 28, 35 ) - _Day );
    return _DaysToClearing;
}

↓下列函式用於計算[是否為結算日]

function isClearingDay()
{
    _DaysToClearing = DaysToClearing();
    _isClearingDay  = ( _DaysToClearing == 0 )
                      OR ( ( Ref( _DaysToClearing, -1 ) != 0 ) AND ( _DaysToClearing > Ref( _DaysToClearing, -1 ) ) );
    return _isClearingDay;
}
 

PS. 我個人習慣將這一類的函式集中在一個 eyUtility.afl 中,並將其擺在 AmiBroker 安裝目錄的 Include 底下。

有了上述函式後,就可以清楚的知道 [N天後結算],所以也不用擔心結算日常因特殊假期或臨時狀況而變得不確定了,不需要像原本函式為求正確每個年度調整一次,用起來真是既靈活又輕巧 ^^

↓ 圖例

 

------

補充一下,在驗證這組函式的過程中,意外的發現原使用的歷史回測資料竟然漏了 2001/03/23 ~ 2001/03/30 這區段的資料,在重新尋找的資料的過程中也發現一個現象,網路上分享的歷史資料大部分都缺了這一塊資料(想必大家出處都相同),最後終於在 寬大 曾於COCO上分享的資料翻到了,我現在已將這部分資料更新至 歷史資料 下載區了,跟我一樣想保持資料完整性的同好們可以自行前往下再更新囉。

 


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 隱弄客 的頭像
    隱弄客

    隱弄客

    隱弄客 發表在 痞客邦 留言(1) 人氣()