Buckets:
| import"../chunks/DsnmJJEf.js";import{i as iJ,h as yJ,C as eJ,H as l,a as U,E as wJ,s as oJ}from"../chunks/C07d6Hje.js";import{p as CJ,o as cJ,s as J,f as pJ,a as UJ,b as IJ,d as a,c as sJ,r as t,n as rJ}from"../chunks/BSuxAqoA.js";const dJ='{"title":"FinRL Environment","local":"finrl-environment","sections":[{"title":"Overview","local":"overview","sections":[],"depth":2},{"title":"Quick Start","local":"quick-start","sections":[{"title":"1. Build the Docker Image","local":"1-build-the-docker-image","sections":[],"depth":3},{"title":"2. Run the Server","local":"2-run-the-server","sections":[{"title":"Option A: With Default Sample Data","local":"option-a-with-default-sample-data","sections":[],"depth":4},{"title":"Option B: With Custom Configuration","local":"option-b-with-custom-configuration","sections":[],"depth":4}],"depth":3},{"title":"3. Use the Client","local":"3-use-the-client","sections":[],"depth":3}],"depth":2},{"title":"Architecture","local":"architecture","sections":[],"depth":2},{"title":"API Reference","local":"api-reference","sections":[{"title":"FinRLAction","local":"finrlaction","sections":[],"depth":3},{"title":"FinRLObservation","local":"finrlobservation","sections":[],"depth":3},{"title":"Client Methods","local":"client-methods","sections":[{"title":"reset() -> StepResult[FinRLObservation]","local":"reset--gt-stepresultfinrlobservation","sections":[],"depth":4},{"title":"step(action: FinRLAction) -> StepResult[FinRLObservation]","local":"stepaction-finrlaction--gt-stepresultfinrlobservation","sections":[],"depth":4},{"title":"state() -> State","local":"state--gt-state","sections":[],"depth":4},{"title":"get_config() -> dict","local":"getconfig--gt-dict","sections":[],"depth":4}],"depth":3}],"depth":2},{"title":"Data Format","local":"data-format","sections":[],"depth":2},{"title":"Configuration Parameters","local":"configuration-parameters","sections":[],"depth":2},{"title":"Integration with RL Frameworks","local":"integration-with-rl-frameworks","sections":[{"title":"Stable Baselines 3","local":"stable-baselines-3","sections":[],"depth":3}],"depth":2},{"title":"Troubleshooting","local":"troubleshooting","sections":[{"title":"Server won’t start","local":"server-wont-start","sections":[],"depth":3},{"title":"Import errors","local":"import-errors","sections":[],"depth":3},{"title":"Configuration errors","local":"configuration-errors","sections":[],"depth":3}],"depth":2},{"title":"Examples","local":"examples","sections":[],"depth":2},{"title":"License","local":"license","sections":[],"depth":2},{"title":"References","local":"references","sections":[],"depth":2}],"depth":1}';var gJ=sJ('<meta name="hf:doc:metadata"/>'),jJ=sJ('<p></p> <!> <!> <p>A wrapper around <a href="https://github.com/AI4Finance-Foundation/FinRL" rel="nofollow">FinRL</a> stock trading environments that conforms to the OpenEnv specification.</p> <!> <p>This environment enables reinforcement learning for stock trading tasks using FinRL’s powerful StockTradingEnv, exposed through OpenEnv’s simple HTTP API. It supports:</p> <ul><li><strong>Stock Trading</strong>: Buy/sell actions across multiple stocks</li> <li><strong>Portfolio Management</strong>: Track balance, holdings, and portfolio value</li> <li><strong>Technical Indicators</strong>: MACD, RSI, CCI, DX, and more</li> <li><strong>Flexible Configuration</strong>: Custom data sources and trading parameters</li></ul> <!> <!> <p>First, build the base image (from OpenEnv root):</p> <!> <p>Then build the FinRL environment image:</p> <!> <!> <!> <!> <p>This starts the server with synthetic sample data for testing.</p> <!> <p>Create a configuration file <code>config.json</code>:</p> <!> <p>Run with configuration:</p> <!> <!> <!> <!> <!> <!> <!> <p>Trading action for the environment.</p> <p><strong>Attributes:</strong></p> <ul><li><code>actions: list[float]</code> - Array of normalized action values (-1 to 1) for each stock <ul><li>Positive values: Buy</li> <li>Negative values: Sell</li> <li>Magnitude: Relative trade size</li></ul></li></ul> <p><strong>Example:</strong></p> <!> <!> <p>Observation returned by the environment.</p> <p><strong>Attributes:</strong></p> <ul><li><code>state: list[float]</code> - Flattened state vector <ul><li>Structure: <code>[balance, prices..., holdings..., indicators...]</code></li></ul></li> <li><code>portfolio_value: float</code> - Total portfolio value (cash + holdings)</li> <li><code>date: str</code> - Current trading date</li> <li><code>done: bool</code> - Whether episode has ended</li> <li><code>reward: float</code> - Reward for the last action</li> <li><code>metadata: dict</code> - Additional information</li></ul> <p><strong>Example:</strong></p> <!> <!> <!> <p>Reset the environment to start a new episode.</p> <!> <!> <p>Execute a trading action.</p> <!> <!> <p>Get episode metadata (episode_id, step_count).</p> <!> <!> <p>Get environment configuration.</p> <!> <!> <p>The environment expects stock data in the following CSV format:</p> <table><thead><tr><th>date</th><th>tic</th><th>close</th><th>high</th><th>low</th><th>open</th><th>volume</th><th>macd</th><th>rsi_30</th><th>cci_30</th><th>dx_30</th></tr></thead><tbody><tr><td>2020-01-01</td><td>AAPL</td><td>100.0</td><td>102.0</td><td>98.0</td><td>99.0</td><td>1000000</td><td>0.5</td><td>55.0</td><td>10.0</td><td>15.0</td></tr><tr><td>2020-01-01</td><td>GOOGL</td><td>1500.0</td><td>1520.0</td><td>1480.0</td><td>1490.0</td><td>500000</td><td>-0.3</td><td>48.0</td><td>-5.0</td><td>20.0</td></tr></tbody></table> <p><strong>Required columns:</strong></p> <ul><li><code>date</code>: Trading date</li> <li><code>tic</code>: Stock ticker symbol</li> <li><code>close</code>, <code>high</code>, <code>low</code>, <code>open</code>: Price data</li> <li><code>volume</code>: Trading volume</li> <li>Technical indicators (as specified in <code>tech_indicator_list</code>)</li></ul> <!> <table><thead><tr><th>Parameter</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>data_path</code></td><td>str</td><td>Path to CSV file with stock data</td></tr><tr><td><code>stock_dim</code></td><td>int</td><td>Number of stocks to trade</td></tr><tr><td><code>hmax</code></td><td>int</td><td>Maximum shares per trade</td></tr><tr><td><code>initial_amount</code></td><td>int</td><td>Starting cash balance</td></tr><tr><td><code>num_stock_shares</code></td><td>list[int]</td><td>Initial holdings for each stock</td></tr><tr><td><code>buy_cost_pct</code></td><td>list[float]</td><td>Transaction cost for buying (per stock)</td></tr><tr><td><code>sell_cost_pct</code></td><td>list[float]</td><td>Transaction cost for selling (per stock)</td></tr><tr><td><code>reward_scaling</code></td><td>float</td><td>Scaling factor for rewards</td></tr><tr><td><code>state_space</code></td><td>int</td><td>Dimension of state vector</td></tr><tr><td><code>action_space</code></td><td>int</td><td>Dimension of action space</td></tr><tr><td><code>tech_indicator_list</code></td><td>list[str]</td><td>Technical indicators to include</td></tr></tbody></table> <!> <!> <!> <!> <!> <ol><li><p>Check if base image exists:</p> <!></li> <li><p>Build base image if missing:</p> <!></li></ol> <!> <p>Make sure you’re in the <code>src</code> directory:</p> <!> <!> <p>Verify your data file has all required columns:</p> <!> <!> <p>See the <code>examples/</code> directory for complete examples:</p> <ul><li><code>examples/finrl_simple.py</code> - Basic usage</li> <li><code>examples/finrl_training.py</code> - Full training loop with PPO</li> <li><code>examples/finrl_backtesting.py</code> - Backtesting a trained agent</li></ul> <!> <p>BSD 3-Clause License (see LICENSE file in repository root)</p> <!> <ul><li><a href="https://arxiv.org/abs/2011.09607" rel="nofollow">FinRL Paper</a></li> <li><a href="https://github.com/AI4Finance-Foundation/FinRL" rel="nofollow">FinRL GitHub</a></li> <li><a href="README">OpenEnv Documentation</a></li></ul> <!> <p></p>',1);function AJ(TJ,aJ){CJ(aJ,!1),cJ(()=>{new URLSearchParams(window.location.search).get("fw")}),iJ();var M=jJ();yJ("1kcz4sb",JJ=>{var lJ=gJ();oJ(lJ,"content",dJ),UJ(JJ,lJ)});var n=J(pJ(M),2);eJ(n,{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"});var i=J(n,2);l(i,{title:"FinRL Environment",local:"finrl-environment",headingTag:"h1"});var y=J(i,4);l(y,{title:"Overview",local:"overview",headingTag:"h2"});var e=J(y,6);l(e,{title:"Quick Start",local:"quick-start",headingTag:"h2"});var w=J(e,2);l(w,{title:"1. Build the Docker Image",local:"1-build-the-docker-image",headingTag:"h3"});var o=J(w,4);U(o,{code:"Y2QlMjBPcGVuRW52JTBBZG9ja2VyJTIwYnVpbGQlMjAtdCUyMGVudnRvcmNoLWJhc2UlM0FsYXRlc3QlMjAtZiUyMHNyYyUyRm9wZW5lbnYlMkZjb3JlJTJGY29udGFpbmVycyUyRmltYWdlcyUyRkRvY2tlcmZpbGUlMjAu",highlighted:`<span class="hljs-built_in">cd</span> OpenEnv | |
| docker build -t envtorch-base:latest -f src/openenv/core/containers/images/Dockerfile .`,lang:"bash",wrap:!1});var C=J(o,4);U(C,{code:"ZG9ja2VyJTIwYnVpbGQlMjAtdCUyMGZpbnJsLWVudiUzQWxhdGVzdCUyMC1mJTIwZW52cyUyRmZpbnJsX2VudiUyRnNlcnZlciUyRkRvY2tlcmZpbGUlMjAu",highlighted:"docker build -t finrl-env:latest -f envs/finrl_env/server/Dockerfile .",lang:"bash",wrap:!1});var c=J(C,2);l(c,{title:"2. Run the Server",local:"2-run-the-server",headingTag:"h3"});var p=J(c,2);l(p,{title:"Option A: With Default Sample Data",local:"option-a-with-default-sample-data",headingTag:"h4"});var I=J(p,2);U(I,{code:"ZG9ja2VyJTIwcnVuJTIwLXAlMjA4MDAwJTNBODAwMCUyMGZpbnJsLWVudiUzQWxhdGVzdA==",highlighted:"docker run -p 8000:8000 finrl-env:latest",lang:"bash",wrap:!1});var r=J(I,4);l(r,{title:"Option B: With Custom Configuration",local:"option-b-with-custom-configuration",headingTag:"h4"});var d=J(r,4);U(d,{code:"JTdCJTBBJTIwJTIwJTIyZGF0YV9wYXRoJTIyJTNBJTIwJTIyJTJGZGF0YSUyRnN0b2NrX2RhdGEuY3N2JTIyJTJDJTBBJTIwJTIwJTIyc3RvY2tfZGltJTIyJTNBJTIwMyUyQyUwQSUyMCUyMCUyMmhtYXglMjIlM0ElMjAxMDAlMkMlMEElMjAlMjAlMjJpbml0aWFsX2Ftb3VudCUyMiUzQSUyMDEwMDAwMCUyQyUwQSUyMCUyMCUyMm51bV9zdG9ja19zaGFyZXMlMjIlM0ElMjAlNUIwJTJDJTIwMCUyQyUyMDAlNUQlMkMlMEElMjAlMjAlMjJidXlfY29zdF9wY3QlMjIlM0ElMjAlNUIwLjAwMSUyQyUyMDAuMDAxJTJDJTIwMC4wMDElNUQlMkMlMEElMjAlMjAlMjJzZWxsX2Nvc3RfcGN0JTIyJTNBJTIwJTVCMC4wMDElMkMlMjAwLjAwMSUyQyUyMDAuMDAxJTVEJTJDJTBBJTIwJTIwJTIycmV3YXJkX3NjYWxpbmclMjIlM0ElMjAwLjAwMDElMkMlMEElMjAlMjAlMjJzdGF0ZV9zcGFjZSUyMiUzQSUyMDI1JTJDJTBBJTIwJTIwJTIyYWN0aW9uX3NwYWNlJTIyJTNBJTIwMyUyQyUwQSUyMCUyMCUyMnRlY2hfaW5kaWNhdG9yX2xpc3QlMjIlM0ElMjAlNUIlMjJtYWNkJTIyJTJDJTIwJTIycnNpXzMwJTIyJTJDJTIwJTIyY2NpXzMwJTIyJTJDJTIwJTIyZHhfMzAlMjIlNUQlMEElN0Q=",highlighted:`<span class="hljs-punctuation">{</span> | |
| <span class="hljs-attr">"data_path"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"/data/stock_data.csv"</span><span class="hljs-punctuation">,</span> | |
| <span class="hljs-attr">"stock_dim"</span><span class="hljs-punctuation">:</span> <span class="hljs-number">3</span><span class="hljs-punctuation">,</span> | |
| <span class="hljs-attr">"hmax"</span><span class="hljs-punctuation">:</span> <span class="hljs-number">100</span><span class="hljs-punctuation">,</span> | |
| <span class="hljs-attr">"initial_amount"</span><span class="hljs-punctuation">:</span> <span class="hljs-number">100000</span><span class="hljs-punctuation">,</span> | |
| <span class="hljs-attr">"num_stock_shares"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span><span class="hljs-number">0</span><span class="hljs-punctuation">,</span> <span class="hljs-number">0</span><span class="hljs-punctuation">,</span> <span class="hljs-number">0</span><span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span> | |
| <span class="hljs-attr">"buy_cost_pct"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span><span class="hljs-number">0.001</span><span class="hljs-punctuation">,</span> <span class="hljs-number">0.001</span><span class="hljs-punctuation">,</span> <span class="hljs-number">0.001</span><span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span> | |
| <span class="hljs-attr">"sell_cost_pct"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span><span class="hljs-number">0.001</span><span class="hljs-punctuation">,</span> <span class="hljs-number">0.001</span><span class="hljs-punctuation">,</span> <span class="hljs-number">0.001</span><span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span> | |
| <span class="hljs-attr">"reward_scaling"</span><span class="hljs-punctuation">:</span> <span class="hljs-number">0.0001</span><span class="hljs-punctuation">,</span> | |
| <span class="hljs-attr">"state_space"</span><span class="hljs-punctuation">:</span> <span class="hljs-number">25</span><span class="hljs-punctuation">,</span> | |
| <span class="hljs-attr">"action_space"</span><span class="hljs-punctuation">:</span> <span class="hljs-number">3</span><span class="hljs-punctuation">,</span> | |
| <span class="hljs-attr">"tech_indicator_list"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span><span class="hljs-string">"macd"</span><span class="hljs-punctuation">,</span> <span class="hljs-string">"rsi_30"</span><span class="hljs-punctuation">,</span> <span class="hljs-string">"cci_30"</span><span class="hljs-punctuation">,</span> <span class="hljs-string">"dx_30"</span><span class="hljs-punctuation">]</span> | |
| <span class="hljs-punctuation">}</span>`,lang:"json",wrap:!1});var g=J(d,4);U(g,{code:"ZG9ja2VyJTIwcnVuJTIwLXAlMjA4MDAwJTNBODAwMCUyMCU1QyUwQSUyMCUyMC12JTIwJTI0KHB3ZCklMkZjb25maWcuanNvbiUzQSUyRmNvbmZpZyUyRmNvbmZpZy5qc29uJTIwJTVDJTBBJTIwJTIwLXYlMjAlMjQocHdkKSUyRmRhdGElM0ElMkZkYXRhJTIwJTVDJTBBJTIwJTIwLWUlMjBGSU5STF9DT05GSUdfUEFUSCUzRCUyRmNvbmZpZyUyRmNvbmZpZy5qc29uJTIwJTVDJTBBJTIwJTIwZmlucmwtZW52JTNBbGF0ZXN0",highlighted:`docker run -p 8000:8000 \\ | |
| -v $(<span class="hljs-built_in">pwd</span>)/config.json:/config/config.json \\ | |
| -v $(<span class="hljs-built_in">pwd</span>)/data:/data \\ | |
| -e FINRL_CONFIG_PATH=/config/config.json \\ | |
| finrl-env:latest`,lang:"bash",wrap:!1});var j=J(g,2);l(j,{title:"3. Use the Client",local:"3-use-the-client",headingTag:"h3"});var h=J(j,2);U(h,{code:"ZnJvbSUyMGVudnMuZmlucmxfZW52JTIwaW1wb3J0JTIwRmluUkxFbnYlMkMlMjBGaW5STEFjdGlvbiUwQWltcG9ydCUyMG51bXB5JTIwYXMlMjBucCUwQSUwQSUyMyUyMENvbm5lY3QlMjB0byUyMHNlcnZlciUwQWNsaWVudCUyMCUzRCUyMEZpblJMRW52KGJhc2VfdXJsJTNEJTIyaHR0cCUzQSUyRiUyRmxvY2FsaG9zdCUzQTgwMDAlMjIpJTBBJTBBJTIzJTIwR2V0JTIwY29uZmlndXJhdGlvbiUwQWNvbmZpZyUyMCUzRCUyMGNsaWVudC5nZXRfY29uZmlnKCklMEFwcmludChmJTIyVHJhZGluZyUyMCU3QmNvbmZpZyU1QidzdG9ja19kaW0nJTVEJTdEJTIwc3RvY2tzJTIyKSUwQXByaW50KGYlMjJJbml0aWFsJTIwY2FwaXRhbCUzQSUyMCUyNCU3QmNvbmZpZyU1Qidpbml0aWFsX2Ftb3VudCclNUQlM0ElMkMuMGYlN0QlMjIpJTBBJTBBJTIzJTIwUmVzZXQlMjBlbnZpcm9ubWVudCUwQXJlc3VsdCUyMCUzRCUyMGNsaWVudC5yZXNldCgpJTBBcHJpbnQoZiUyMkluaXRpYWwlMjBwb3J0Zm9saW8lMjB2YWx1ZSUzQSUyMCUyNCU3QnJlc3VsdC5vYnNlcnZhdGlvbi5wb3J0Zm9saW9fdmFsdWUlM0ElMkMuMmYlN0QlMjIpJTBBJTBBJTIzJTIwVHJhZGluZyUyMGxvb3AlMEFmb3IlMjBzdGVwJTIwaW4lMjByYW5nZSgxMDApJTNBJTBBJTIwJTIwJTIwJTIwJTIzJTIwR2V0JTIwY3VycmVudCUyMHN0YXRlJTBBJTIwJTIwJTIwJTIwc3RhdGUlMjAlM0QlMjByZXN1bHQub2JzZXJ2YXRpb24uc3RhdGUlMEElMEElMjAlMjAlMjAlMjAlMjMlMjBZb3VyJTIwUkwlMjBwb2xpY3klMjBoZXJlJTIwKGV4YW1wbGUlM0ElMjByYW5kb20lMjBhY3Rpb25zKSUwQSUyMCUyMCUyMCUyMG51bV9zdG9ja3MlMjAlM0QlMjBjb25maWclNUInc3RvY2tfZGltJyU1RCUwQSUyMCUyMCUyMCUyMGFjdGlvbnMlMjAlM0QlMjBucC5yYW5kb20udW5pZm9ybSgtMSUyQyUyMDElMkMlMjBzaXplJTNEbnVtX3N0b2NrcykudG9saXN0KCklMEElMEElMjAlMjAlMjAlMjAlMjMlMjBFeGVjdXRlJTIwYWN0aW9uJTBBJTIwJTIwJTIwJTIwcmVzdWx0JTIwJTNEJTIwY2xpZW50LnN0ZXAoRmluUkxBY3Rpb24oYWN0aW9ucyUzRGFjdGlvbnMpKSUwQSUwQSUyMCUyMCUyMCUyMHByaW50KGYlMjJTdGVwJTIwJTdCc3RlcCU3RCUzQSUyMFBvcnRmb2xpbyUzRCUyNCU3QnJlc3VsdC5vYnNlcnZhdGlvbi5wb3J0Zm9saW9fdmFsdWUlM0ElMkMuMmYlN0QlMkMlMjAlMjIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmJTIyUmV3YXJkJTNEJTdCcmVzdWx0LnJld2FyZCUzQS4yZiU3RCUyMiklMEElMEElMjAlMjAlMjAlMjBpZiUyMHJlc3VsdC5kb25lJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcHJpbnQoJTIyRXBpc29kZSUyMGZpbmlzaGVkISUyMiklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBicmVhayUwQSUwQWNsaWVudC5jbG9zZSgp",highlighted:`<span class="hljs-keyword">from</span> envs.finrl_env <span class="hljs-keyword">import</span> FinRLEnv, FinRLAction | |
| <span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np | |
| <span class="hljs-comment"># Connect to server</span> | |
| client = FinRLEnv(base_url=<span class="hljs-string">"http://localhost:8000"</span>) | |
| <span class="hljs-comment"># Get configuration</span> | |
| config = client.get_config() | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Trading <span class="hljs-subst">{config[<span class="hljs-string">'stock_dim'</span>]}</span> stocks"</span>) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Initial capital: $<span class="hljs-subst">{config[<span class="hljs-string">'initial_amount'</span>]:,<span class="hljs-number">.0</span>f}</span>"</span>) | |
| <span class="hljs-comment"># Reset environment</span> | |
| result = client.reset() | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Initial portfolio value: $<span class="hljs-subst">{result.observation.portfolio_value:,<span class="hljs-number">.2</span>f}</span>"</span>) | |
| <span class="hljs-comment"># Trading loop</span> | |
| <span class="hljs-keyword">for</span> step <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">100</span>): | |
| <span class="hljs-comment"># Get current state</span> | |
| state = result.observation.state | |
| <span class="hljs-comment"># Your RL policy here (example: random actions)</span> | |
| num_stocks = config[<span class="hljs-string">'stock_dim'</span>] | |
| actions = np.random.uniform(-<span class="hljs-number">1</span>, <span class="hljs-number">1</span>, size=num_stocks).tolist() | |
| <span class="hljs-comment"># Execute action</span> | |
| result = client.step(FinRLAction(actions=actions)) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Step <span class="hljs-subst">{step}</span>: Portfolio=$<span class="hljs-subst">{result.observation.portfolio_value:,<span class="hljs-number">.2</span>f}</span>, "</span> | |
| <span class="hljs-string">f"Reward=<span class="hljs-subst">{result.reward:<span class="hljs-number">.2</span>f}</span>"</span>) | |
| <span class="hljs-keyword">if</span> result.done: | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">"Episode finished!"</span>) | |
| <span class="hljs-keyword">break</span> | |
| client.close()`,lang:"python",wrap:!1});var u=J(h,2);l(u,{title:"Architecture",local:"architecture",headingTag:"h2"});var k=J(u,2);U(k,{code:"JUUyJTk0JThDJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTkwJTBBJUUyJTk0JTgyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwUkwlMjBUcmFpbmluZyUyMEZyYW1ld29yayUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU4MiUwQSVFMiU5NCU4MiUyMCUyMCVFMiU5NCU4QyVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU5MCUyMCUyMCVFMiU5NCU4QyVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU5MCUyMCUyMCVFMiU5NCU4QyVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU5MCUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU4MiUwQSVFMiU5NCU4MiUyMCUyMCVFMiU5NCU4MiUyMFBvbGljeSUyME5ldCUyMCUyMCUyMCVFMiU5NCU4MiUyMCUyMCVFMiU5NCU4MiUyMFZhbHVlJTIwTmV0JTIwJTIwJTIwJTIwJUUyJTk0JTgyJTIwJTIwJUUyJTk0JTgyJTIwUmVwbGF5JTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTBBJUUyJTk0JTgyJTIwJTIwJUUyJTk0JTgyJTIwKFB5VG9yY2gpJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTIwJTIwJUUyJTk0JTgyJTIwKFB5VG9yY2gpJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTIwJTIwJUUyJTk0JTgyJTIwQnVmZmVyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTBBJUUyJTk0JTgyJTIwJTIwJUUyJTk0JTk0JUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JUFDJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTk4JTIwJTIwJUUyJTk0JTk0JUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JUFDJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTk4JTIwJTIwJUUyJTk0JTk0JUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JUFDJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTk4JTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTBBJUUyJTk0JTgyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTk0JUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JUI0JUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTk4JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTBBJUUyJTk0JTgyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTBBJUUyJTk0JTgyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JThDJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk2JUJDJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTkwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTBBJUUyJTk0JTgyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTIwRmluUkxFbnYlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlRTIlOTQlODIlMjAlRTIlODYlOTAlMjBIVFRQJTIwQ2xpZW50JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTBBJUUyJTk0JTgyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTIwKEhUVFBFbnZDbGllbnQpJTIwJUUyJTk0JTgyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTBBJUUyJTk0JTgyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTk0JUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JUFDJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTk4JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTBBJUUyJTk0JTk0JUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JUJDJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTk4JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTIwSFRUUCUyMChKU09OKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU4QyVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NiVCQyVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU5MCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU4MiUyMERvY2tlciUyMENvbnRhaW5lciVFMiU5NCU4MiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU4MiUyMCUyMFBvcnQlM0ElMjA4MDAwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTIwJUUyJTk0JThDJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTkwJTIwJUUyJTk0JTgyJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTIwJUUyJTk0JTgyRmFzdEFQSSUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU4MiUyMCVFMiU5NCU4MiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU4MiUyMCVFMiU5NCU4MlNlcnZlciUyMCUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU4MiUyMCVFMiU5NCU4MiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU4MiUyMCVFMiU5NCU5NCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCVBQyVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU5OCUyMCVFMiU5NCU4MiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU4MiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU4MiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU4MiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU4MiUyMCVFMiU5NCU4QyVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NiVCQyVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU5MCUyMCVFMiU5NCU4MiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU4MiUyMCVFMiU5NCU4MiUyMEZpblJMJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTIwJUUyJTk0JTgyJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTIwJUUyJTk0JTgyJTIwRW52aXJvbm1lbnQlMjAlRTIlOTQlODIlMjAlRTIlOTQlODIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlRTIlOTQlODIlMjAlRTIlOTQlOTQlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlQUMlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlOTglMjAlRTIlOTQlODIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlRTIlOTQlODIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlRTIlOTQlODIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlRTIlOTQlODIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlRTIlOTQlODIlMjAlRTIlOTQlOEMlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTYlQkMlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlOTAlMjAlRTIlOTQlODIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlRTIlOTQlODIlMjAlRTIlOTQlODIlMjBGaW5STCUyMCUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU4MiUyMCVFMiU5NCU4MiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU4MiUyMCVFMiU5NCU4MiUyMFN0b2NrVHJhZGluZyVFMiU5NCU4MiUyMCVFMiU5NCU4MiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU4MiUyMCVFMiU5NCU4MiUyMEVudiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU4MiUyMCVFMiU5NCU4MiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU4MiUyMCVFMiU5NCU5NCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU5OCUyMCVFMiU5NCU4MiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU5NCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU5OA==",highlighted:`┌─────────────────────────────────────────────────────────────┐ | |
| │ RL Training Framework │ | |
| │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ | |
| │ │ Policy Net │ │ Value Net │ │ Replay │ │ | |
| │ │ (PyTorch) │ │ (PyTorch) │ │ Buffer │ │ | |
| │ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │ | |
| │ └──────────────────┴──────────────────┘ │ | |
| │ │ │ | |
| │ ┌────────▼────────┐ │ | |
| │ │ FinRLEnv │ ← HTTP Client │ | |
| │ │ (HTTPEnvClient) │ │ | |
| │ └────────┬────────┘ │ | |
| └────────────────────────────┼─────────────────────────────────┘ | |
| │ HTTP (JSON) | |
| ┌────────▼────────┐ | |
| │ Docker <span class="hljs-attribute">Container</span>│ | |
| │ Port: <span class="hljs-number">8000</span> │ | |
| │ │ | |
| │ ┌─────────────┐ │ | |
| │ │FastAPI │ │ | |
| │ │Server │ │ | |
| │ └──────┬──────┘ │ | |
| │ │ │ | |
| │ ┌──────▼──────┐ │ | |
| │ │ FinRL │ │ | |
| │ │ Environment │ │ | |
| │ └──────┬──────┘ │ | |
| │ │ │ | |
| │ ┌──────▼──────┐ │ | |
| │ │ FinRL │ │ | |
| │ │ StockTrading│ │ | |
| │ │ Env │ │ | |
| │ └─────────────┘ │ | |
| └─────────────────┘`,lang:"",wrap:!1});var A=J(k,2);l(A,{title:"API Reference",local:"api-reference",headingTag:"h2"});var m=J(A,2);l(m,{title:"FinRLAction",local:"finrlaction",headingTag:"h3"});var b=J(m,10);U(b,{code:"JTIzJTIwQnV5JTIwc3RvY2slMjAwJTJDJTIwc2VsbCUyMHN0b2NrJTIwMSUyQyUyMGhvbGQlMjBzdG9jayUyMDIlMEFhY3Rpb24lMjAlM0QlMjBGaW5STEFjdGlvbihhY3Rpb25zJTNEJTVCMC41JTJDJTIwLTAuMyUyQyUyMDAuMCU1RCk=",highlighted:`<span class="hljs-comment"># Buy stock 0, sell stock 1, hold stock 2</span> | |
| action = FinRLAction(actions=[<span class="hljs-number">0.5</span>, -<span class="hljs-number">0.3</span>, <span class="hljs-number">0.0</span>])`,lang:"python",wrap:!1});var N=J(b,2);l(N,{title:"FinRLObservation",local:"finrlobservation",headingTag:"h3"});var F=J(N,10);U(F,{code:"b2JzJTIwJTNEJTIwcmVzdWx0Lm9ic2VydmF0aW9uJTBBcHJpbnQoZiUyMlBvcnRmb2xpbyUzQSUyMCUyNCU3Qm9icy5wb3J0Zm9saW9fdmFsdWUlM0ElMkMuMmYlN0QlMjIpJTBBcHJpbnQoZiUyMkRhdGUlM0ElMjAlN0JvYnMuZGF0ZSU3RCUyMiklMEFwcmludChmJTIyU3RhdGUlMjBkaW1lbnNpb24lM0ElMjAlN0JsZW4ob2JzLnN0YXRlKSU3RCUyMik=",highlighted:`obs = result.observation | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Portfolio: $<span class="hljs-subst">{obs.portfolio_value:,<span class="hljs-number">.2</span>f}</span>"</span>) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Date: <span class="hljs-subst">{obs.date}</span>"</span>) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"State dimension: <span class="hljs-subst">{<span class="hljs-built_in">len</span>(obs.state)}</span>"</span>)`,lang:"python",wrap:!1});var V=J(F,2);l(V,{title:"Client Methods",local:"client-methods",headingTag:"h3"});var v=J(V,2);l(v,{title:"reset() -> StepResult[FinRLObservation]",local:"reset--gt-stepresultfinrlobservation",headingTag:"h4"});var f=J(v,4);U(f,{code:"cmVzdWx0JTIwJTNEJTIwY2xpZW50LnJlc2V0KCk=",highlighted:"result = client.reset()",lang:"python",wrap:!1});var R=J(f,2);l(R,{title:"step(action: FinRLAction) -> StepResult[FinRLObservation]",local:"stepaction-finrlaction--gt-stepresultfinrlobservation",headingTag:"h4"});var B=J(R,4);U(B,{code:"YWN0aW9uJTIwJTNEJTIwRmluUkxBY3Rpb24oYWN0aW9ucyUzRCU1QjAuNSUyQyUyMC0wLjMlNUQpJTBBcmVzdWx0JTIwJTNEJTIwY2xpZW50LnN0ZXAoYWN0aW9uKQ==",highlighted:`action = FinRLAction(actions=[<span class="hljs-number">0.5</span>, -<span class="hljs-number">0.3</span>]) | |
| result = client.step(action)`,lang:"python",wrap:!1});var Q=J(B,2);l(Q,{title:"state() -> State",local:"state--gt-state",headingTag:"h4"});var Z=J(Q,4);U(Z,{code:"c3RhdGUlMjAlM0QlMjBjbGllbnQuc3RhdGUoKSUwQXByaW50KGYlMjJFcGlzb2RlJTNBJTIwJTdCc3RhdGUuZXBpc29kZV9pZCU3RCUyQyUyMFN0ZXAlM0ElMjAlN0JzdGF0ZS5zdGVwX2NvdW50JTdEJTIyKQ==",highlighted:`state = client.state() | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Episode: <span class="hljs-subst">{state.episode_id}</span>, Step: <span class="hljs-subst">{state.step_count}</span>"</span>)`,lang:"python",wrap:!1});var _=J(Z,2);l(_,{title:"get_config() -> dict",local:"getconfig--gt-dict",headingTag:"h4"});var E=J(_,4);U(E,{code:"Y29uZmlnJTIwJTNEJTIwY2xpZW50LmdldF9jb25maWcoKSUwQXByaW50KGNvbmZpZyU1QidzdG9ja19kaW0nJTVEKSUwQXByaW50KGNvbmZpZyU1Qidpbml0aWFsX2Ftb3VudCclNUQp",highlighted:`config = client.get_config() | |
| <span class="hljs-built_in">print</span>(config[<span class="hljs-string">'stock_dim'</span>]) | |
| <span class="hljs-built_in">print</span>(config[<span class="hljs-string">'initial_amount'</span>])`,lang:"python",wrap:!1});var G=J(E,2);l(G,{title:"Data Format",local:"data-format",headingTag:"h2"});var S=J(G,10);l(S,{title:"Configuration Parameters",local:"configuration-parameters",headingTag:"h2"});var W=J(S,4);l(W,{title:"Integration with RL Frameworks",local:"integration-with-rl-frameworks",headingTag:"h2"});var Y=J(W,2);l(Y,{title:"Stable Baselines 3",local:"stable-baselines-3",headingTag:"h3"});var O=J(Y,2);U(O,{code:"ZnJvbSUyMHN0YWJsZV9iYXNlbGluZXMzJTIwaW1wb3J0JTIwUFBPJTBBZnJvbSUyMGVudnMuZmlucmxfZW52JTIwaW1wb3J0JTIwRmluUkxFbnYlMkMlMjBGaW5STEFjdGlvbiUwQWltcG9ydCUyMG51bXB5JTIwYXMlMjBucCUwQSUwQSUyMyUyMENyZWF0ZSUyMGN1c3RvbSUyMHdyYXBwZXIlMjBmb3IlMjBTQjMlMEFjbGFzcyUyMFNCM0ZpblJMV3JhcHBlciUzQSUwQSUyMCUyMCUyMCUyMGRlZiUyMF9faW5pdF9fKHNlbGYlMkMlMjBiYXNlX3VybCklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZWxmLmVudiUyMCUzRCUyMEZpblJMRW52KGJhc2VfdXJsJTNEYmFzZV91cmwpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwY29uZmlnJTIwJTNEJTIwc2VsZi5lbnYuZ2V0X2NvbmZpZygpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc2VsZi5hY3Rpb25fc3BhY2UlMjAlM0QlMjBzcGFjZXMuQm94KCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxvdyUzRC0xJTJDJTIwaGlnaCUzRDElMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzaGFwZSUzRChjb25maWclNUInYWN0aW9uX3NwYWNlJyU1RCUyQyklMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBkdHlwZSUzRG5wLmZsb2F0MzIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjApJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc2VsZi5vYnNlcnZhdGlvbl9zcGFjZSUyMCUzRCUyMHNwYWNlcy5Cb3goJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbG93JTNELW5wLmluZiUyQyUyMGhpZ2glM0RucC5pbmYlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzaGFwZSUzRChjb25maWclNUInc3RhdGVfc3BhY2UnJTVEJTJDKSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGR0eXBlJTNEbnAuZmxvYXQzMiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCklMEElMEElMjAlMjAlMjAlMjBkZWYlMjByZXNldChzZWxmKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHJlc3VsdCUyMCUzRCUyMHNlbGYuZW52LnJlc2V0KCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXR1cm4lMjBucC5hcnJheShyZXN1bHQub2JzZXJ2YXRpb24uc3RhdGUlMkMlMjBkdHlwZSUzRG5wLmZsb2F0MzIpJTBBJTBBJTIwJTIwJTIwJTIwZGVmJTIwc3RlcChzZWxmJTJDJTIwYWN0aW9uKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHJlc3VsdCUyMCUzRCUyMHNlbGYuZW52LnN0ZXAoRmluUkxBY3Rpb24oYWN0aW9ucyUzRGFjdGlvbi50b2xpc3QoKSkpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmV0dXJuJTIwKCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG5wLmFycmF5KHJlc3VsdC5vYnNlcnZhdGlvbi5zdGF0ZSUyQyUyMGR0eXBlJTNEbnAuZmxvYXQzMiklMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXN1bHQucmV3YXJkJTIwb3IlMjAwLjAlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXN1bHQuZG9uZSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHJlc3VsdC5vYnNlcnZhdGlvbi5tZXRhZGF0YSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCklMEElMEElMjMlMjBUcmFpbiUwQWVudiUyMCUzRCUyMFNCM0ZpblJMV3JhcHBlciglMjJodHRwJTNBJTJGJTJGbG9jYWxob3N0JTNBODAwMCUyMiklMEFtb2RlbCUyMCUzRCUyMFBQTyglMjJNbHBQb2xpY3klMjIlMkMlMjBlbnYlMkMlMjB2ZXJib3NlJTNEMSklMEFtb2RlbC5sZWFybih0b3RhbF90aW1lc3RlcHMlM0QxMDAwMCk=",highlighted:`<span class="hljs-keyword">from</span> stable_baselines3 <span class="hljs-keyword">import</span> PPO | |
| <span class="hljs-keyword">from</span> envs.finrl_env <span class="hljs-keyword">import</span> FinRLEnv, FinRLAction | |
| <span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np | |
| <span class="hljs-comment"># Create custom wrapper for SB3</span> | |
| <span class="hljs-keyword">class</span> <span class="hljs-title class_">SB3FinRLWrapper</span>: | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, base_url</span>): | |
| <span class="hljs-variable language_">self</span>.env = FinRLEnv(base_url=base_url) | |
| config = <span class="hljs-variable language_">self</span>.env.get_config() | |
| <span class="hljs-variable language_">self</span>.action_space = spaces.Box( | |
| low=-<span class="hljs-number">1</span>, high=<span class="hljs-number">1</span>, | |
| shape=(config[<span class="hljs-string">'action_space'</span>],), | |
| dtype=np.float32 | |
| ) | |
| <span class="hljs-variable language_">self</span>.observation_space = spaces.Box( | |
| low=-np.inf, high=np.inf, | |
| shape=(config[<span class="hljs-string">'state_space'</span>],), | |
| dtype=np.float32 | |
| ) | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">reset</span>(<span class="hljs-params">self</span>): | |
| result = <span class="hljs-variable language_">self</span>.env.reset() | |
| <span class="hljs-keyword">return</span> np.array(result.observation.state, dtype=np.float32) | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">step</span>(<span class="hljs-params">self, action</span>): | |
| result = <span class="hljs-variable language_">self</span>.env.step(FinRLAction(actions=action.tolist())) | |
| <span class="hljs-keyword">return</span> ( | |
| np.array(result.observation.state, dtype=np.float32), | |
| result.reward <span class="hljs-keyword">or</span> <span class="hljs-number">0.0</span>, | |
| result.done, | |
| result.observation.metadata | |
| ) | |
| <span class="hljs-comment"># Train</span> | |
| env = SB3FinRLWrapper(<span class="hljs-string">"http://localhost:8000"</span>) | |
| model = PPO(<span class="hljs-string">"MlpPolicy"</span>, env, verbose=<span class="hljs-number">1</span>) | |
| model.learn(total_timesteps=<span class="hljs-number">10000</span>)`,lang:"python",wrap:!1});var D=J(O,2);l(D,{title:"Troubleshooting",local:"troubleshooting",headingTag:"h2"});var z=J(D,2);l(z,{title:"Server won’t start",local:"server-wont-start",headingTag:"h3"});var s=J(z,2),T=a(s),tJ=J(a(T),2);U(tJ,{code:"ZG9ja2VyJTIwaW1hZ2VzJTIwJTdDJTIwZ3JlcCUyMGVudnRvcmNoLWJhc2U=",highlighted:"docker images | grep envtorch-base",lang:"bash",wrap:!1}),t(T);var x=J(T,2),MJ=J(a(x),2);U(MJ,{code:"ZG9ja2VyJTIwYnVpbGQlMjAtdCUyMGVudnRvcmNoLWJhc2UlM0FsYXRlc3QlMjAtZiUyMHNyYyUyRm9wZW5lbnYlMkZjb3JlJTJGY29udGFpbmVycyUyRmltYWdlcyUyRkRvY2tlcmZpbGUlMjAu",highlighted:"docker build -t envtorch-base:latest -f src/openenv/core/containers/images/Dockerfile .",lang:"bash",wrap:!1}),t(x),t(s);var X=J(s,2);l(X,{title:"Import errors",local:"import-errors",headingTag:"h3"});var L=J(X,4);U(L,{code:"Y2QlMjBPcGVuRW52JTJGc3JjJTBBcHl0aG9uJTIwLWMlMjAlMjJmcm9tJTIwZW52cy5maW5ybF9lbnYlMjBpbXBvcnQlMjBGaW5STEVudiUyMg==",highlighted:`<span class="hljs-built_in">cd</span> OpenEnv/src | |
| python -c <span class="hljs-string">"from envs.finrl_env import FinRLEnv"</span>`,lang:"bash",wrap:!1});var q=J(L,2);l(q,{title:"Configuration errors",local:"configuration-errors",headingTag:"h3"});var H=J(q,4);U(H,{code:"aW1wb3J0JTIwcGFuZGFzJTIwYXMlMjBwZCUwQWRmJTIwJTNEJTIwcGQucmVhZF9jc3YoJ3lvdXJfZGF0YS5jc3YnKSUwQXByaW50KGRmLmNvbHVtbnMudG9saXN0KCkp",highlighted:`<span class="hljs-keyword">import</span> pandas <span class="hljs-keyword">as</span> pd | |
| df = pd.read_csv(<span class="hljs-string">'your_data.csv'</span>) | |
| <span class="hljs-built_in">print</span>(df.columns.tolist())`,lang:"python",wrap:!1});var K=J(H,2);l(K,{title:"Examples",local:"examples",headingTag:"h2"});var P=J(K,6);l(P,{title:"License",local:"license",headingTag:"h2"});var $=J(P,4);l($,{title:"References",local:"references",headingTag:"h2"});var nJ=J($,4);wJ(nJ,{source:"https://github.com/huggingface/openenv/blob/main/docs/source/environments/finrl.md"}),rJ(2),UJ(TJ,M),IJ()}export{AJ as component}; | |
Xet Storage Details
- Size:
- 43.1 kB
- Xet hash:
- 899ffae8d7192e5094d924ff829861b40f5cffa7df4d1b7e1f605bceae55bb51
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.