2019年8月1日 星期四

大台(臺股期貨)每日漲停價、跌停價 計算方式

導言:
這題難解之處在「關鍵字」很難找,答案是在《期交所》網站《臺灣證券交易所股價指數期貨契約》。找到「每日結算價」這關鍵字答案就差不多出來了

Step 1:每日結算價
定義:每日結算價原則上採當日一般交易時段收盤前1分鐘內所有交易之成交量加權平均價,若無成交價時,則依本公司「臺灣證券交易所股價指數期貨契約交易規則」訂定之

Step 2: 前30個交易日期貨每筆成交資料
位置:期交所>首頁 > 交易資訊 > 資料下載專區 > 交易資訊 > 期貨 > 前30個交易日期貨每筆成交資料 

提醒:注意下載日期和時間,當日的日盤交易(一般時段)資料要到18:40左右才會產出。如果太早下載會不完整。最佳防呆做法就是次日才下載前一個交易日的資料

Step 3:資料格式
格式:成交日期,商品代號,到期月份(週別),成交時間,成交價格,成交數量(B+S),近月價格,遠月價格,開盤集合競價 

篩出:
成交日期=前一個交易日
商品代號=TX
到期月份=操作的大台契約月份(ex:201908)

注意:有價差交易的資料要剔除

Step 4:昨日結算價
公式:昨日,一般交易時段,收盤前1分鐘內,所有交易之成交量加權平均價。
資料區間取:成交時間 134400~134500
計算方式:
昨日結算價_帶小數=sum(成交價格*成交數量)/成交數量,
昨日結算價=(int)昨日結算價_帶小數→只取整數,小數去除不計也不四捨五入。

提示:我是寫入資料庫去撈,所以才會出現sum()函式。
爭議:四捨五入至小數第二位,是期交所的共識法則。但這邊可能是例外

Step 5:今日漲停價
計算方式:昨日結算價✖1.1,取整數(直接去小數,沒有四捨五入,因為會超過10%。

C#程式碼
        public  int  計算當日價格上限(int 昨日結算價)
        {
            return (int)(昨日結算價 * 1.1);
        }

Step 5:今日跌停價
計算方式:昨日結算價✖0.9+1。(加1才能不會超出-10%。除非常好是整數)
C#程式碼
        public  int 計算當日價格下限_小數2位(double 昨日結算價_帶小數)
        {
            if ((昨日結算價_帶小數 * 0.9)%1)//如果剛好整數,就不用+1了
                return (int)(昨日結算價_帶小數 * 0.9);
            else
                return  (int)(昨日結算價 * 0.9) + 1;
        }

爭議:如果是取小數2位作判斷是否為整數(12345.0089在判斷視同12345)
C#程式碼
        public  int 計算當日價格下限_小數2位(int 昨日結算價)
        {
            //取2位小數作有效值
            int i計算 = (int)((昨日結算價 * 0.9)* 100);
            double d結果 = i計算 / 100.0;
            if (d結果%1)//如果剛好整數,就不用+1了
                return (int)(昨日結算價 * 0.9);
            else
                return  (int)(昨日結算價 * 0.9) + 1;
        }

Step 5:驗證一致《期貨每日交易行情下載
位置:期交所>首頁 > 交易資訊 > 交易資訊 > 期貨 > 期貨每日交易行情下載 
比對:結算價是否與期交所一致。




總結:
期交所的名詞常常跟生活用語不同,像「臺股期貨」一般人不會這樣叫,而用「大台」。而昨日結算價,直覺是昨收價。總之,要找出精確數值比預期的困難許多,每日限制±10%,一句話卻充滿著許多定義不明之處,必須慢慢測試才能與期交所公布的一致。


C# 四捨五入函式
        System.Math.Round(10736.79 , 0, MidpointRounding.AwayFromZero)

參考資料:
臺灣期貨交易所
C# 無條件進位,無條件捨去及四捨五入寫法

沒有留言:

張貼留言