diff --git a/examples/FinRL_PaperTrading_Demo_refactored.py b/examples/FinRL_PaperTrading_Demo_refactored.py deleted file mode 100644 index 7ab107f..0000000 --- a/examples/FinRL_PaperTrading_Demo_refactored.py +++ /dev/null @@ -1,213 +0,0 @@ - -# install finrl library -# %pip install --upgrade git+https://github.com/AI4Finance-Foundation/FinRL.git -# Alpaca keys -from __future__ import annotations - -# import argparse - -# parser = argparse.ArgumentParser() -# parser.add_argument("data_key", help="data source api key") -# parser.add_argument("data_secret", help="data source api secret") -# parser.add_argument("data_url", help="data source api base url") -# parser.add_argument("trading_key", help="trading api key") -# parser.add_argument("trading_secret", help="trading api secret") -# parser.add_argument("trading_url", help="trading api base url") -# args = parser.parse_args() -DATA_API_KEY = "PKVD6WOSPEMKS0UI6A3K" #args.data_key -DATA_API_SECRET = "BxT64PIQtDBb*tnW" #args.data_secret -DATA_API_BASE_URL = 'https://paper-api.alpaca.markets' #args.data_url -TRADING_API_KEY = "PKVD6WOSPEMKS0UI6A3K" #args.trading_key -TRADING_API_SECRET = "BxT64PIQtDBb*tnW" #args.trading_secret -TRADING_API_BASE_URL = 'https://paper-api.alpaca.markets' #args.trading_url - -print("DATA_API_KEY: ", DATA_API_KEY) -print("DATA_API_SECRET: ", DATA_API_SECRET) -print("DATA_API_BASE_URL: ", DATA_API_BASE_URL) -print("TRADING_API_KEY: ", TRADING_API_KEY) -print("TRADING_API_SECRET: ", TRADING_API_SECRET) -print("TRADING_API_BASE_URL: ", TRADING_API_BASE_URL) - -import alpaca_trade_api -from finrl.meta.env_stock_trading.env_stocktrading_np import StockTradingEnv -from finrl.meta.paper_trading.alpaca import PaperTradingAlpaca -from finrl.meta.paper_trading.common import train, test, alpaca_history, DIA_history -# from finrl.meta.PaperTradingAlpaca.alpaca_trade_api import PaperTradingAlpaca -from finrl.config import INDICATORS - - - -# ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. -# xgboost 2.1.1 requires nvidia-nccl-cu12; platform_system == "Linux" and platform_machine != "aarch64", which is not installed. -# cudf-cu12 24.4.1 requires pandas<2.2.2dev0,>=2.0, but you have pandas 2.2.2 which is incompatible. -# google-colab 1.0.0 requires pandas==2.1.4, but you have pandas 2.2.2 which is incompatible. -# osqp 0.6.7.post0 requires scipy!=1.12.0,>=0.13.2, but you have scipy 1.12.0 which is incompatible. - - -# pip install finrl.meta.paper_trading.alpaca -# pip install finrl.meta.paper_trading.common - -# Import Dow Jones 30 Symbols -from finrl.config_tickers import DOW_30_TICKER - -ticker_list = DOW_30_TICKER -env = StockTradingEnv -# if you want to use larger datasets (change to longer period), and it raises error, please try to increase "target_step". It should be larger than the episode steps. -ERL_PARAMS = { - "learning_rate": 3e-6, - "batch_size": 2048, - "gamma": 0.985, - "seed": 312, - "net_dimension": [128, 64], - "target_step": 5000, - "eval_gap": 30, - "eval_times": 1, -} - -# Set up sliding window of 6 days training and 2 days testing -import datetime -from pandas.tseries.offsets import BDay # BDay is business day, not birthday... - -today = datetime.datetime.today() - -TEST_END_DATE = (today - BDay(1)).to_pydatetime().date() -TEST_START_DATE = (TEST_END_DATE - BDay(1)).to_pydatetime().date() -TRAIN_END_DATE = (TEST_START_DATE - BDay(1)).to_pydatetime().date() -TRAIN_START_DATE = (TRAIN_END_DATE - BDay(5)).to_pydatetime().date() -TRAINFULL_START_DATE = TRAIN_START_DATE -TRAINFULL_END_DATE = TEST_END_DATE - -TRAIN_START_DATE = str(TRAIN_START_DATE) -TRAIN_END_DATE = str(TRAIN_END_DATE) -TEST_START_DATE = str(TEST_START_DATE) -TEST_END_DATE = str(TEST_END_DATE) -TRAINFULL_START_DATE = str(TRAINFULL_START_DATE) -TRAINFULL_END_DATE = str(TRAINFULL_END_DATE) - -print("TRAIN_START_DATE: ", TRAIN_START_DATE) -print("TRAIN_END_DATE: ", TRAIN_END_DATE) -print("TEST_START_DATE: ", TEST_START_DATE) -print("TEST_END_DATE: ", TEST_END_DATE) -print("TRAINFULL_START_DATE: ", TRAINFULL_START_DATE) -print("TRAINFULL_END_DATE: ", TRAINFULL_END_DATE) - -train( - start_date=TRAIN_START_DATE, - end_date=TRAIN_END_DATE, - ticker_list=ticker_list, - data_source="alpaca", - time_interval="1Min", - technical_indicator_list=INDICATORS, - drl_lib="elegantrl", - env=env, - model_name="ppo", - if_vix=True, - API_KEY=DATA_API_KEY, - API_SECRET=DATA_API_SECRET, - API_BASE_URL=DATA_API_BASE_URL, - erl_params=ERL_PARAMS, - cwd="./papertrading_erl", # current_working_dir - break_step=1e5, -) - -account_value_erl = test( - start_date=TEST_START_DATE, - end_date=TEST_END_DATE, - ticker_list=ticker_list, - data_source="alpaca", - time_interval="1Min", - technical_indicator_list=INDICATORS, - drl_lib="elegantrl", - env=env, - model_name="ppo", - if_vix=True, - API_KEY=DATA_API_KEY, - API_SECRET=DATA_API_SECRET, - API_BASE_URL=DATA_API_BASE_URL, - cwd="./papertrading_erl", - net_dimension=ERL_PARAMS["net_dimension"], -) - -train( - start_date=TRAINFULL_START_DATE, # After tuning well, retrain on the training and testing sets - end_date=TRAINFULL_END_DATE, - ticker_list=ticker_list, - data_source="alpaca", - time_interval="1Min", - technical_indicator_list=INDICATORS, - drl_lib="elegantrl", - env=env, - model_name="ppo", - if_vix=True, - API_KEY=DATA_API_KEY, - API_SECRET=DATA_API_SECRET, - API_BASE_URL=DATA_API_BASE_URL, - erl_params=ERL_PARAMS, - cwd="./papertrading_erl_retrain", - break_step=2e5, -) - -action_dim = len(DOW_30_TICKER) -state_dim = ( - 1 + 2 + 3 * action_dim + len(INDICATORS) * action_dim -) # Calculate the DRL state dimension manually for paper trading. amount + (turbulence, turbulence_bool) + (price, shares, cd (holding time)) * stock_dim + tech_dim - -paper_trading_erl = PaperTradingAlpaca( - ticker_list=DOW_30_TICKER, - time_interval="1Min", - drl_lib="elegantrl", - agent="ppo", - cwd="./papertrading_erl_retrain", - net_dim=ERL_PARAMS["net_dimension"], - state_dim=state_dim, - action_dim=action_dim, - API_KEY=TRADING_API_KEY, - API_SECRET=TRADING_API_SECRET, - API_BASE_URL=TRADING_API_BASE_URL, - tech_indicator_list=INDICATORS, - turbulence_thresh=30, - max_stock=1e2, -) - -paper_trading_erl.run() - -# Check Portfolio Performance -# ## Get cumulative return -df_erl, cumu_erl = alpaca_history( - key=DATA_API_KEY, - secret=DATA_API_SECRET, - url=DATA_API_BASE_URL, - start="2022-09-01", # must be within 1 month - end="2022-09-12", -) # change the date if error occurs - -df_djia, cumu_djia = DIA_history(start="2022-09-01") -returns_erl = cumu_erl - 1 -returns_dia = cumu_djia - 1 -returns_dia = returns_dia[: returns_erl.shape[0]] - -# plot and save -import matplotlib.pyplot as plt - -plt.figure(dpi=1000) -plt.grid() -plt.grid(which="minor", axis="y") -plt.title("Stock Trading (Paper trading)", fontsize=20) -plt.plot(returns_erl, label="ElegantRL Agent", color="red") -# plt.plot(returns_sb3, label = 'Stable-Baselines3 Agent', color = 'blue' ) -# plt.plot(returns_rllib, label = 'RLlib Agent', color = 'green') -plt.plot(returns_dia, label="DJIA", color="grey") -plt.ylabel("Return", fontsize=16) -plt.xlabel("Year 2021", fontsize=16) -plt.xticks(size=14) -plt.yticks(size=14) -ax = plt.gca() -ax.xaxis.set_major_locator(ticker.MultipleLocator(78)) -ax.xaxis.set_minor_locator(ticker.MultipleLocator(6)) -ax.yaxis.set_minor_locator(ticker.MultipleLocator(0.005)) -ax.yaxis.set_major_formatter(ticker.PercentFormatter(xmax=1, decimals=2)) -ax.xaxis.set_major_formatter( - ticker.FixedFormatter(["", "10-19", "", "10-20", "", "10-21", "", "10-22"]) -) -plt.legend(fontsize=10.5) -plt.savefig("papertrading_stock.png") diff --git a/examples/FinRL_GPM_Demo.ipynb b/examples/PY/FinRL_GPM_Demo.ipynb similarity index 100% rename from examples/FinRL_GPM_Demo.ipynb rename to examples/PY/FinRL_GPM_Demo.ipynb diff --git a/examples/README.md b/examples/PY/README.md similarity index 100% rename from examples/README.md rename to examples/PY/README.md diff --git a/examples/Welcome_To_Colab.ipynb b/examples/PY/Welcome_To_Colab.ipynb similarity index 100% rename from examples/Welcome_To_Colab.ipynb rename to examples/PY/Welcome_To_Colab.ipynb diff --git a/examples/tradingBot.ipynb b/examples/PY/tradingBot.ipynb similarity index 100% rename from examples/tradingBot.ipynb rename to examples/PY/tradingBot.ipynb diff --git a/examples/PY/train.py b/examples/PY/train.py deleted file mode 100644 index f1c7171..0000000 --- a/examples/PY/train.py +++ /dev/null @@ -1,11 +0,0 @@ -# train.py - -import datetime -import pytz -def main(): - # Get current time in UTC - datetime_utc = datetime.datetime.now(pytz.utc) - return datetime_utc - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/examples/PY1/index.py b/examples/PY1/index.py deleted file mode 100644 index c814553..0000000 --- a/examples/PY1/index.py +++ /dev/null @@ -1,37 +0,0 @@ -from flask import Flask, request, jsonify # Import the Flask class from the flask module -import time # Example module to simulate processing time -from flask_cors import CORS # This is the only new import # Import the Flask class from -app = Flask(__name__) # Create a Flask app -CORS(app) # This will enable CORS for all routes - -# Define a route -@app.route('/your-endpoint') -def your_function(): - data = {"message": "Hello, world! ferom your-endpoint"} - return jsonify(data) - -@app.route('/run-script', methods=['POST']) -def run_script(): - data = request.json.get('data') - # Simulate running a Python script (replace this with your actual logic) - time.sleep(2) # Simulating a delay - result = f'Processed data: {data}' # Example response - - return jsonify({'message': result}) - - -@app.route('/') -def home(): - return 'Hello, From The Home route World!' - -@app.route('/about') -def about(): - return 'About' - -from datetime import datetime -now = datetime.now() -formatted_time = now.strftime("%Y-%m-%d %H:%M:%S") -print(f"Hello from greet.py at {formatted_time}") - -if __name__ == '__main__': - app.run(debug=True) diff --git a/examples/PY1/requirements.txt b/examples/PY1/requirements.txt deleted file mode 100644 index 23a17b8..0000000 --- a/examples/PY1/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -Flask - CORS -flask diff --git a/examples/PY1/t1.py b/examples/PY1/t1.py deleted file mode 100644 index 11a8517..0000000 --- a/examples/PY1/t1.py +++ /dev/null @@ -1,45 +0,0 @@ -# import { NextResponse } from 'next/server' -# import { exec } from 'child_process' -# import { promisify } from 'util' -# import path from 'path' - -# const PYscriptPath = path.join(process.cwd(), 'py', 'greet.py') - -# const execPromise = promisify(exec) - -# export async function GET() { -# try { -# const { stdout, stderr } = await execPromise('python3 ' + PYscriptPath) -# if (stderr) { -# throw new Error(stderr) -# } -# return NextResponse.json({ output: stdout }) -# } catch (error: any) { -# return NextResponse.json({ error: error.message }, { status: 500 }) -# } -# } - -# from http.server import BaseHTTPRequestHandler - -# class handler(BaseHTTPRequestHandler): - -# def do_GET(self): -# self.send_response(200) -# self.send_header('Content-type','text/plain') -# self.end_headers() -# self.wfile.write('Hello, world!'.encode('utf-8')) -# return - -# // /jojobot/pages/api/run-script.ts -# import { exec } from 'child_process'; -# import type { NextApiRequest, NextApiResponse } from 'next'; - -# export default function handler(req: NextApiRequest, res: NextApiResponse) { -# exec('python ./../../scripts/train.py', (error, stdout, stderr) => { -# if (error) { -# res.status(500).json({ error: stderr }); -# } else { -# res.status(200).json({ message: 'Script executed successfully' }); -# } -# }); -# } diff --git a/results/a2c/events.out.tfevents.1726691915.Dovs-Mac-mini.lan.8454.0 b/results/a2c/events.out.tfevents.1726691915.Dovs-Mac-mini.lan.8454.0 new file mode 100644 index 0000000..143960d Binary files /dev/null and b/results/a2c/events.out.tfevents.1726691915.Dovs-Mac-mini.lan.8454.0 differ diff --git a/results/a2c/progress.csv b/results/a2c/progress.csv new file mode 100644 index 0000000..2cd3ec6 --- /dev/null +++ b/results/a2c/progress.csv @@ -0,0 +1,49 @@ +train/learning_rate,time/time_elapsed,train/policy_loss,time/fps,train/n_updates,time/iterations,train/value_loss,train/reward,train/std,time/total_timesteps,train/explained_variance,train/entropy_loss +0.0007,2,-74.3642578125,245,99,100,4.111029624938965,0.7497101,1.0100085735321045,500,-1.1920928955078125e-07,-41.44053649902344 +0.0007,4,-42.97338104248047,246,199,200,1.4435676336288452,-1.7428899,1.0068436861038208,1000,5.960464477539063e-08,-41.34551239013672 +0.0007,6,-94.30303955078125,247,299,300,5.854915618896484,2.1937532,1.006235957145691,1500,0.0,-41.32484817504883 +0.0007,8,-34.903045654296875,248,399,400,8.9045991897583,1.4102328,1.0064964294433594,2000,1.1920928955078125e-07,-41.33871841430664 +0.0007,10,819.3292846679688,249,499,500,463.5390625,-11.511248,1.0085047483444214,2500,0.0,-41.387718200683594 +0.0007,12,151.82650756835938,248,599,600,29.354578018188477,7.184701,1.0106654167175293,3000,0.0,-41.4479866027832 +0.0007,14,52.44624710083008,249,699,700,3.5494658946990967,0.7289398,1.0089203119277954,3500,0.22244632244110107,-41.404991149902344 +0.0007,16,-76.81065368652344,249,799,800,5.5358805656433105,0.5767132,1.0112756490707397,4000,-1.1920928955078125e-07,-41.46906280517578 +0.0007,18,178.88169860839844,249,899,900,20.299692153930664,-1.6430764,1.0107210874557495,4500,0.0,-41.44734191894531 +0.0007,19,136.80958557128906,250,999,1000,20.320735931396484,-0.09090267,1.0102941989898682,5000,0.0,-41.4426383972168 +0.0007,21,-19.47471046447754,250,1099,1100,1.1766986846923828,-0.109355226,1.0104608535766602,5500,0.0,-41.437469482421875 +0.0007,23,-66.462646484375,250,1199,1200,3.514875888824463,0.9185401,1.011630892753601,6000,0.0,-41.480464935302734 +0.0007,25,-44.101985931396484,251,1299,1300,30.683090209960938,3.897964,1.0139535665512085,6500,0.0,-41.540016174316406 +0.0007,27,12.72399616241455,251,1399,1400,1.3714618682861328,-0.7747996,1.0151234865188599,7000,0.0,-41.568111419677734 +0.0007,29,41.147865295410156,251,1499,1500,5.437386989593506,0.22232868,1.0166807174682617,7500,-1.1920928955078125e-07,-41.60774230957031 +0.0007,31,181.95187377929688,251,1599,1600,20.794193267822266,1.9493934,1.0152662992477417,8000,0.3038806915283203,-41.57598114013672 +0.0007,33,225.45809936523438,251,1699,1700,43.578102111816406,-0.9676947,1.0166215896606445,8500,0.0,-41.61206817626953 +0.0007,35,-60.9229621887207,252,1799,1800,3.6824803352355957,-1.8045743,1.0165600776672363,9000,0.0,-41.61063003540039 +0.0007,37,21.38580322265625,252,1899,1900,1.0516576766967773,5.870547,1.0182645320892334,9500,0.0,-41.654666900634766 +0.0007,39,-456.7494201660156,252,1999,2000,129.02403259277344,-10.626338,1.017586588859558,10000,-1.1920928955078125e-07,-41.64540481567383 +0.0007,41,17.797176361083984,253,2099,2100,0.7895277738571167,0.33101913,1.019006609916687,10500,-3.1113624572753906e-05,-41.67653274536133 +0.0007,43,157.3236541748047,253,2199,2200,14.091987609863281,0.20640537,1.019711971282959,11000,0.0,-41.69121170043945 +0.0007,45,-47.32422637939453,253,2299,2300,1.4001591205596924,0.38750395,1.0207339525222778,11500,0.0,-41.72613525390625 +0.0007,47,131.2424774169922,253,2399,2400,13.512718200683594,1.2321388,1.0209044218063354,12000,0.0,-41.723480224609375 +0.0007,49,-174.09437561035156,253,2499,2500,34.554107666015625,-2.5202577,1.0207101106643677,12500,0.0,-41.72134780883789 +0.0007,51,-1041.7216796875,253,2599,2600,695.9363403320312,-12.493273,1.0220218896865845,13000,-1.1920928955078125e-07,-41.75672912597656 +0.0007,53,-98.36091613769531,253,2699,2700,66.14420318603516,-4.92619,1.02048659324646,13500,0.0,-41.713157653808594 +0.0007,55,-149.48399353027344,254,2799,2800,21.07815933227539,-0.998893,1.0211459398269653,14000,0.0,-41.7337532043457 +0.0007,57,133.90345764160156,254,2899,2900,10.688289642333984,0.061222944,1.023769497871399,14500,0.0,-41.80055618286133 +0.0007,59,-254.023681640625,253,2999,3000,41.25505828857422,1.6023436,1.02464759349823,15000,0.0,-41.83030700683594 +0.0007,61,-37.85054397583008,253,3099,3100,2.0887012481689453,0.1608096,1.0243604183197021,15500,0.0,-41.830963134765625 +0.0007,63,325.3699035644531,253,3199,3200,63.2136116027832,-0.05148216,1.02467942237854,16000,0.0,-41.82754898071289 +0.0007,65,36.24055862426758,253,3299,3300,27.550729751586914,-0.6775099,1.0253615379333496,16500,0.0,-41.849578857421875 +0.0007,67,-7.794083595275879,253,3399,3400,0.09318037331104279,0.112110704,1.0260237455368042,17000,0.0,-41.86636734008789 +0.0007,68,-6.526714324951172,253,3499,3500,0.14600633084774017,-1.1977484,1.026294469833374,17500,0.0,-41.87665939331055 +0.0007,70,-74.42988586425781,253,3599,3600,5.086429595947266,0.97204703,1.026207447052002,18000,5.960464477539063e-08,-41.86923599243164 +0.0007,72,-166.59735107421875,253,3699,3700,18.50104331970215,-2.7111251,1.0263597965240479,18500,-0.0017511844635009766,-41.87283706665039 +0.0007,74,-39.21350860595703,254,3799,3800,1.3631260395050049,1.9299359,1.0275452136993408,19000,-1.1920928955078125e-07,-41.9076042175293 +0.0007,76,-907.8553466796875,254,3899,3900,534.031982421875,6.651687,1.0289162397384644,19500,0.0,-41.947574615478516 +0.0007,78,14.819589614868164,254,3999,4000,11.063568115234375,0.60868263,1.0277053117752075,20000,1.7881393432617188e-07,-41.911136627197266 +0.0007,80,-203.96658325195312,253,4099,4100,24.852596282958984,-1.8064699,1.0294923782348633,20500,-0.0025655031204223633,-41.96403503417969 +0.0007,82,-39.99943161010742,253,4199,4200,2.228012800216675,0.8299293,1.0321099758148193,21000,1.7881393432617188e-07,-42.03961181640625 +0.0007,84,-54.255088806152344,253,4299,4300,4.920400142669678,2.5731156,1.0338841676712036,21500,-1.1920928955078125e-07,-42.07665252685547 +0.0007,86,-7.874614715576172,253,4399,4400,2.3439254760742188,0.4676571,1.0360708236694336,22000,-1.1920928955078125e-07,-42.1423454284668 +0.0007,88,169.01058959960938,253,4499,4500,24.22829246520996,3.4366474,1.0359405279159546,22500,0.0048403143882751465,-42.13656234741211 +0.0007,90,-47.8806037902832,253,4599,4600,24.257396697998047,1.2791215,1.0351194143295288,23000,0.0,-42.111881256103516 +0.0007,92,198.0962677001953,253,4699,4700,97.28303527832031,5.2986403,1.0383222103118896,23500,0.0,-42.20410919189453 +0.0007,94,84.29947662353516,253,4799,4800,8.951359748840332,0.228273,1.0394012928009033,24000,0.006460428237915039,-42.2314453125