iT邦幫忙

2023 iThome 鐵人賽

DAY 28
0
Cloud Native

AWS AI交易室實戰系列 第 28

Day 28 - 演算法交易 - 回溯測試

  • 分享至 

  • xImage
  •  

~ 反覆測試是提升軟體品質唯一途徑 ~

github: https://github.com/slindevel/modern-aws-marathon

今天我們使用昨天的模型來進行回溯測試,驗證模型是否有效
一樣先部署環境

$ aws cloudformation create-stack --stack-name algorithmic-trading --template-body file://Day26/cloudformation.yaml --capabilities CAPABILITY_IAM

然後進到 SageMaker Notebook Instance ,打開 AlgorithmicTradingXXX 這個 Instance,一樣我們 kernel 選擇 conda_python3

然後開啟 Strategy_ML_Forecast.ipynb 這個 notebook,照順序執行

歷史資料回溯測試

在這份筆記中,我們將會使用昨日產生的模型來進行回測
可以把先前的訓練模型 .h5 放到 Day28/model/model_long_short_predict.h5

資料準備

一樣我們利用 athena 直接從 S3 把資料撈出來
一直到 dfTest["close"].plot() 會畫出簡單的 Daily 收盤價圖表
close price plot

修改策略配置

在下面的單元格中,您可以調整策略的參數。
可以調整 hyperparameters.json 的參數如下:
user = 名稱(可選)
long_threshold = 多頭交易的閾值(0 到 1)
short_threshold = 空頭交易的閾值(0 到 1)
profit_target_pct = 利潤目標百分比
stop_target_pct = 止損目標百分比
size = 交易的股數
提改進策略的一個好的起點是修改利潤目標/止損目標以及風險/回報比。
另一個選擇是通過增加閾值來減少信號的數量。
第一次執行我們先採用以下參數:

{ "user" : "user",
  "long_threshold" : "0.5",
  "short_threshold" : "0.5",
  "profit_target_pct" : "2.00",
  "stop_target_pct" : "1.50",
  "size" : "100"
}

接著是核心策略程式
重點如下:
next 方法是策略的核心,它在每個交易日呼叫一次。在這裡,策略計算技術指標(SMA和ROC)並準備模型的輸入數據。
inputRec 是用於存儲輸入數據的列表,包括日期(dt)和收盤價(close)。
接下來是計算SMA(簡單移動平均)和ROC(變化率)技術指標,並將它們添加到 inputRec 中。
型預測兩個值,分別代表長期和短期的信號(tLong和tShort)。
如果策略目前沒有持倉(position),則根據預測的信號和閾值,判斷是進行多頭交易(buy)還是空頭交易(sell)。如果預測的tLong大於長期閾值,則執行多頭交易;如果預測的tShort大於短期閾值,則執行空頭交易。
如果策略目前有持倉,則根據限價價格(limitPrice)和停損價格(stopPrice)來判斷是否應該平倉。
總之,這個策略將深度學習模型的預測信號與技術指標結合在一起,來做出交易決策,並根據預定的利潤目標和停損目標來進行風險管理。

執行本地端回溯測試

第一次因為要初始化 docker build image,時間會比較久
輸出圖表如下:
performance

接著我們可以重複 修改策略配置 ~ 執行本地端回溯測試 步驟來調整我們的策略
調整完畢之後可以將 docker image 推送到 ECR 上準備部署到 SageMaker 的 ECS 上

在Amazon SageMaker上運行 Remote Forwardtest 的操作。

引用SageMaker相關的庫和工具:

import sagemaker as sage: 引用SageMaker的Python SDK。
from sagemaker import get_execution_role: 從SageMaker庫中引入用於獲取執行角色的函數。
from sagemaker.estimator import Estimator: 引入SageMaker估算器,用於定義和訓練機器學習模型。
獲取SageMaker執行角色和建立SageMaker會話:

role = get_execution_role(): 使用get_execution_role函數獲取SageMaker的執行角色,該角色賦予了運行SageMaker作業的權限。
sess = sage.Session(): 建立SageMaker會話,用於管理SageMaker作業。

上傳訓練數據到S3存儲桶:
WORK_DIRECTORY定義了本地訓練數據的目錄。
data_location = sess.upload_data(WORK_DIRECTORY, key_prefix='data'):使用SageMaker會話的upload_data方法將本地訓練數據上傳到S3存儲桶中,同時指定了上傳的目標路徑。
讀取並設置模型的 hyperparameters 配置:

conf_file定義了超參數配置文件的路徑。
使用 json.load(f) 讀取超參數配置文件,並將其存儲在config變數中。
配置 SageMaker 估算器:

prefix 和 job_name 用於定義作業名稱。
account 和 region用於獲取AWS帳戶和區域信息。
image 指定了 Docker 映像的 URI,其中包含了要運行的機器學習算法。
algo = sage.estimator.Estimator(...): 創建一個SageMaker估算器,配置了執行訓練作業所需的所有參數,包括執行角色、實例數量、實例類型、輸出路徑、超參數等。

訓練模型:
algo.fit(data_location): 使用估算器的 fit 方法開始訓練模型,並將訓練數據從 S3 存儲桶中讀取。訓練完成後,模型的結果和輸出將被存儲在指定的 S3 存儲桶中。

最後我們得到一組關於回測的績效數字:
PNL and Sharpe ratio

完全沒調整參數的夏普 ratio 是負的XD

最後別忘了清理資源:

$ aws cloudformation delete-stack --stack-name algorithmic-trading

參考資料:

https://aws.amazon.com/tw/blogs/industries/algorithmic-trading-on-aws-with-amazon-sagemaker-and-aws-data-exchange/


上一篇
Day 27 演算法交易 - 訓練模型
下一篇
Day 29 - Solace PubSub+ On ECS
系列文
AWS AI交易室實戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言