iT邦幫忙

2021 iThome 鐵人賽

DAY 22
0
永豐金融APIs

永豐證API X Python系列 第 22

【D22】修改食譜#2:根據市價,模擬選擇權下單

  • 分享至 

  • xImage
  •  

前言

我們從一個簡簡單單的小菜,逐漸變成豐富的菜餚,今天要做的是選擇權。看看會是怎樣的食譜吧~

本日程式碼使用: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和買賣方,讓這些組合和變動有更多樣貌,所以單以這樣的模式很難處理這些案例,只能從中簡化很多很多很多來展示。


上一篇
【D21】修改食譜#2:根據市價,模擬小台改價
下一篇
【D23】修改食譜#3:不知道來的客人是誰,先設定預設值
系列文
永豐證API X Python31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言