From b8f97f7203a47190ea5b29459c5f0adfccea1e4a Mon Sep 17 00:00:00 2001 From: lanyuanxiaoyao Date: Tue, 18 Feb 2025 17:00:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Ebacktesting=E6=A1=86=E6=9E=B6?= =?UTF-8?q?=E7=94=A8=E4=BA=8E=E5=9B=9E=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- poetry.lock | 142 ++++++++++---- pyproject.toml | 1 + 回测/backtesting.ipynb | 420 +++++++++++++++++++++++++++++++++++++++++ 回测/backtrader.ipynb | 50 ++--- 4 files changed, 545 insertions(+), 68 deletions(-) create mode 100644 回测/backtesting.ipynb diff --git a/poetry.lock b/poetry.lock index 2a79e13..b9f556c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.0.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. [[package]] name = "akracer" @@ -65,7 +65,7 @@ typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1) ; python_version >= \"3.10\"", "uvloop (>=0.21) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\" and python_version < \"3.14\""] trio = ["trio (>=0.26.1)"] [[package]] @@ -201,12 +201,12 @@ files = [ ] [package.extras] -benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] +tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""] [[package]] name = "babel" @@ -221,7 +221,30 @@ files = [ ] [package.extras] -dev = ["backports.zoneinfo", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata"] +dev = ["backports.zoneinfo ; python_version < \"3.9\"", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata ; sys_platform == \"win32\""] + +[[package]] +name = "backtesting" +version = "0.6.1" +description = "Backtest trading strategies in Python" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "backtesting-0.6.1-py3-none-any.whl", hash = "sha256:7d02df9610b1d0f7bfe53e2dab9453de71741ba323348dc7e2f77f0594bb8fa3"}, + {file = "backtesting-0.6.1.tar.gz", hash = "sha256:570b3d395a6c7c58a4ad3534b6b3ba69e35845f25e1e7c6f73944abd5bb554a9"}, +] + +[package.dependencies] +bokeh = ">=1.4.0,<3.0.dev0 || >=3.1.dev0" +joblib = "*" +numpy = ">=1.17.0" +pandas = ">0.25.0" + +[package.extras] +dev = ["coverage", "flake8", "mypy"] +doc = ["ipykernel", "jupyter-client", "jupytext (>=1.3)", "nbconvert", "pdoc3"] +test = ["matplotlib", "sambo", "scikit-learn"] [[package]] name = "backtrader" @@ -279,6 +302,29 @@ webencodings = "*" [package.extras] css = ["tinycss2 (>=1.1.0,<1.5)"] +[[package]] +name = "bokeh" +version = "3.6.3" +description = "Interactive plots and applications in the browser from Python" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "bokeh-3.6.3-py3-none-any.whl", hash = "sha256:1c219e2afe1405e6ada212071ac3bee91c95acfd1aa6d620eb6f61a751407747"}, + {file = "bokeh-3.6.3.tar.gz", hash = "sha256:9b81d6a9ea62e75a04a1a9d9f931942016890beec9ab5d129a2a4432cf595c0a"}, +] + +[package.dependencies] +contourpy = ">=1.2" +Jinja2 = ">=2.9" +numpy = ">=1.16" +packaging = ">=16.8" +pandas = ">=1.2" +pillow = ">=7.1.0" +PyYAML = ">=3.10" +tornado = ">=6.2" +xyzservices = ">=2021.09.1" + [[package]] name = "bs4" version = "0.0.2" @@ -717,7 +763,7 @@ files = [ ] [package.extras] -tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich ; python_version >= \"3.11\""] [[package]] name = "fastjsonschema" @@ -795,18 +841,18 @@ files = [ ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0) ; python_version <= \"3.12\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "pycairo", "scipy"] +interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""] lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] -type1 = ["xattr"] +type1 = ["xattr ; sys_platform == \"darwin\""] ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.1.0)"] -woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] +unicode = ["unicodedata2 (>=15.1.0) ; python_version <= \"3.12\""] +woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"] [[package]] name = "fqdn" @@ -834,14 +880,14 @@ files = [ [[package]] name = "holidays" -version = "0.66" +version = "0.67" description = "Open World Holidays Framework" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "holidays-0.66-py3-none-any.whl", hash = "sha256:76a84de3496e21fd67eff69a9c0be07fc689b75b62945c157498748f43be31ab"}, - {file = "holidays-0.66.tar.gz", hash = "sha256:b7d5168c86c0dfeb7f9ffdfea62514e2ced91ce46bed4513bc147b40322d1aa5"}, + {file = "holidays-0.67-py3-none-any.whl", hash = "sha256:174b64b9c23ef97600b32f4c44d4cf685223d75188dd746bce185fcbcdfd0522"}, + {file = "holidays-0.67.tar.gz", hash = "sha256:d9a21be2c01e68f28bae1544a36736566830b065f467b59bca32caefb4c4487f"}, ] [package.dependencies] @@ -864,10 +910,10 @@ six = ">=1.9" webencodings = "*" [package.extras] -all = ["chardet (>=2.2)", "genshi", "lxml"] +all = ["chardet (>=2.2)", "genshi", "lxml ; platform_python_implementation == \"CPython\""] chardet = ["chardet (>=2.2)"] genshi = ["genshi"] -lxml = ["lxml"] +lxml = ["lxml ; platform_python_implementation == \"CPython\""] [[package]] name = "httpcore" @@ -910,7 +956,7 @@ httpcore = "==1.*" idna = "*" [package.extras] -brotli = ["brotli", "brotlicffi"] +brotli = ["brotli ; platform_python_implementation == \"CPython\"", "brotlicffi ; platform_python_implementation != \"CPython\""] cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] @@ -944,7 +990,7 @@ files = [ ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] @@ -1011,7 +1057,7 @@ traitlets = ">=5.13.0" [package.extras] all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] black = ["black"] -doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing_extensions"] +doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli ; python_version < \"3.11\"", "typing_extensions"] kernel = ["ipykernel"] matplotlib = ["matplotlib"] nbconvert = ["nbconvert"] @@ -1097,6 +1143,18 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "joblib" +version = "1.4.2" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, + {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, +] + [[package]] name = "json5" version = "0.10.0" @@ -1221,7 +1279,7 @@ traitlets = ">=5.3" [package.extras] docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko ; sys_platform == \"win32\"", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-console" @@ -2004,7 +2062,7 @@ tornado = ">=6.2.0" [package.extras] dev = ["hatch", "pre-commit"] docs = ["myst-parser", "nbsphinx", "pydata-sphinx-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.27.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] +test = ["importlib-resources (>=5.0) ; python_version < \"3.10\"", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.27.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] [[package]] name = "notebook-shim" @@ -2341,7 +2399,7 @@ docs = ["furo", "olefile", "sphinx (>=8.1)", "sphinx-copybutton", "sphinx-inline fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "trove-classifiers (>=2024.10.12)"] -typing = ["typing-extensions"] +typing = ["typing-extensions ; python_version < \"3.10\""] xmp = ["defusedxml"] [[package]] @@ -2557,7 +2615,7 @@ files = [ ] [package.extras] -dev = ["backports.zoneinfo", "black", "build", "freezegun", "mdx_truly_sane_lists", "mike", "mkdocs", "mkdocs-awesome-pages-plugin", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-material (>=8.5)", "mkdocstrings[python]", "msgspec", "msgspec-python313-pre", "mypy", "orjson", "pylint", "pytest", "tzdata", "validate-pyproject[all]"] +dev = ["backports.zoneinfo ; python_version < \"3.9\"", "black", "build", "freezegun", "mdx_truly_sane_lists", "mike", "mkdocs", "mkdocs-awesome-pages-plugin", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-material (>=8.5)", "mkdocstrings[python]", "msgspec ; implementation_name != \"pypy\" and python_version < \"3.13\"", "msgspec-python313-pre ; implementation_name != \"pypy\" and python_version == \"3.13\"", "mypy", "orjson ; implementation_name != \"pypy\"", "pylint", "pytest", "tzdata", "validate-pyproject[all]"] [[package]] name = "pytz" @@ -3044,7 +3102,7 @@ numpy = ">=1.23.5,<2.5" [package.extras] dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.16.5)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.0.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] -test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "send2trash" @@ -3059,9 +3117,9 @@ files = [ ] [package.extras] -nativelib = ["pyobjc-framework-Cocoa", "pywin32"] -objc = ["pyobjc-framework-Cocoa"] -win32 = ["pywin32"] +nativelib = ["pyobjc-framework-Cocoa ; sys_platform == \"darwin\"", "pywin32 ; sys_platform == \"win32\""] +objc = ["pyobjc-framework-Cocoa ; sys_platform == \"darwin\""] +win32 = ["pywin32 ; sys_platform == \"win32\""] [[package]] name = "setuptools" @@ -3076,13 +3134,13 @@ files = [ ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.0)"] -core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] +core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.14.*)", "pytest-mypy"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] [[package]] name = "simplejson" @@ -3479,7 +3537,7 @@ files = [ ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] @@ -3566,7 +3624,19 @@ build = ["twine", "wheel"] docs = ["sphinx"] test = ["pytest", "pytest-cov"] +[[package]] +name = "xyzservices" +version = "2025.1.0" +description = "Source of XYZ tiles providers" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "xyzservices-2025.1.0-py3-none-any.whl", hash = "sha256:fa599956c5ab32dad1689960b3bb08fdcdbe0252cc82d84fc60ae415dc648907"}, + {file = "xyzservices-2025.1.0.tar.gz", hash = "sha256:5cdbb0907c20be1be066c6e2dc69c645842d1113a4e83e642065604a21f254ba"}, +] + [metadata] lock-version = "2.1" python-versions = "^3.12" -content-hash = "29e798d42060fe4b0385b221e0c9c01976745e79ca6cc12b3e626d67d2607439" +content-hash = "3268a51bcec35b4013551a12a8e976347c6fbec2cba3ae5f429c6bac7f8d2d04" diff --git a/pyproject.toml b/pyproject.toml index 235812d..5415c63 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,6 +16,7 @@ prophet = "^1.1.6" mplfinance = "^0.12.10b0" scipy = "^1.15.1" backtrader = "^1.9.78.123" +backtesting = "^0.6.1" [build-system] diff --git a/回测/backtesting.ipynb b/回测/backtesting.ipynb new file mode 100644 index 0000000..3f2e192 --- /dev/null +++ b/回测/backtesting.ipynb @@ -0,0 +1,420 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2025-02-18T09:21:17.062232Z", + "start_time": "2025-02-18T09:21:16.952554Z" + } + }, + "source": [ + "import pandas as pd\n", + "\n", + "# source_df = \\\n", + "# pd.read_csv(\"C:\\\\Users\\\\lanyuanxiaoyao\\\\SynologyDrive\\\\data\\\\Tushare\\\\日线行情 1990-2024\\\\分组行情\\\\000001.SZ.csv\") \\\n", + "source_df = pd.read_csv(\"/Users/lanyuanxiaoyao/SynologyDrive/data/Tushare/日线行情 1990-2024/分组行情/000001.SZ.csv\") \\\n", + " [[\"trade_date\", \"vol\", \"open_qfq\", \"close_qfq\", \"high_qfq\", \"low_qfq\"]]\n", + "df = pd.DataFrame()\n", + "df[[\"date\", \"Volume\", \"Open\", \"Close\", \"High\", \"Low\"]] = \\\n", + " source_df[[\"trade_date\", \"vol\", \"open_qfq\", \"close_qfq\", \"high_qfq\", \"low_qfq\"]]\n", + "df[\"datetime\"] = pd.to_datetime(df[\"date\"], format=\"%Y%m%d\")\n", + "df[\"datetime_text\"] = df[\"datetime\"].apply(lambda x: x.strftime(\"%Y%m%d\"))\n", + "df = df[df[\"datetime\"].dt.year > 2023]\n", + "df.sort_values(by='datetime', inplace=True)\n", + "df.set_index('datetime', inplace=True)\n", + "df" + ], + "outputs": [ + { + "data": { + "text/plain": [ + " date Volume Open Close High Low \\\n", + "datetime \n", + "2024-01-02 20240102 1158366.45 8.57646 8.41205 8.60386 8.41205 \n", + "2024-01-03 20240103 733610.31 8.39379 8.40292 8.42119 8.35725 \n", + "2024-01-04 20240104 864193.99 8.39379 8.32072 8.39379 8.29332 \n", + "2024-01-05 20240105 1991622.16 8.31158 8.46686 8.62213 8.28418 \n", + "2024-01-08 20240108 1121156.19 8.43032 8.35725 8.49426 8.32072 \n", + "... ... ... ... ... ... ... \n", + "2024-12-25 20241225 1475282.94 11.86000 11.92000 12.02000 11.84000 \n", + "2024-12-26 20241226 1000074.70 11.92000 11.86000 11.93000 11.78000 \n", + "2024-12-27 20241227 1290012.28 11.87000 11.83000 11.90000 11.66000 \n", + "2024-12-30 20241230 1351846.36 11.78000 11.95000 11.97000 11.78000 \n", + "2024-12-31 20241231 1475367.33 11.93000 11.70000 11.99000 11.70000 \n", + "\n", + " datetime_text \n", + "datetime \n", + "2024-01-02 20240102 \n", + "2024-01-03 20240103 \n", + "2024-01-04 20240104 \n", + "2024-01-05 20240105 \n", + "2024-01-08 20240108 \n", + "... ... \n", + "2024-12-25 20241225 \n", + "2024-12-26 20241226 \n", + "2024-12-27 20241227 \n", + "2024-12-30 20241230 \n", + "2024-12-31 20241231 \n", + "\n", + "[242 rows x 7 columns]" + ], + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
dateVolumeOpenCloseHighLowdatetime_text
datetime
2024-01-02202401021158366.458.576468.412058.603868.4120520240102
2024-01-0320240103733610.318.393798.402928.421198.3572520240103
2024-01-0420240104864193.998.393798.320728.393798.2933220240104
2024-01-05202401051991622.168.311588.466868.622138.2841820240105
2024-01-08202401081121156.198.430328.357258.494268.3207220240108
........................
2024-12-25202412251475282.9411.8600011.9200012.0200011.8400020241225
2024-12-26202412261000074.7011.9200011.8600011.9300011.7800020241226
2024-12-27202412271290012.2811.8700011.8300011.9000011.6600020241227
2024-12-30202412301351846.3611.7800011.9500011.9700011.7800020241230
2024-12-31202412311475367.3311.9300011.7000011.9900011.7000020241231
\n", + "

