AI4Finance-Foundation / FinRL

FinRL: Financial Reinforcement Learning. 🔥
https://ai4finance.org
MIT License
9.91k stars 2.39k forks source link

TypeError: can't multiply sequence by non-int of type 'numpy.float64' #558

Open mokzheen opened 2 years ago

mokzheen commented 2 years ago

image

Athe-kunal commented 2 years ago

Hi @mokzheen Please let me know which tutorial or code snippet are you using?

rafael-bianchi commented 2 years ago

I got the same error.

Here is my snippet:

!pip install git+https://github.com/AI4Finance-LLC/FinRL-Library.git

import datetime
import os
import sys
from pprint import pprint

import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from finrl import config, config_tickers
from finrl.agents.stablebaselines3.models import DRLAgent
from finrl.finrl_meta.data_processor import DataProcessor
from finrl.finrl_meta.env_stock_trading.env_stocktrading import StockTradingEnv
from finrl.finrl_meta.preprocessor.preprocessors import (FeatureEngineer,
                                                         data_split)
from finrl.finrl_meta.preprocessor.yahoodownloader import YahooDownloader
from finrl.main import check_and_make_directories
from finrl.plot import (backtest_plot, backtest_stats, get_baseline,
                        get_daily_return, convert_daily_return_to_pyfolio_ts)

sys.path.append("../FinRL-Library")

import itertools

from finrl.config import (DATA_SAVE_DIR, RESULTS_DIR, TENSORBOARD_LOG_DIR,
                          TRAINED_MODEL_DIR)

train_start_date = '2006-01-01' #@param {type:"date"}
train_end_date = '2018-11-30' #@param {type:"date"}

#test_start_date = '2020-08-01' #@param {type:"date"}
#test_end_date = '2021-10-01' #@param {type:"date"}

trade_start_date = '2018-12-01' #@param {type:"date"}
trade_end_date = '2021-12-31' #@param {type:"date"}

check_and_make_directories([DATA_SAVE_DIR, TRAINED_MODEL_DIR, TENSORBOARD_LOG_DIR, RESULTS_DIR])

df_raw = YahooDownloader(start_date = train_start_date,
                     end_date = trade_end_date,
                     ticker_list = config_tickers.DOW_30_TICKER).fetch_data()

fe = FeatureEngineer(
                    use_technical_indicator=True,
                    tech_indicator_list = config.INDICATORS,
                    use_vix=True,
                    use_turbulence=True,
                    user_defined_feature = False)

df_pp = fe.preprocess_data(df_raw)

list_ticker = df_pp["tic"].unique().tolist()
list_date = list(pd.date_range(df_pp['date'].min(),df_pp['date'].max()).astype(str))
combination = list(itertools.product(list_date,list_ticker))

df_pp_f = pd.DataFrame(combination,columns=["date","tic"]).merge(df_pp,on=["date","tic"],how="left")
df_pp_f = df_pp_f[df_pp_f['date'].isin(df_pp['date'])]
df_pp_f.sort_values(['date','tic'], inplace=True)

df_pp_f.fillna(0, inplace=True)

train = data_split(df_pp_f, train_start_date, train_end_date)
test = data_split(df_pp_f, trade_start_date, trade_end_date)

stock_dimension = len(train.tic.unique())
state_space = 1 + 2*stock_dimension + len(config.INDICATORS)*stock_dimension
print(f"Stock Dimension: {stock_dimension}, State Space: {state_space}")

#%%

buy_cost_list = sell_cost_list = [0.001] * stock_dimension
num_stock_shares = [0] * stock_dimension

env_kwargs = {
    "hmax": 100,
    "initial_amount": 1000000,
    "num_stock_shares": num_stock_shares,
    "buy_cost_pct": buy_cost_list,
    "sell_cost_pct": sell_cost_list,
    "state_space": state_space,
    "stock_dim": stock_dimension,
    "tech_indicator_list": config.INDICATORS,
    "action_space": stock_dimension,
    "reward_scaling": 1e-4
}

e_train_gym = StockTradingEnv(df = train, model_name = 'A2C', mode= 'TRAIN', **env_kwargs)
env_train, _ = e_train_gym.get_sb_env()

agent = DRLAgent(env = env_train)
model_a2c = agent.get_model("a2c")

trained_a2c = agent.train_model(model=model_a2c,
                             tb_log_name='a2c',
                             total_timesteps=50000)

e_trade_gym = StockTradingEnv(df = test, mode='TRADE', model_name='A2C', turbulence_threshold = 70, risk_indicator_col = 'vix', **env_kwargs)
df_daily_return, df_actions = DRLAgent.DRL_prediction(model=trained_a2c,
                    environment = e_trade_gym)
rafael-bianchi commented 2 years ago

I was trying to debug the environment, and I added a few prints() to see what each variable had when the exception was raised:

image

It seems that the sell_num_shares should be an int, right? The exception happens here

sahibnoor1996 commented 1 year ago

How to fetch data for multiple crypto currencies using YahooDownloader??