簡體   English   中英

使用上下文無關語法來解析選項擴展順序字符串?

[英]Using Context-Free Grammar To Parse Options Spread Order Strings?

我需要創建一個工具,該工具以字符串格式讀取期權傳播順序,並以人類可讀的格式將其輸出。

例子:

輸入:

BUY +6 VERTICAL LUV 100 (Weeklys) 28 AUG 20 37.5/36.5 PUT @.49 LMT

輸出:

VERTICAL
BUY +6 LUV 28 AUG 20 (Weeklys) 37.5 PUT
SELL -6 LUV 28 AUG 20 (Weeklys) 36.5 PUT
.49 DEBIT LMT

輸入:

BUY +1 DIAGONAL AMGN 100 (Weeklys) 4 SEP 20/28 AUG 20 245/240 CALL @.07 LMT

輸出:

DIAGONAL
BUY +1 AMGN 4 SEP 20 (Weeklys) 245 CALL
SELL +1 AMGN 28 AUG 20 (Weeklys) 240 CALL
-.07 CREDIT LMT

從表面上看,上下文無關語法似乎是表達各種語法的好方法(對角線擴展更復雜)。 但是幾乎沒有使用上下文無關語法的經驗,我不確定我將如何攜帶數字,以及我將如何添加原始訂單字符串中未明確提及的 SELL 訂單。 例如,假設賣出邊是垂直價差。

希望即使您不是期權交易者,這也有意義;-) 這里的基本思想是翻譯原始字符串需要一點智能,而不僅僅是生成不同文本的問題。

歡迎任何見解和指示。

僅從 2 個示例中很難判斷,但我的猜測是,使用上下文無關語法(特別是如果您幾乎沒有使用它們的經驗)可能有點過頭了。 語法本身可能很簡單,但是您需要添加“動作”以將識別的輸入轉換為所需的輸出,或者讓解析器構建語法樹,然后編寫代碼以從樹中提取數據並生成所需的輸出。

使用正則表達式進行捕獲會更簡單。 例如,這里有一些 python3 代碼幾乎可以處理您的 2 個示例:

import sys, re

for line in sys.stdin:
    
    mo = re.fullmatch(r'BUY \+(\d+) (VERTICAL|DIAGONAL) (\S+) 100 \(Weeklys\) (\d+ \w+ \d+)(?:/(\d+ \w+ \d+))? ([\d.]+)/([\d.]+) (PUT|CALL) @(.\d+) LMT\n', line)
    (n_units, vert_or_diag, name, date1, date2, price1, price2, put_or_call, limit) = mo.groups()

    if vert_or_diag == 'VERTICAL':
        assert date2 is None
        date2 = date1

    print()
    print(vert_or_diag)
    print(f"BUY +{n_units} {name} {date1} (Weeklys) {price1} {put_or_call}")
    print(f"SELL -{n_units} {name} {date2} (Weeklys) {price2} {put_or_call}")
    print(f"{limit} DEBIT LMT")

它並不完美,因為問題沒有完美地說明(例如,不清楚是什么導致人類可讀格式具有正借方與負貸方)。 並且輸入的空間無疑比正則表達式當前處理的要大。

重點只是表明,基於給定的示例,正​​則表達式可以是一般問題的緊湊解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM