導言:
這題難解之處在「關鍵字」很難找,答案是在《
期交所》網站《
臺灣證券交易所股價指數期貨契約》。找到「每日結算價」這關鍵字答案就差不多出來了
Step 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;
}
位置:期交所>首頁 > 交易資訊 > 交易資訊 > 期貨 > 期貨每日交易行情下載
比對:結算價是否與期交所一致。
總結:
期交所的名詞常常跟生活用語不同,像「臺股期貨」一般人不會這樣叫,而用「大台」。而昨日結算價,直覺是昨收價。總之,要找出精確數值比預期的困難許多,每日限制±10%,一句話卻充滿著許多定義不明之處,必須慢慢測試才能與期交所公布的一致。
C# 四捨五入函式
System.Math.Round(10736.79 , 0, MidpointRounding.AwayFromZero)
參考資料:
《
臺灣期貨交易所》
《
C# 無條件進位,無條件捨去及四捨五入寫法》