接下來幾天我要開始使用FinRL
的API來搭建一個簡單的加密貨幣的自動交易機器人;在重新審視FinRL
時,我發現FinRL
中其實範例多種多樣,其中竟然還有一個BitcoinEnv
。
在開始嘗試使用後,我就碰到了問題,在資料處理方面從finrl\meta\data_processors\processor_ccxt.py
中可以找到CCXTEngineer
搭配BitcoinEnv
的使用;然而接下來就碰到了很麻煩的問題,在選擇DRLAgent
的時候,無論選擇from finrl.agents.stablebaselines3.models import DRLAgent
還是from finrl.agents.elegantrl.models import DRLAgent
要訓練其中的DRL
模型時(如PPO
, DDPG
, ...等等),都會發生錯誤,因為BitcoinEnv
的實作與其不相容。
如果選擇使用from finrl.agents.stablebaselines3.models import DRLAgent
,則對應的Env
必須要繼承gym.Env
;而BitcoinEnv
沒有。
選擇使用``from finrl.agents.elegantrl.models import DRLAgent時,也仍然會因為
BitcoinEnv中定義的
function,
variable`名稱不相容而出現各種各樣的錯誤;因此我今天嘗試了很久,最後仍然失敗了。
如果最後還是無法有效解決,我會回去繼續使用比較標準的StockTradingEnv
;不過在抽特徵的時候,可能會參考BitcoinEnv
與CCXTEngineer
中的一些內容像是
["macd", "boll_ub", "boll_lb", "rsi_30", "dx_30", "close_30_sma", "close_60_sma"]
ohlcv
中的close
參考的CCXTEngineer
部分內容如下:
def add_technical_indicators(
self,
df,
pair_list,
tech_indicator_list=[
"macd",
"boll_ub",
"boll_lb",
"rsi_30",
"dx_30",
"close_30_sma",
"close_60_sma",
],
):
df = df.dropna()
df = df.copy()
column_list = [
pair_list,
["open", "high", "low", "close", "volume"] + (tech_indicator_list),
]
column = pd.MultiIndex.from_product(column_list)
index_list = df.index
dataset = pd.DataFrame(columns=column, index=index_list)
for pair in pair_list:
pair_column = pd.MultiIndex.from_product(
[[pair], ["open", "high", "low", "close", "volume"]]
)
dataset[pair_column] = df[pair]
temp_df = df[pair].reset_index().sort_values(by=["index"])
temp_df = temp_df.rename(columns={"index": "date"})
crypto_df = Sdf.retype(temp_df.copy())
for indicator in tech_indicator_list:
temp_indicator = crypto_df[indicator].values.tolist()
dataset[(pair, indicator)] = temp_indicator
print("Succesfully add technical indicators")
return dataset
def df_to_ary(
self,
df,
pair_list,
tech_indicator_list=[
"macd",
"boll_ub",
"boll_lb",
"rsi_30",
"dx_30",
"close_30_sma",
"close_60_sma",
],
):
df = df.dropna()
date_ary = df.index.values
price_array = df[pd.MultiIndex.from_product([pair_list, ["close"]])].values
tech_array = df[
pd.MultiIndex.from_product([pair_list, tech_indicator_list])
].values
return price_array, tech_array, date_ary