前些日子配合策略開發,要將結算日處理邏輯加入策略中,急就章寫了一支笨笨的函式來判斷,我將之分享於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上分享的資料翻到了,我現在已將這部分資料更新至 歷史資料 下載區了,跟我一樣想保持資料完整性的同好們可以自行前往下再更新囉。
留言列表