我們從一個簡簡單單的小菜,逐漸變成豐富的菜餚,今天要做的是選擇權。看看會是怎樣的食譜吧~
本日程式碼使用:d22_change_option.py
跟前幾天的做法雷同,不一樣的是改變我們的素材,也就是我們主要的味道,從小臺變成選擇權。
在主程式上面要做些調整,首先把sleep的時間改成60秒,因為最近夜盤的交易量明顯變少,所以拉長時間給他有反應的機會。儘管如此,在行情中收到31筆大臺的資料,但是選擇權卻只收到2筆...
接著是訂閱選擇權,在那之前先看看選擇權的合約要怎麼列。
不外乎使用api.Contracts
來看看有什麼,裡面有Indexs=(OTC, TSE), Stocks=(OES, OTC, TSE), Futures=(...省略), Options=(..., TX1, TX2, TXO)
,我們需要的就是Options
和裡面的TX
開頭的。
最後我們需要的是TX2.TX2202110016300C
,也就是:
Option(code='TX216300J1', symbol='TX2202110016300C', name='臺指選擇權10W2月 16300C', category='TX2', delivery_month='202110', strike_price=16300.0, option_right=<OptionRight.Call: 'C'>, underlying_kind='I', unit=1, limit_up=1860.0, limit_down=0.1, reference=228.0, update_date='2021/10/06')
知道我們的選擇權點位目標後,就改寫主程式的執行邏輯。
timer = threading.Thread(target=sleeper) # 建立執行緒
t = trader()
t.login()
t.subscribe(t.api.Contracts.Futures.TXF["TXF202110"]) # 訂閱臺指期-2021/10
t.subscribe(t.api.Contracts.Options.TX2.TX2202110016300C) # 訂閱臺指選擇權10W2月 16300C
t.api.quote.set_quote_callback(t.quote_callback) # 設定處理回報的功能
timer.start() # 執行thread
timer.join() # 等待結束thread
t.unsubscribe(t.api.Contracts.Futures.TXF["TXF202110"]) # 取消訂閱臺指期-2021/10
t.unsubscribe(t.api.Contracts.Options.TX2.TX2202110016300C) # 取消訂閱臺指選擇權10W2月 16300C
其實除了秒數從30秒變成60秒外,就是小臺改訂閱臺指選,最主要的邏輯是在改點數的部分。
廢話不多說,直接看程式碼:
def quote_callback(self, topic: str, quote: dict):
"""Get the quote info and change the oder price.
The quote's format is v0: quote is a dict and the value is a list.
"""
print(
f"{topic}-Price:[{quote['Close']}]Diff:[{quote['DiffPrice']}]volumn:[{quote['Volume']}]"
)
if topic.find("TFE/TXF") > 0:
self.diff = quote["DiffPrice"][0]
elif topic.find("OPT/TX") > 0:
reduced_point = 1
# 設定要減少的點數
if self.diff < quote["Close"][0]:
reduced_point = self.diff # 比市價還要低的數字
else:
# 當變動很多時,要剪去的價格會比較大,但比現價還要小
reduced_point = quote["Close"][0] - reduced_point
self.change_price(quote["Close"], True, reduced_point) # 價格比現價還要低,
def change_price(self, price, diff, points):
"""Simulate to change the price of the order."""
self.mxf_price = price[0] - points if diff else price[0] + points
print(f"選擇權:current price:{price[0]}-new price:{self.mxf_price}")
其實變動是在quote_callback()
中,這邊就只是簡單的點數修改。首先我們先取得大台的變動數量,接著根據目前的選擇權點數進行刪減。比較的邏輯是,當大臺的變動點數小於選擇權點數,我們就用變動點數當作減值,用該選擇權點數減去變動數;但是當大台變動點數大於或是等於選擇權點數時,我們就把選擇權點數減去設定的1,把它當作減數,然後用選擇權的點數減去那個減數,就變成新的值了。
這樣做,確保我們的欲購買價格低於市價,並且隨著波動而動。
這邊會遇到一些問題,像是選擇權的點為要選哪個,而且選擇權跟股票一樣,在不同的區間,跳動的單位不同,像是10以下的點數,就是0.1一個跳動單位,但是50以上卻都是為1為跳動單位。再加上有Call、Put和買賣方,讓這些組合和變動有更多樣貌,所以單以這樣的模式很難處理這些案例,只能從中簡化很多很多很多來展示。