- 登入
- 註冊
Config 通常泛指存放設定、配置的「檔案」,即使它的編寫規則很像程式碼,但一般而言是視為文字檔案,而非程式碼。舉例來說,你可以把你的均線和技術指標參數都寫到檔案裡,這樣你就能讓程式每次計算技術指標的時候都使用這個參數設定,只需要把這個 config 檔維護好就好。這麼一來,這些參數就不會東一個、西一個,散落在 .py 程式腳本內的各個角落。
Windows 上常見的是 .INI,其他常見的還有 .conf、.cfg 等。另外也有程式使用 .toml 和 .json 來當作 config 檔(設定檔)。
原則上,這些設定檔的編寫都是遵從鍵值對格式。讀者如果是使用 Windows 作業系統的話,可以自行到各個軟體下,把設定檔用記事本打開來看看就懂了。
這裡我們要教大家用的是 .json 格式的設定檔,因為 .json 的編寫方式和 Python 的字典 dict 一模一樣!還有一個好處是,使用 Python 的套件 json 讀取 json 檔案的時候,讀取進來的格式自動就是字典 dict ,而且這個字典自動就能遵循我們撰寫設定檔的規則,來擺放參數設定值。
我們直接用兩個 json 檔當作範例,如果是想要自己打造 Python 全自動交易機器人的讀者,可以參考看看:(這裡雖說是介紹 json,不過為了讓 Python 使用者可以快速上手 json,主要是以對比 Python 的 dict 字典等用語做解說,請見諒)
{
"BTCUSDT": {
"parameter_1": 0.0004,
"parameter_2 ": 30,
"parameter_3": 7.0,
"parameter_4": [0.0025, 0.005],
"parameter_5": {
"A": 9,
"B":18
}
},
"ETHUSDT": {
…… (此處省略,排版較方便閱讀)
},
"SOLUSDT": {
…… (此處省略,排版較方便閱讀)
}
}
這裡解說一下檔案的內容結構:整體架構是以陣列(在 Python 稱為 list 的中括號)和物件(在 Python 稱為字典 dict)為主,其中 key 和 value 是成對存在,中間以冒號「:」做分隔。最外層是一組大括號 {},大括號中的每一個 key 是商品代碼也就是上方所見的 BTCUSDT、ETHUSDT、SOLUSDT,每一個 key 對應到的值是一個字典,也就是在冒號後方的那組大括號 {}。大括號中,每一個 key 是參數名稱,參數名稱後的冒號後方放的是它所對應的值。
從這個例子可以看到,json 檔案所支援的值得型態除了整數、浮點數、字串以外,還包含陣列和物件。除了這個例子看到的型態以外,還有布林(true / false,全部字母都是小寫)和空值(null)。
什麼時候會用到這個例子的 json 呢?基本上,當你想要用一個設定檔來管理同一個策略邏輯但跑在不同幣別上時,可以用這個方式來設計策略參數設定檔。當然,想要把這些不同幣別的策略參數設定存成各自的 json 檔也可以,這只是每個人對於「同一邏輯但不同幣別的策略是否屬於同一支策略」的想法不同,所衍生出來的設計差異罷了。兩種筆者都見過。
上面的例子是以字典做為最外層,下面的例子我們用陣列在最外層。
[
{
"strategy_name": "rsi_15m",
"margin": 5000,
"risk_level": 0.2
},
{
"strategy_name": "bb_5m",
"margin": 10000,
"risk_level": 0.15
},
{
"strategy_name": "kd_30m",
"margin": 10000,
"risk_level": 0.2
}
]
很顯而易見地,這個例子最外層是一個陣列,裡面每一個元素是每個策略的相關設定,包含 strategy_name 策略名稱、margin 配置資金、risk_level 策略風險值。
透過這個設定檔,當你運行 Python 交易系統時讓它讀取設定,就能夠依照統一管理的設定值運行投資組合了。例如,如果想要上架新策略到投資組合內,在陣列內多複製貼上元素,維持這個架構就行了。
如果想要下架策略,直接刪除元素,或是把配置資金改成 0 就行了。當然,如果你的交易系統沒有設計自動偵測設定檔變更重新讀取設定檔的話,還要重新運行交易系統才會讓設定檔生效。
import json
with open(config_path) as json_file:
config = json.load(json_file)
這裡我們建議用 json 這個套件來讀取 json 檔。語法如上,先載入套件,用 with open 打開 json 檔,config_path 即為檔案路徑,再使用 json.load 語法把檔案讀取進來。若 json 檔最外層是 {} ,則變數 config 的型態為字典,若檔案最外層是 [],則變數 config 的型態為 list。
import json
with open(config_path, "w") as json_file:
json.dump(your_data, json_file)
寫入 json 與讀取的語法類似,主要差異是:
從剛才的兩個例子應該多少能理解用 config 檔案管理程式參數的好處。首先,程式參數能夠集中管理,也不會在除錯時找老半天才發現被一些區域變數影響參數調用權。
此外,若搭配 argparse 套件的 ArgumentParser,我們可以使用同一個 Python 腳本去搭配不同的 config,讓程式碼維護變得更容易。例如:
python strategy_launch.py --config test_strategy_1.json
python strategy_launch.py --config test_strategy_2.json
上面的例子裡,如果我們開啟兩個終端機視窗,各自輸入其中一行指令,那麼我們只要讓程式對應讀取各自的設定檔,就只需要維護同一份 strategy_launch.py 程式碼,而不需要額外複製成一份 strategy_launch_2.py 來各自運行。這對於未來程式碼維護有相當大的幫助。
關於 argparse,我們之後再花個篇幅來講解吧!希望這篇對於想建構自己的交易系統的讀者有幫助。