242 rows × 7 columns

\n", + "
" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 18 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-02-18T09:21:17.105765Z", + "start_time": "2025-02-18T09:21:17.102015Z" + } + }, + "cell_type": "code", + "source": [ + "import pandas as pd\n", + "import talib\n", + "\n", + "\n", + "def SMA(values, n):\n", + " return pd.Series(values).rolling(n).mean()\n", + "\n", + "\n", + "def MACD(values):\n", + " return talib.MACD(values, fastperiod=12, slowperiod=26, signalperiod=9)" + ], + "id": "77a5443bb998cace", + "outputs": [], + "execution_count": 19 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-02-18T09:21:17.163608Z", + "start_time": "2025-02-18T09:21:17.158723Z" + } + }, + "cell_type": "code", + "source": [ + "from backtesting import Strategy\n", + "from backtesting.lib import crossover\n", + "\n", + "\n", + "class SMAStrategy(Strategy):\n", + " def init(self):\n", + " self.dea, self.dif, self.macd = self.I(MACD, self.data.Close)\n", + "\n", + " def next(self):\n", + " # print(self.position.size)\n", + " if crossover(self.dif, self.dea) and self.macd > 0 and (self.dif > self.macd and self.dea > self.macd):\n", + " print(\"buy\")\n", + " self.buy()\n", + " elif crossover(self.dea, self.dif):\n", + " print(\"sell\")\n", + " self.position.close()" + ], + "id": "1b47368c3b916b9b", + "outputs": [], + "execution_count": 20 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-02-18T09:21:17.653193Z", + "start_time": "2025-02-18T09:21:17.273452Z" + } + }, + "cell_type": "code", + "source": [ + "from backtesting import Backtest\n", + "\n", + "bt = Backtest(df, SMAStrategy, cash=10000, commission=.002)\n", + "result = bt.run()\n", + "print(result)\n", + "bt.plot()" + ], + "id": "ab574b78805925e5", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sell\n", + "sell\n", + "sell\n", + "sell\n", + "sell\n", + "sell\n", + "sell\n", + "Start 2024-01-02 00:00:00\n", + "End 2024-12-31 00:00:00\n", + "Duration 364 days 00:00:00\n", + "Exposure Time [%] 0.0\n", + "Equity Final [$] 10000.0\n", + "Equity Peak [$] 10000.0\n", + "Return [%] 0.0\n", + "Buy & Hold Return [%] 21.65083\n", + "Return (Ann.) [%] 0.0\n", + "Volatility (Ann.) [%] 0.0\n", + "CAGR [%] 0.0\n", + "Sharpe Ratio NaN\n", + "Sortino Ratio NaN\n", + "Calmar Ratio NaN\n", + "Max. Drawdown [%] -0.0\n", + "Avg. Drawdown [%] NaN\n", + "Max. Drawdown Duration NaN\n", + "Avg. Drawdown Duration NaN\n", + "# Trades 0\n", + "Win Rate [%] NaN\n", + "Best Trade [%] NaN\n", + "Worst Trade [%] NaN\n", + "Avg. Trade [%] NaN\n", + "Max. Trade Duration NaN\n", + "Avg. Trade Duration NaN\n", + "Profit Factor NaN\n", + "Expectancy [%] NaN\n", + "SQN NaN\n", + "Kelly Criterion NaN\n", + "_strategy SMAStrategy\n", + "_equity_curve Equ...\n", + "_trades Empty DataFrame\n", + "...\n", + "dtype: object\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": "(function(root) {\n function embed_document(root) {\n const docs_json = {\"0f0509fb-f201-472a-b6c4-02d445f98869\":{\"version\":\"3.6.3\",\"title\":\"Bokeh Application\",\"roots\":[{\"type\":\"object\",\"name\":\"GridPlot\",\"id\":\"p3259\",\"attributes\":{\"rows\":null,\"cols\":null,\"sizing_mode\":\"stretch_width\",\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p3258\",\"attributes\":{\"logo\":null,\"tools\":[{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p3247\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p3054\",\"attributes\":{\"dimensions\":\"width\"}},{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p3100\",\"attributes\":{\"dimensions\":\"width\"}},{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p3197\",\"attributes\":{\"dimensions\":\"width\"}}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p3248\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p3055\",\"attributes\":{\"dimensions\":\"width\",\"renderers\":\"auto\",\"maintain_focus\":false}},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p3101\",\"attributes\":{\"dimensions\":\"width\",\"renderers\":\"auto\",\"maintain_focus\":false}},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p3198\",\"attributes\":{\"dimensions\":\"width\",\"renderers\":\"auto\",\"maintain_focus\":false}}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p3249\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p3056\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p3057\",\"attributes\":{\"syncable\":false,\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5,\"level\":\"overlay\",\"visible\":false,\"left\":{\"type\":\"number\",\"value\":\"nan\"},\"right\":{\"type\":\"number\",\"value\":\"nan\"},\"top\":{\"type\":\"number\",\"value\":\"nan\"},\"bottom\":{\"type\":\"number\",\"value\":\"nan\"},\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"top_units\":\"canvas\",\"bottom_units\":\"canvas\",\"handles\":{\"type\":\"object\",\"name\":\"BoxInteractionHandles\",\"id\":\"p3063\",\"attributes\":{\"all\":{\"type\":\"object\",\"name\":\"AreaVisuals\",\"id\":\"p3062\",\"attributes\":{\"fill_color\":\"white\",\"hover_fill_color\":\"lightgray\"}}}}}}}},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p3102\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p3103\",\"attributes\":{\"syncable\":false,\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5,\"level\":\"overlay\",\"visible\":false,\"left\":{\"type\":\"number\",\"value\":\"nan\"},\"right\":{\"type\":\"number\",\"value\":\"nan\"},\"top\":{\"type\":\"number\",\"value\":\"nan\"},\"bottom\":{\"type\":\"number\",\"value\":\"nan\"},\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"top_units\":\"canvas\",\"bottom_units\":\"canvas\",\"handles\":{\"type\":\"object\",\"name\":\"BoxInteractionHandles\",\"id\":\"p3109\",\"attributes\":{\"all\":{\"type\":\"object\",\"name\":\"AreaVisuals\",\"id\":\"p3108\",\"attributes\":{\"fill_color\":\"white\",\"hover_fill_color\":\"lightgray\"}}}}}}}},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p3199\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p3200\",\"attributes\":{\"syncable\":false,\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5,\"level\":\"overlay\",\"visible\":false,\"left\":{\"type\":\"number\",\"value\":\"nan\"},\"right\":{\"type\":\"number\",\"value\":\"nan\"},\"top\":{\"type\":\"number\",\"value\":\"nan\"},\"bottom\":{\"type\":\"number\",\"value\":\"nan\"},\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"top_units\":\"canvas\",\"bottom_units\":\"canvas\",\"handles\":{\"type\":\"object\",\"name\":\"BoxInteractionHandles\",\"id\":\"p3206\",\"attributes\":{\"all\":{\"type\":\"object\",\"name\":\"AreaVisuals\",\"id\":\"p3205\",\"attributes\":{\"fill_color\":\"white\",\"hover_fill_color\":\"lightgray\"}}}}}}}}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p3250\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"UndoTool\",\"id\":\"p3064\"},{\"type\":\"object\",\"name\":\"UndoTool\",\"id\":\"p3110\"},{\"type\":\"object\",\"name\":\"UndoTool\",\"id\":\"p3207\"}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p3251\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"RedoTool\",\"id\":\"p3065\"},{\"type\":\"object\",\"name\":\"RedoTool\",\"id\":\"p3111\"},{\"type\":\"object\",\"name\":\"RedoTool\",\"id\":\"p3208\"}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p3252\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p3066\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p3112\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p3209\"}]}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p3253\"},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p3254\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"HoverTool\",\"id\":\"p3244\",\"attributes\":{\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p3162\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p3068\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p3069\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p3070\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAJAAAACUAAAAmAAAAJwAAACgAAAApAAAAKgAAACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADoAAAA7AAAAPAAAAD0AAAA+AAAAPwAAAEAAAABBAAAAQgAAAEMAAABEAAAARQAAAEYAAABHAAAASAAAAEkAAABKAAAASwAAAEwAAABNAAAATgAAAE8AAABQAAAAUQAAAFIAAABTAAAAVAAAAFUAAABWAAAAVwAAAFgAAABZAAAAWgAAAFsAAABcAAAAXQAAAF4AAABfAAAAYAAAAGEAAABiAAAAYwAAAGQAAABlAAAAZgAAAGcAAABoAAAAaQAAAGoAAABrAAAAbAAAAG0AAABuAAAAbwAAAHAAAABxAAAAcgAAAHMAAAB0AAAAdQAAAHYAAAB3AAAAeAAAAHkAAAB6AAAAewAAAHwAAAB9AAAAfgAAAH8AAACAAAAAgQAAAIIAAACDAAAAhAAAAIUAAACGAAAAhwAAAIgAAACJAAAAigAAAIsAAACMAAAAjQAAAI4AAACPAAAAkAAAAJEAAACSAAAAkwAAAJQAAACVAAAAlgAAAJcAAACYAAAAmQAAAJoAAACbAAAAnAAAAJ0AAACeAAAAnwAAAKAAAAChAAAAogAAAKMAAACkAAAApQAAAKYAAACnAAAAqAAAAKkAAACqAAAAqwAAAKwAAACtAAAArgAAAK8AAACwAAAAsQAAALIAAACzAAAAtAAAALUAAAC2AAAAtwAAALgAAAC5AAAAugAAALsAAAC8AAAAvQAAAL4AAAC/AAAAwAAAAMEAAADCAAAAwwAAAMQAAADFAAAAxgAAAMcAAADIAAAAyQAAAMoAAADLAAAAzAAAAM0AAADOAAAAzwAAANAAAADRAAAA0gAAANMAAADUAAAA1QAAANYAAADXAAAA2AAAANkAAADaAAAA2wAAANwAAADdAAAA3gAAAN8AAADgAAAA4QAAAOIAAADjAAAA5AAAAOUAAADmAAAA5wAAAOgAAADpAAAA6gAAAOsAAADsAAAA7QAAAO4AAADvAAAA8AAAAPEAAAA=\"},\"shape\":[242],\"dtype\":\"int32\",\"order\":\"little\"}],[\"Open\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"gufewyUnIUDS+8bXnskgQNL7xteeySBA5CzsaYefIEAjoS3nUtwgQLMpV3iXuyBAsylXeJe7IECDhv4JLpYgQAT/W8mOrSBAsylXeJe7IEDS+8bXnskgQEJD/wQXCyFANKK0N/jSIECzKVd4l7sgQLMpV3iXuyBAY7SOqiaIIEAjoS3nUtwgQEJD/wQXCyFAsYo3Mo9MIUBPdcjNcLMhQCDSb18HjiFA8l61MuFHIUBx5ldzgDAhQKG5TiMtNSFA0vvG157JIEAicY+lD/0gQFGlZg+0kiFAAAAAAACAIUDA7J48LNQhQOC+Dpwz4iFAr+sX7IbdIUBqatlaX3QjQMeA7PXu3yNAqd4a2CqxI0CafLPNjSkjQPsioS3nMiNAm6xRD9EII0AqxvmbUFgjQLt+wW7YFiNAG2SSkbPQIkCsrdhfdv8iQDs2AvG63iJAKzV7oBXoIkBKB+v/HPYiQNtQMc7fJCNA6iEa3UE8I0AbZJKRs9AiQNogk4ycRSNACvSJPElKI0DqIRrdQTwjQEoH6/8c9iJAu37BbtgWI0C7fsFu2BYjQCs1e6AV6CJAu37BbtgWI0AK9Ik8SUojQPsioS3nMiNAu37BbtgWI0C6TiMtlTcjQAnE6/oFayNA6iEa3UE8I0CbrFEP0QgjQMx/SL99DSNASgfr/xz2IkDbv7LSpLQiQOzAOSNKqyJAvk1/9iNlIkAsZRniWMciQDxmoDL+vSJA+vIC7KNTI0A4Z0Rpb5AjQDmX4qqybyNA+yKhLecyI0C6TiMtlTcjQMpPqn06LiNAKsb5m1BYI0AK9Ik8SUojQJjdk4eFuiNA9iNFZFgFJEAIVWr2QNsjQOiC+pY5zSNAOGdEaW+QI0B4CyQofqwjQCgn2lVI6SNAR8mrcwwYJEAoJ9pVSOkjQKeufJbn0SNAB7ZKsDhsJEBTy9b6IuEkQARWDi2yrSRABOeMKO0dJUDkFB3J5Q8lQIXOa+wSxSRARSqMLQSpJEDEQq1p3gElQET67evAySRA1bK1vkiIJEC2EOSghFkkQMcRa/EpUCRAOPjCZKoAJECYbhKDwCokQCgn2lVI6SNAGCZTBaPyI0BYyjLEsQ4kQKeufJbn0SNA+FPjpZvkI0Doaiv2l90jQDMbZJKR0yNACyQofozJI0C/1M+bisQjQDS6g9iZ4iNAlj50QX2rI0BsCfmgZ4MjQHZPHhZqjSNAqiuf5XmwI0CqK5/lebAjQPgZFw6ExCNAHXIz3IC/I0CbcoV3uSgkQO2ePCzUWiRAm3KFd7koJEC/K4L/rRQkQKOvIM1YdCNAo68gzVh0I0D2evfHe7UjQJaVJqWg+yNAHxFTIonOI0Dowd1Zuy0kQJ0Rpb3BNyRAm3KFd7koJEDGpwAYz1AkQManABjPUCRAEFg5tMhGJEBy3CkdrA8kQCJPkq6Z7CNAHxFTIonOI0D4GRcOhMQjQM3km21unCNA+BkXDoTEI0DRItv5frojQHLcKR2sDyRAcT0K16MAJEBEaW/whckjQPZ698d7tSNAflcE/1t5I0B8uOS4U2ojQFj/5zBffiNAzeSbbW6cI0DN5JttbpwjQKOvIM1YdCNAfLjkuFNqI0DRItv5frojQPq4NlSM0yNAwmnBi74yJECbcoV3uSgkQOlg/Z/DPCRAEvdY+tBVJEA+y/Pg7owkQD0s1JrmfSRAOe6UDtZfJEDowd1Zuy0kQERpb/CFySNAHxFTIonOI0BEaW/whckjQM+Du7N2qyNAqIx/n3GhI0CqK5/lebAjQM+Du7N2qyNAB9MwfERMI0AuymyQSVYjQInS3uAL4yJAswdagSELI0DZX3ZPHgYjQCntDb4wKSNA3jzVITczI0B6GcVyS1sjQERpb/CFySNAZcIv9fOWJEA+y/Pg7owkQGZrfZHQNiZAWVGDaRi+JkBivrwA+0gqQGO0jqomuChAPQrXo3A9J0AAAAAAAAAoQPYoXI/C9SdA4XoUrkfhJ0CamZmZmZknQKRwPQrXIyhAUrgehevRJ0DhehSuR+EnQIXrUbgehSdApHA9CtejJ0AfhetRuJ4nQArXo3A9iidAXI/C9ShcJ0A9CtejcD0nQAAAAAAAACdAKVyPwvWoJkDD9Shcj8ImQFyPwvUo3CZA16NwPQrXJkA9CtejcD0nQAAAAAAAACdA4XoUrkfhJ0DD9Shcj0InQClcj8L1KCdAAAAAAAAAJ0CuR+F6FC4nQAAAAAAAACdAw/UoXI9CJ0AAAAAAAIAnQNejcD0KVydAPQrXo3A9J0CuR+F6FC4nQI/C9ShcjyZAXI/C9ShcJkB7FK5H4XomQEjhehSuxyZAPQrXo3C9JkBI4XoUrscmQD0K16NwvSZA4XoUrkfhJkDhehSuR+EmQOF6FK5H4SZAw/UoXI9CJ0DNzMzMzMwnQBSuR+F6lCdA9ihcj8J1J0AUrkfhepQnQB+F61G4HidApHA9CtcjJ0ApXI/C9SgnQK5H4XoULidArkfhehQuJ0BI4XoUrkcnQHE9CtejcCdAuB6F61G4J0DXo3A9CtcnQD0K16NwvSdAj8L1KFyPJ0Bcj8L1KNwnQA==\"},\"shape\":[242],\"dtype\":\"float64\",\"order\":\"little\"}],[\"High\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[242],\"dtype\":\"float64\",\"order\":\"little\"}],[\"Low\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[242],\"dtype\":\"float64\",\"order\":\"little\"}],[\"Close\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[242],\"dtype\":\"float64\",\"order\":\"little\"}],[\"Volume\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[242],\"dtype\":\"float64\",\"order\":\"little\"}],[\"datetime\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[242],\"dtype\":\"float64\",\"order\":\"little\"}],[\"inc\",{\"type\":\"ndarray\",\"array\":[\"0\",\"1\",\"0\",\"1\",\"0\",\"1\",\"0\",\"1\",\"1\",\"1\",\"1\",\"0\",\"0\",\"1\",\"0\",\"1\",\"1\",\"1\",\"1\",\"1\",\"0\",\"1\",\"1\",\"0\",\"1\",\"1\",\"0\",\"1\",\"1\",\"1\",\"1\",\"1\",\"0\",\"0\",\"1\",\"0\",\"1\",\"0\",\"0\",\"1\",\"0\",\"1\",\"1\",\"1\",\"1\",\"0\",\"0\",\"1\",\"0\",\"0\",\"1\",\"1\",\"0\",\"1\",\"1\",\"0\",\"0\",\"1\",\"1\",\"0\",\"0\",\"1\",\"0\",\"0\",\"1\",\"0\",\"1\",\"1\",\"1\",\"1\",\"0\",\"0\",\"1\",\"1\",\"1\",\"1\",\"1\",\"0\",\"0\",\"1\",\"0\",\"1\",\"1\",\"1\",\"0\",\"0\",\"1\",\"1\",\"0\",\"1\",\"1\",\"0\",\"0\",\"1\",\"0\",\"0\",\"0\",\"0\",\"0\",\"1\",\"0\",\"1\",\"1\",\"0\",\"1\",\"0\",\"1\",\"0\",\"0\",\"1\",\"0\",\"0\",\"1\",\"1\",\"1\",\"1\",\"1\",\"1\",\"1\",\"0\",\"0\",\"0\",\"0\",\"1\",\"1\",\"0\",\"1\",\"1\",\"0\",\"1\",\"1\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"1\",\"0\",\"1\",\"1\",\"0\",\"0\",\"0\",\"0\",\"1\",\"1\",\"0\",\"0\",\"0\",\"1\",\"1\",\"1\",\"1\",\"1\",\"1\",\"1\",\"0\",\"0\",\"0\",\"0\",\"1\",\"0\",\"0\",\"0\",\"1\",\"1\",\"0\",\"1\",\"0\",\"1\",\"0\",\"1\",\"1\",\"1\",\"1\",\"1\",\"0\",\"1\",\"1\",\"1\",\"0\",\"0\",\"1\",\"0\",\"1\",\"0\",\"1\",\"0\",\"1\",\"0\",\"1\",\"1\",\"0\",\"0\",\"0\",\"0\",\"0\",\"1\",\"1\",\"1\",\"1\",\"0\",\"1\",\"0\",\"0\",\"0\",\"1\",\"0\",\"0\",\"1\",\"0\",\"0\",\"0\",\"0\",\"0\",\"1\",\"1\",\"0\",\"1\",\"1\",\"1\",\"1\",\"1\",\"1\",\"1\",\"0\",\"0\",\"1\",\"0\",\"1\",\"0\",\"1\",\"1\",\"1\",\"1\",\"1\",\"1\",\"0\",\"0\",\"1\",\"0\"],\"shape\":[242],\"dtype\":\"object\",\"order\":\"little\"}],[\"MACD(C)[0]_0_0\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[242],\"dtype\":\"float64\",\"order\":\"little\"}],[\"MACD(C)[1]_0_1\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[242],\"dtype\":\"float64\",\"order\":\"little\"}],[\"MACD(C)[2]_0_2\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[242],\"dtype\":\"float64\",\"order\":\"little\"}],[\"ohlc_low\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[242],\"dtype\":\"float64\",\"order\":\"little\"}],[\"ohlc_high\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[242],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p3163\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p3164\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"VBar\",\"id\":\"p3159\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"index\"},\"width\":{\"type\":\"value\",\"value\":0.8},\"bottom\":{\"type\":\"field\",\"field\":\"Close\"},\"top\":{\"type\":\"field\",\"field\":\"Open\"},\"fill_color\":{\"type\":\"field\",\"field\":\"inc\",\"transform\":{\"type\":\"object\",\"name\":\"CategoricalColorMapper\",\"id\":\"p3074\",\"attributes\":{\"palette\":[\"tomato\",\"lime\"],\"factors\":[\"0\",\"1\"]}}}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"VBar\",\"id\":\"p3160\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"index\"},\"width\":{\"type\":\"value\",\"value\":0.8},\"bottom\":{\"type\":\"field\",\"field\":\"Close\"},\"top\":{\"type\":\"field\",\"field\":\"Open\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"field\",\"field\":\"inc\",\"transform\":{\"id\":\"p3074\"}},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"VBar\",\"id\":\"p3161\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"index\"},\"width\":{\"type\":\"value\",\"value\":0.8},\"bottom\":{\"type\":\"field\",\"field\":\"Close\"},\"top\":{\"type\":\"field\",\"field\":\"Open\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"field\",\"field\":\"inc\",\"transform\":{\"id\":\"p3074\"}},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}}],\"tooltips\":[[\"Date\",\"@datetime{%c}\"],[\"x, y\",\"$index\\u00a0\\u00a0\\u00a0\\u00a0$y{0,0.0[0000]}\"],[\"OHLC\",\"@Open{0,0.0[0000]}\\u00a0\\u00a0\\u00a0\\u00a0@High{0,0.0[0000]}\\u00a0\\u00a0\\u00a0\\u00a0@Low{0,0.0[0000]}\\u00a0\\u00a0\\u00a0\\u00a0@Close{0,0.0[0000]}\"],[\"Volume\",\"@Volume{0,0}\"]],\"formatters\":{\"type\":\"map\",\"entries\":[[\"@datetime\",\"datetime\"]]},\"mode\":\"vline\",\"point_policy\":\"follow_mouse\"}}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p3255\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"HoverTool\",\"id\":\"p3123\",\"attributes\":{\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p3120\",\"attributes\":{\"data_source\":{\"id\":\"p3068\"},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p3121\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p3122\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"VBar\",\"id\":\"p3117\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"index\"},\"width\":{\"type\":\"value\",\"value\":0.8},\"top\":{\"type\":\"field\",\"field\":\"Volume\"},\"line_color\":{\"type\":\"field\",\"field\":\"inc\",\"transform\":{\"id\":\"p3074\"}},\"fill_color\":{\"type\":\"field\",\"field\":\"inc\",\"transform\":{\"id\":\"p3074\"}},\"hatch_color\":{\"type\":\"field\",\"field\":\"inc\",\"transform\":{\"id\":\"p3074\"}}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"VBar\",\"id\":\"p3118\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"index\"},\"width\":{\"type\":\"value\",\"value\":0.8},\"top\":{\"type\":\"field\",\"field\":\"Volume\"},\"line_color\":{\"type\":\"field\",\"field\":\"inc\",\"transform\":{\"id\":\"p3074\"}},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"field\",\"field\":\"inc\",\"transform\":{\"id\":\"p3074\"}},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_color\":{\"type\":\"field\",\"field\":\"inc\",\"transform\":{\"id\":\"p3074\"}},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"VBar\",\"id\":\"p3119\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"index\"},\"width\":{\"type\":\"value\",\"value\":0.8},\"top\":{\"type\":\"field\",\"field\":\"Volume\"},\"line_color\":{\"type\":\"field\",\"field\":\"inc\",\"transform\":{\"id\":\"p3074\"}},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"field\",\"field\":\"inc\",\"transform\":{\"id\":\"p3074\"}},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_color\":{\"type\":\"field\",\"field\":\"inc\",\"transform\":{\"id\":\"p3074\"}},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}}],\"tooltips\":[[\"Date\",\"@datetime{%c}\"],[\"Volume\",\"@Volume{0.00 a}\"]],\"formatters\":{\"type\":\"map\",\"entries\":[[\"@datetime\",\"datetime\"]]},\"mode\":\"vline\",\"point_policy\":\"follow_mouse\"}}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p3256\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"HoverTool\",\"id\":\"p3243\",\"attributes\":{\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p3238\",\"attributes\":{\"data_source\":{\"id\":\"p3068\"},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p3239\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p3240\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3235\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"index\"},\"y\":{\"type\":\"field\",\"field\":\"MACD(C)[2]_0_2\"},\"line_color\":\"#2ca02c\",\"line_width\":1.3}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3236\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"index\"},\"y\":{\"type\":\"field\",\"field\":\"MACD(C)[2]_0_2\"},\"line_color\":\"#2ca02c\",\"line_alpha\":0.1,\"line_width\":1.3}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3237\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"index\"},\"y\":{\"type\":\"field\",\"field\":\"MACD(C)[2]_0_2\"},\"line_color\":\"#2ca02c\",\"line_alpha\":0.2,\"line_width\":1.3}}}}],\"tooltips\":[[\"Date\",\"@datetime{%c}\"],[\"MACD(C)\",\"@{MACD(C)[0]_0_0}{0,0.0[0000]}\\u00a0\\u00a0\\u00a0\\u00a0@{MACD(C)[1]_0_1}{0,0.0[0000]}\\u00a0\\u00a0\\u00a0\\u00a0@{MACD(C)[2]_0_2}{0,0.0[0000]}\"]],\"formatters\":{\"type\":\"map\",\"entries\":[[\"@datetime\",\"datetime\"]]},\"mode\":\"vline\",\"point_policy\":\"follow_mouse\"}}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p3257\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"CrosshairTool\",\"id\":\"p3246\"},{\"id\":\"p3246\"},{\"id\":\"p3246\"}]}}],\"active_drag\":{\"id\":\"p3247\"},\"active_scroll\":{\"id\":\"p3248\"}}},\"toolbar_location\":\"right\",\"children\":[[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p3033\",\"attributes\":{\"width\":null,\"height\":400,\"sizing_mode\":\"stretch_width\",\"x_range\":{\"type\":\"object\",\"name\":\"Range1d\",\"id\":\"p3032\",\"attributes\":{\"js_property_callbacks\":{\"type\":\"map\",\"entries\":[[\"change:end\",[{\"type\":\"object\",\"name\":\"CustomJS\",\"id\":\"p3245\",\"attributes\":{\"args\":{\"type\":\"map\",\"entries\":[[\"ohlc_range\",{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p3035\"}],[\"source\",{\"id\":\"p3068\"}],[\"volume_range\",{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p3081\"}]]},\"code\":\"if (!window._bt_scale_range) {\\n window._bt_scale_range = function (range, min, max, pad) {\\n \\\"use strict\\\";\\n if (min !== Infinity && max !== -Infinity) {\\n pad = pad ? (max - min) * .03 : 0;\\n range.start = min - pad;\\n range.end = max + pad;\\n } else console.error('backtesting: scale range error:', min, max, range);\\n };\\n}\\n\\nclearTimeout(window._bt_autoscale_timeout);\\n\\nwindow._bt_autoscale_timeout = setTimeout(function () {\\n /**\\n * @variable cb_obj `fig_ohlc.x_range`.\\n * @variable source `ColumnDataSource`\\n * @variable ohlc_range `fig_ohlc.y_range`.\\n * @variable volume_range `fig_volume.y_range`.\\n */\\n \\\"use strict\\\";\\n\\n let i = Math.max(Math.floor(cb_obj.start), 0),\\n j = Math.min(Math.ceil(cb_obj.end), source.data['ohlc_high'].length);\\n\\n let max = Math.max.apply(null, source.data['ohlc_high'].slice(i, j)),\\n min = Math.min.apply(null, source.data['ohlc_low'].slice(i, j));\\n _bt_scale_range(ohlc_range, min, max, true);\\n\\n if (volume_range) {\\n max = Math.max.apply(null, source.data['Volume'].slice(i, j));\\n _bt_scale_range(volume_range, 0, max * 1.03, false);\\n }\\n\\n}, 50);\\n\"}}]]]},\"end\":241,\"bounds\":[-12.05,253.05],\"min_interval\":10}},\"y_range\":{\"id\":\"p3035\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p3042\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p3043\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p3040\"},\"outline_line_color\":\"#666666\",\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p3134\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p3125\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p3126\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p3127\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAAAAJUAAAAAAAAA9QAAAAAAAgEdAAAAAAADgUEAAAAAAAOBVQAAAAAAAwFpAAAAAAAAAYEAAAAAAANBiQAAAAAAAYGVAAAAAAACwZ0AAAAAAACBqQAAAAAAA0GxA\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}],[\"Open\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"gufewyUnIUBx5ldzgDAhQCrG+ZtQWCNAuk4jLZU3I0D2I0VkWAUkQMcRa/EpUCRAHXIz3IC/I0By3CkdrA8kQB8RUyKJziNAYr68APtIKkDD9Shcj8ImQEjhehSuxyZA\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}],[\"High\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"zo3pCUsMIkDVsrW+SIgkQIkMq3gjoyNAZ5sb0xMmJEBSLLe0GnIlQIY97fDXVCRAF9S3zOmCJEBnYU87/KUkQG2QSUbOEihAYr68APtIKkAUrkfhehQoQArXo3A9CihA\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}],[\"Low\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"deWzPA9eIEDEWnwKgJEgQP3BwHPvoSJAnnsPlxxXIkA4Z0Rpb5AjQGcsms5OViNALCtNSkFHI0BTIoleRlEjQDvkZrgBzyJAexSuR+F6JkBI4XoUrkcmQB+F61G4niZA\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}],[\"Close\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"8l61MuFHIUAqxvmbUFgjQLpOIy2VNyNA2bERiNe1I0CWPnRBfUskQCGwcmiR3SNAmdNlMbEZJEBt/8pKk+IjQPYLdsO25SdAw/UoXI/CJkDD9Shcj8ImQGZmZmZmZidA\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}],[\"Volume\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"XI/CuWhtfEF7FK63gUmBQbgehYsS+X1BpHA9buJxe0HsUbjKBoZ+QQAAAATpp3FBFK5HUQuWdUEzMzObR8xyQc3MzDDqjnpBMzMzBfTAgkFI4Xr87eB9QYXrUdA7XXhB\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}],[\"_width\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"ZmZmZmbmNUDNzMzMzMwtQGZmZmZm5jRAZmZmZmbmM0BmZmZmZuYzQGZmZmZm5jJAZmZmZmbmNkBmZmZmZuY1QGZmZmZm5jJAZmZmZmbmMUBmZmZmZuY0QGZmZmZm5jVA\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}],[\"inc\",{\"type\":\"ndarray\",\"array\":[\"1\",\"1\",\"0\",\"1\",\"1\",\"0\",\"1\",\"0\",\"1\",\"0\",\"1\",\"1\"],\"shape\":[12],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p3135\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p3136\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Segment\",\"id\":\"p3131\",\"attributes\":{\"x0\":{\"type\":\"field\",\"field\":\"index\"},\"y0\":{\"type\":\"field\",\"field\":\"High\"},\"x1\":{\"type\":\"field\",\"field\":\"index\"},\"y1\":{\"type\":\"field\",\"field\":\"Low\"},\"line_color\":{\"type\":\"value\",\"value\":\"#bbbbbb\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Segment\",\"id\":\"p3132\",\"attributes\":{\"x0\":{\"type\":\"field\",\"field\":\"index\"},\"y0\":{\"type\":\"field\",\"field\":\"High\"},\"x1\":{\"type\":\"field\",\"field\":\"index\"},\"y1\":{\"type\":\"field\",\"field\":\"Low\"},\"line_color\":{\"type\":\"value\",\"value\":\"#bbbbbb\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Segment\",\"id\":\"p3133\",\"attributes\":{\"x0\":{\"type\":\"field\",\"field\":\"index\"},\"y0\":{\"type\":\"field\",\"field\":\"High\"},\"x1\":{\"type\":\"field\",\"field\":\"index\"},\"y1\":{\"type\":\"field\",\"field\":\"Low\"},\"line_color\":{\"type\":\"value\",\"value\":\"#bbbbbb\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p3144\",\"attributes\":{\"data_source\":{\"id\":\"p3125\"},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p3145\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p3146\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"VBar\",\"id\":\"p3141\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"index\"},\"width\":{\"type\":\"field\",\"field\":\"_width\"},\"bottom\":{\"type\":\"field\",\"field\":\"Close\"},\"top\":{\"type\":\"field\",\"field\":\"Open\"},\"line_color\":{\"type\":\"value\",\"value\":null},\"fill_color\":{\"type\":\"field\",\"field\":\"inc\",\"transform\":{\"type\":\"object\",\"name\":\"CategoricalColorMapper\",\"id\":\"p3137\",\"attributes\":{\"palette\":[\"rgb(254, 220, 214)\",\"rgb(214, 254, 214)\"],\"factors\":[\"0\",\"1\"]}}}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"VBar\",\"id\":\"p3142\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"index\"},\"width\":{\"type\":\"field\",\"field\":\"_width\"},\"bottom\":{\"type\":\"field\",\"field\":\"Close\"},\"top\":{\"type\":\"field\",\"field\":\"Open\"},\"line_color\":{\"type\":\"value\",\"value\":null},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"field\",\"field\":\"inc\",\"transform\":{\"id\":\"p3137\"}},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"VBar\",\"id\":\"p3143\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"index\"},\"width\":{\"type\":\"field\",\"field\":\"_width\"},\"bottom\":{\"type\":\"field\",\"field\":\"Close\"},\"top\":{\"type\":\"field\",\"field\":\"Open\"},\"line_color\":{\"type\":\"value\",\"value\":null},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"field\",\"field\":\"inc\",\"transform\":{\"id\":\"p3137\"}},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p3153\",\"attributes\":{\"data_source\":{\"id\":\"p3068\"},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p3154\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p3155\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Segment\",\"id\":\"p3150\",\"attributes\":{\"x0\":{\"type\":\"field\",\"field\":\"index\"},\"y0\":{\"type\":\"field\",\"field\":\"High\"},\"x1\":{\"type\":\"field\",\"field\":\"index\"},\"y1\":{\"type\":\"field\",\"field\":\"Low\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Segment\",\"id\":\"p3151\",\"attributes\":{\"x0\":{\"type\":\"field\",\"field\":\"index\"},\"y0\":{\"type\":\"field\",\"field\":\"High\"},\"x1\":{\"type\":\"field\",\"field\":\"index\"},\"y1\":{\"type\":\"field\",\"field\":\"Low\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Segment\",\"id\":\"p3152\",\"attributes\":{\"x0\":{\"type\":\"field\",\"field\":\"index\"},\"y0\":{\"type\":\"field\",\"field\":\"High\"},\"x1\":{\"type\":\"field\",\"field\":\"index\"},\"y1\":{\"type\":\"field\",\"field\":\"Low\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"id\":\"p3162\"},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p3171\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p3071\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p3072\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p3073\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"\"},\"shape\":[0],\"dtype\":\"float64\",\"order\":\"little\"}],[\"datetime\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"\"},\"shape\":[0],\"dtype\":\"float64\",\"order\":\"little\"}],[\"exit_price\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"\"},\"shape\":[0],\"dtype\":\"float64\",\"order\":\"little\"}],[\"size\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"\"},\"shape\":[0],\"dtype\":\"float64\",\"order\":\"little\"}],[\"returns_positive\",{\"type\":\"ndarray\",\"array\":[],\"shape\":[0],\"dtype\":\"object\",\"order\":\"little\"}],[\"position_lines_xs\",[]],[\"position_lines_ys\",[]]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p3172\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p3173\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"MultiLine\",\"id\":\"p3168\",\"attributes\":{\"xs\":{\"type\":\"field\",\"field\":\"position_lines_xs\"},\"ys\":{\"type\":\"field\",\"field\":\"position_lines_ys\"},\"line_color\":{\"type\":\"field\",\"field\":\"returns_positive\",\"transform\":{\"type\":\"object\",\"name\":\"CategoricalColorMapper\",\"id\":\"p3076\",\"attributes\":{\"palette\":[\"rgb(178, 27, 0)\",\"rgb(0, 178, 0)\"],\"factors\":[\"0\",\"1\"]}}},\"line_width\":{\"type\":\"value\",\"value\":8},\"line_dash\":{\"type\":\"value\",\"value\":\"dotted\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"MultiLine\",\"id\":\"p3169\",\"attributes\":{\"xs\":{\"type\":\"field\",\"field\":\"position_lines_xs\"},\"ys\":{\"type\":\"field\",\"field\":\"position_lines_ys\"},\"line_color\":{\"type\":\"field\",\"field\":\"returns_positive\",\"transform\":{\"id\":\"p3076\"}},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":8},\"line_dash\":{\"type\":\"value\",\"value\":\"dotted\"}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"MultiLine\",\"id\":\"p3170\",\"attributes\":{\"xs\":{\"type\":\"field\",\"field\":\"position_lines_xs\"},\"ys\":{\"type\":\"field\",\"field\":\"position_lines_ys\"},\"line_color\":{\"type\":\"field\",\"field\":\"returns_positive\",\"transform\":{\"id\":\"p3076\"}},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":8},\"line_dash\":{\"type\":\"value\",\"value\":\"dotted\"}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p3041\",\"attributes\":{\"tools\":[{\"id\":\"p3054\"},{\"id\":\"p3055\"},{\"id\":\"p3056\"},{\"id\":\"p3064\"},{\"id\":\"p3065\"},{\"id\":\"p3066\"},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p3067\"},{\"id\":\"p3244\"},{\"id\":\"p3246\"}],\"active_drag\":{\"id\":\"p3054\"},\"active_scroll\":{\"id\":\"p3055\"}}},\"toolbar_location\":null,\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p3049\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p3050\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p3051\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p3052\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p3044\",\"attributes\":{\"visible\":false,\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p3045\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"CustomJSTickFormatter\",\"id\":\"p3078\",\"attributes\":{\"args\":{\"type\":\"map\",\"entries\":[[\"axis\",{\"id\":\"p3044\"}],[\"formatter\",{\"type\":\"object\",\"name\":\"DatetimeTickFormatter\",\"id\":\"p3077\",\"attributes\":{\"days\":\"%a, %d %b\"}}],[\"source\",{\"id\":\"p3068\"}]]},\"code\":\"\\nthis.labels = this.labels || formatter.doFormat(ticks\\n .map(i => source.data.datetime[i])\\n .filter(t => t !== undefined));\\nreturn this.labels[index] || \\\"\\\";\\n \"}},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p3047\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p3048\",\"attributes\":{\"axis\":{\"id\":\"p3044\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p3053\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p3049\"}}},{\"type\":\"object\",\"name\":\"Legend\",\"id\":\"p3174\",\"attributes\":{\"location\":\"top_left\",\"border_line_color\":\"#333333\",\"click_policy\":\"hide\",\"label_text_font_size\":\"8pt\",\"margin\":0,\"padding\":5,\"spacing\":0,\"items\":[{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p3175\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"Trades (0)\"},\"renderers\":[{\"id\":\"p3171\"}]}}]}}],\"min_border_top\":3,\"min_border_bottom\":6,\"min_border_left\":0,\"min_border_right\":10}},0,0],[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p3079\",\"attributes\":{\"width\":null,\"height\":90,\"sizing_mode\":\"stretch_width\",\"x_range\":{\"id\":\"p3032\"},\"y_range\":{\"id\":\"p3081\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p3088\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p3089\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p3086\"},\"outline_line_color\":\"#666666\",\"renderers\":[{\"id\":\"p3120\"}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p3087\",\"attributes\":{\"tools\":[{\"id\":\"p3100\"},{\"id\":\"p3101\"},{\"id\":\"p3102\"},{\"id\":\"p3110\"},{\"id\":\"p3111\"},{\"id\":\"p3112\"},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p3113\"},{\"id\":\"p3123\"},{\"id\":\"p3246\"}],\"active_drag\":{\"id\":\"p3100\"},\"active_scroll\":{\"id\":\"p3101\"}}},\"toolbar_location\":null,\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p3095\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p3096\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"NumeralTickFormatter\",\"id\":\"p3124\",\"attributes\":{\"format\":\"0 a\"}},\"axis_label\":\"Volume\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p3098\"},\"minor_tick_line_color\":null}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p3090\",\"attributes\":{\"visible\":true,\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p3091\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"id\":\"p3078\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p3093\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p3094\",\"attributes\":{\"axis\":{\"id\":\"p3090\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p3099\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p3095\"}}}],\"min_border_top\":3,\"min_border_bottom\":6,\"min_border_left\":0,\"min_border_right\":10}},1,0],[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p3176\",\"attributes\":{\"width\":null,\"height\":90,\"sizing_mode\":\"stretch_width\",\"x_range\":{\"id\":\"p3032\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p3178\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p3185\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p3186\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p3183\"},\"outline_line_color\":\"#666666\",\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p3217\",\"attributes\":{\"data_source\":{\"id\":\"p3068\"},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p3218\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p3219\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3214\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"index\"},\"y\":{\"type\":\"field\",\"field\":\"MACD(C)[0]_0_0\"},\"line_color\":\"#1f77b4\",\"line_width\":1.3}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3215\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"index\"},\"y\":{\"type\":\"field\",\"field\":\"MACD(C)[0]_0_0\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.1,\"line_width\":1.3}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3216\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"index\"},\"y\":{\"type\":\"field\",\"field\":\"MACD(C)[0]_0_0\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.2,\"line_width\":1.3}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p3228\",\"attributes\":{\"data_source\":{\"id\":\"p3068\"},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p3229\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p3230\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3225\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"index\"},\"y\":{\"type\":\"field\",\"field\":\"MACD(C)[1]_0_1\"},\"line_color\":\"#ff7f0e\",\"line_width\":1.3}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3226\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"index\"},\"y\":{\"type\":\"field\",\"field\":\"MACD(C)[1]_0_1\"},\"line_color\":\"#ff7f0e\",\"line_alpha\":0.1,\"line_width\":1.3}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3227\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"index\"},\"y\":{\"type\":\"field\",\"field\":\"MACD(C)[1]_0_1\"},\"line_color\":\"#ff7f0e\",\"line_alpha\":0.2,\"line_width\":1.3}}}},{\"id\":\"p3238\"}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p3184\",\"attributes\":{\"tools\":[{\"id\":\"p3197\"},{\"id\":\"p3198\"},{\"id\":\"p3199\"},{\"id\":\"p3207\"},{\"id\":\"p3208\"},{\"id\":\"p3209\"},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p3210\"},{\"id\":\"p3243\"},{\"id\":\"p3246\"}],\"active_drag\":{\"id\":\"p3197\"},\"active_scroll\":{\"id\":\"p3198\"}}},\"toolbar_location\":null,\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p3192\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p3193\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p3194\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p3195\"},\"minor_tick_line_color\":null}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p3187\",\"attributes\":{\"visible\":false,\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p3188\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p3189\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p3190\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p3191\",\"attributes\":{\"axis\":{\"id\":\"p3187\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p3196\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p3192\"}}},{\"type\":\"object\",\"name\":\"Legend\",\"id\":\"p3220\",\"attributes\":{\"location\":\"top_left\",\"border_line_color\":\"#333333\",\"click_policy\":\"hide\",\"label_text_font_size\":\"8pt\",\"margin\":0,\"padding\":5,\"spacing\":0,\"items\":[{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p3221\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"MACD(C)[0]\"},\"renderers\":[{\"id\":\"p3217\"}]}},{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p3231\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"MACD(C)[1]\"},\"renderers\":[{\"id\":\"p3228\"}]}},{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p3241\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"MACD(C)[2]\"},\"renderers\":[{\"id\":\"p3238\"}]}}]}},{\"type\":\"object\",\"name\":\"Span\",\"id\":\"p3242\",\"attributes\":{\"location\":-0.001814620793287516,\"line_color\":\"#666666\",\"line_width\":0.5,\"line_dash\":[6]}}],\"min_border_top\":3,\"min_border_bottom\":6,\"min_border_left\":0,\"min_border_right\":10}},2,0]]}}]}};\n const render_items = [{\"docid\":\"0f0509fb-f201-472a-b6c4-02d445f98869\",\"roots\":{\"p3259\":\"efb71590-5114-443e-9b00-c3153ff90e92\"},\"root_ids\":[\"p3259\"]}];\n void root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n }\n if (root.Bokeh !== undefined) {\n embed_document(root);\n } else {\n let attempts = 0;\n const timer = setInterval(function(root) {\n if (root.Bokeh !== undefined) {\n clearInterval(timer);\n embed_document(root);\n } else {\n attempts++;\n if (attempts > 100) {\n clearInterval(timer);\n console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n }\n }\n }, 10, root)\n }\n})(window);", + "application/vnd.bokehjs_exec.v0+json": "" + }, + "metadata": { + "application/vnd.bokehjs_exec.v0+json": { + "id": "p3259" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "GridPlot(id='p3259', ...)" + ], + "text/html": [ + "
GridPlot(
id = 'p3259', …)
align = 'auto',
aspect_ratio = None,
children = [(figure(id='p3033', ...), 0, 0), (figure(id='p3079', ...), 1, 0), (figure(id='p3176', ...), 2, 0)],
cols = None,
context_menu = None,
css_classes = [],
css_variables = {},
disabled = False,
elements = [],
flow_mode = 'block',
height = None,
height_policy = 'auto',
js_event_callbacks = {},
js_property_callbacks = {},
margin = None,
max_height = None,
max_width = None,
min_height = None,
min_width = None,
name = None,
resizable = False,
rows = None,
sizing_mode = 'stretch_width',
spacing = 0,
styles = {},
stylesheets = [],
subscribed_events = PropertyValueSet(),
syncable = True,
tags = [],
toolbar = Toolbar(id='p3258', ...),
toolbar_location = 'right',
visible = True,
width = None,
width_policy = 'auto')
\n", + "\n" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 21 + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/回测/backtrader.ipynb b/回测/backtrader.ipynb index 91439da..b49b0c8 100644 --- a/回测/backtrader.ipynb +++ b/回测/backtrader.ipynb @@ -3,8 +3,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-02-17T14:33:50.205817Z", - "start_time": "2025-02-17T14:33:50.160964Z" + "end_time": "2025-02-18T02:25:15.671867Z", + "start_time": "2025-02-18T02:25:15.090164Z" } }, "cell_type": "code", @@ -12,10 +12,10 @@ "import backtrader as bt\n", "import pandas as pd\n", "\n", - "source_df = \\\n", - "pd.read_csv(\"C:\\\\Users\\\\lanyuanxiaoyao\\\\SynologyDrive\\\\data\\\\Tushare\\\\日线行情 1990-2024\\\\分组行情\\\\000001.SZ.csv\") \\\n", + "# source_df = \\\n", + "# pd.read_csv(\"C:\\\\Users\\\\lanyuanxiaoyao\\\\SynologyDrive\\\\data\\\\Tushare\\\\日线行情 1990-2024\\\\分组行情\\\\000001.SZ.csv\") \\\n", + "source_df = pd.read_csv(\"/Users/lanyuanxiaoyao/SynologyDrive/data/Tushare/日线行情 1990-2024/分组行情/000001.SZ.csv\") \\\n", " [[\"trade_date\", \"vol\", \"open_qfq\", \"close_qfq\", \"high_qfq\", \"low_qfq\"]]\n", - "# source_df = pd.read_csv(\"/Users/lanyuanxiaoyao/SynologyDrive/data/Tushare/日线行情 1990-2024/分组行情/000001.SZ.csv\") \\\n", "df = pd.DataFrame()\n", "df[[\"date\", \"volume\", \"open\", \"close\", \"high\", \"low\"]] = \\\n", " source_df[[\"trade_date\", \"vol\", \"open_qfq\", \"close_qfq\", \"high_qfq\", \"low_qfq\"]]\n", @@ -216,18 +216,18 @@ "" ] }, - "execution_count": 42, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 42 + "execution_count": 2 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-02-17T14:33:50.231103Z", - "start_time": "2025-02-17T14:33:50.225919Z" + "end_time": "2025-02-18T02:29:43.443218Z", + "start_time": "2025-02-18T02:29:43.436601Z" } }, "cell_type": "code", @@ -260,17 +260,17 @@ " print('夏普比率:', strat.analyzers.sharpe_ratio.get_analysis()['sharperatio'])\n", " print('最大回撤:', strat.analyzers.draw_down.get_analysis()['max']['drawdown'])\n", " # 绘制结果图表\n", - " return cerebro.plot(style='candlestick', width=20, height=10)" + " return cerebro.plot(style='candlestick')" ], "id": "d25f6e4d51cdfb20", "outputs": [], - "execution_count": 43 + "execution_count": 5 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-02-17T14:33:50.274745Z", - "start_time": "2025-02-17T14:33:50.269232Z" + "end_time": "2025-02-18T02:25:16.582436Z", + "start_time": "2025-02-18T02:25:15.803336Z" } }, "cell_type": "code", @@ -291,21 +291,7 @@ "df['hist'] = hist\n", "df['hist'] = df['hist'].fillna(0)\n", "\n", - "# df" - ], - "id": "5774f2437186c503", - "outputs": [], - "execution_count": 44 - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-02-17T14:33:50.412752Z", - "start_time": "2025-02-17T14:33:50.327691Z" - } - }, - "cell_type": "code", - "source": [ + "\n", "class EnhancePandasData(bt.feeds.PandasData):\n", " lines = (\"dif\", \"dea\", \"hist\")\n", " params = (\n", @@ -343,7 +329,7 @@ "\n", "run_backtrader(EnhancePandasData(dataname=df), MACDStrategy)" ], - "id": "45f8133af2348b95", + "id": "5774f2437186c503", "outputs": [ { "name": "stdout", @@ -373,7 +359,7 @@ "" ], "text/html": [ - "
" + "
" ] }, "metadata": {}, @@ -385,12 +371,12 @@ "[[
]]" ] }, - "execution_count": 45, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 45 + "execution_count": 4 } ], "metadata": {