From 5236a0f6f9839d4359a209352734512fed98f612 Mon Sep 17 00:00:00 2001 From: lanyuanxiaoyao Date: Tue, 11 Feb 2025 17:35:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E6=9E=84=E5=BB=BA=E5=9B=9E?= =?UTF-8?q?=E6=B5=8B=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- poetry.lock | 95 +++++- pyproject.toml | 3 + 回测/backtrader.ipynb | 37 +++ 材料准备/ta-lib.ipynb | 587 ++++++++++++++++++++++++++++++++++++++ 行情监控/Holdle策略.ipynb | 503 ++++++++++++++++++++++---------- 5 files changed, 1076 insertions(+), 149 deletions(-) create mode 100644 回测/backtrader.ipynb create mode 100644 材料准备/ta-lib.ipynb diff --git a/poetry.lock b/poetry.lock index 22fc8bc..1f5cbd4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -15,14 +15,14 @@ files = [ [[package]] name = "akshare" -version = "1.15.84" +version = "1.15.85" description = "AKShare is an elegant and simple financial data interface library for Python, built for human beings!" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "akshare-1.15.84-py3-none-any.whl", hash = "sha256:437f12ba66236f2863292ae4d253f974de2fd99f7124e560b3cdd48a8be174b9"}, - {file = "akshare-1.15.84.tar.gz", hash = "sha256:51c025e2e582591f973a5d1fb9dd9a248164005ae547e9142ac771bae25153eb"}, + {file = "akshare-1.15.85-py3-none-any.whl", hash = "sha256:46c2c96027a9588d838c41b7613cef4cee049d9961f9d592fc8165ab4b460343"}, + {file = "akshare-1.15.85.tar.gz", hash = "sha256:fad37fe3684a8d026d8dab802580f393d69969d35fd23106c72757a6dab22f7a"}, ] [package.dependencies] @@ -223,6 +223,20 @@ files = [ [package.extras] dev = ["backports.zoneinfo", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata"] +[[package]] +name = "backtrader" +version = "1.9.78.123" +description = "BackTesting Engine" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "backtrader-1.9.78.123-py2.py3-none-any.whl", hash = "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd"}, +] + +[package.extras] +plotting = ["matplotlib"] + [[package]] name = "beautifulsoup4" version = "4.13.3" @@ -2975,6 +2989,64 @@ files = [ {file = "rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d"}, ] +[[package]] +name = "scipy" +version = "1.15.1" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "scipy-1.15.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:c64ded12dcab08afff9e805a67ff4480f5e69993310e093434b10e85dc9d43e1"}, + {file = "scipy-1.15.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:5b190b935e7db569960b48840e5bef71dc513314cc4e79a1b7d14664f57fd4ff"}, + {file = "scipy-1.15.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:4b17d4220df99bacb63065c76b0d1126d82bbf00167d1730019d2a30d6ae01ea"}, + {file = "scipy-1.15.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:63b9b6cd0333d0eb1a49de6f834e8aeaefe438df8f6372352084535ad095219e"}, + {file = "scipy-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f151e9fb60fbf8e52426132f473221a49362091ce7a5e72f8aa41f8e0da4f25"}, + {file = "scipy-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21e10b1dd56ce92fba3e786007322542361984f8463c6d37f6f25935a5a6ef52"}, + {file = "scipy-1.15.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5dff14e75cdbcf07cdaa1c7707db6017d130f0af9ac41f6ce443a93318d6c6e0"}, + {file = "scipy-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:f82fcf4e5b377f819542fbc8541f7b5fbcf1c0017d0df0bc22c781bf60abc4d8"}, + {file = "scipy-1.15.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:5bd8d27d44e2c13d0c1124e6a556454f52cd3f704742985f6b09e75e163d20d2"}, + {file = "scipy-1.15.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:be3deeb32844c27599347faa077b359584ba96664c5c79d71a354b80a0ad0ce0"}, + {file = "scipy-1.15.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:5eb0ca35d4b08e95da99a9f9c400dc9f6c21c424298a0ba876fdc69c7afacedf"}, + {file = "scipy-1.15.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:74bb864ff7640dea310a1377d8567dc2cb7599c26a79ca852fc184cc851954ac"}, + {file = "scipy-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:667f950bf8b7c3a23b4199db24cb9bf7512e27e86d0e3813f015b74ec2c6e3df"}, + {file = "scipy-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395be70220d1189756068b3173853029a013d8c8dd5fd3d1361d505b2aa58fa7"}, + {file = "scipy-1.15.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ce3a000cd28b4430426db2ca44d96636f701ed12e2b3ca1f2b1dd7abdd84b39a"}, + {file = "scipy-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:3fe1d95944f9cf6ba77aa28b82dd6bb2a5b52f2026beb39ecf05304b8392864b"}, + {file = "scipy-1.15.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c09aa9d90f3500ea4c9b393ee96f96b0ccb27f2f350d09a47f533293c78ea776"}, + {file = "scipy-1.15.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:0ac102ce99934b162914b1e4a6b94ca7da0f4058b6d6fd65b0cef330c0f3346f"}, + {file = "scipy-1.15.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:09c52320c42d7f5c7748b69e9f0389266fd4f82cf34c38485c14ee976cb8cb04"}, + {file = "scipy-1.15.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:cdde8414154054763b42b74fe8ce89d7f3d17a7ac5dd77204f0e142cdc9239e9"}, + {file = "scipy-1.15.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c9d8fc81d6a3b6844235e6fd175ee1d4c060163905a2becce8e74cb0d7554ce"}, + {file = "scipy-1.15.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fb57b30f0017d4afa5fe5f5b150b8f807618819287c21cbe51130de7ccdaed2"}, + {file = "scipy-1.15.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:491d57fe89927fa1aafbe260f4cfa5ffa20ab9f1435025045a5315006a91b8f5"}, + {file = "scipy-1.15.1-cp312-cp312-win_amd64.whl", hash = "sha256:900f3fa3db87257510f011c292a5779eb627043dd89731b9c461cd16ef76ab3d"}, + {file = "scipy-1.15.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:100193bb72fbff37dbd0bf14322314fc7cbe08b7ff3137f11a34d06dc0ee6b85"}, + {file = "scipy-1.15.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:2114a08daec64980e4b4cbdf5bee90935af66d750146b1d2feb0d3ac30613692"}, + {file = "scipy-1.15.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:6b3e71893c6687fc5e29208d518900c24ea372a862854c9888368c0b267387ab"}, + {file = "scipy-1.15.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:837299eec3d19b7e042923448d17d95a86e43941104d33f00da7e31a0f715d3c"}, + {file = "scipy-1.15.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82add84e8a9fb12af5c2c1a3a3f1cb51849d27a580cb9e6bd66226195142be6e"}, + {file = "scipy-1.15.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:070d10654f0cb6abd295bc96c12656f948e623ec5f9a4eab0ddb1466c000716e"}, + {file = "scipy-1.15.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:55cc79ce4085c702ac31e49b1e69b27ef41111f22beafb9b49fea67142b696c4"}, + {file = "scipy-1.15.1-cp313-cp313-win_amd64.whl", hash = "sha256:c352c1b6d7cac452534517e022f8f7b8d139cd9f27e6fbd9f3cbd0bfd39f5bef"}, + {file = "scipy-1.15.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0458839c9f873062db69a03de9a9765ae2e694352c76a16be44f93ea45c28d2b"}, + {file = "scipy-1.15.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:af0b61c1de46d0565b4b39c6417373304c1d4f5220004058bdad3061c9fa8a95"}, + {file = "scipy-1.15.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:71ba9a76c2390eca6e359be81a3e879614af3a71dfdabb96d1d7ab33da6f2364"}, + {file = "scipy-1.15.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14eaa373c89eaf553be73c3affb11ec6c37493b7eaaf31cf9ac5dffae700c2e0"}, + {file = "scipy-1.15.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f735bc41bd1c792c96bc426dece66c8723283695f02df61dcc4d0a707a42fc54"}, + {file = "scipy-1.15.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2722a021a7929d21168830790202a75dbb20b468a8133c74a2c0230c72626b6c"}, + {file = "scipy-1.15.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bc7136626261ac1ed988dca56cfc4ab5180f75e0ee52e58f1e6aa74b5f3eacd5"}, + {file = "scipy-1.15.1.tar.gz", hash = "sha256:033a75ddad1463970c96a88063a1df87ccfddd526437136b6ee81ff0312ebdf6"}, +] + +[package.dependencies] +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"] + [[package]] name = "send2trash" version = "1.8.3" @@ -3208,6 +3280,21 @@ numpy = "*" test = ["pandas", "pytest", "pytest-cov"] ujson = ["ujson (>=5.5.0)"] +[[package]] +name = "ta-lib" +version = "0.6.3" +description = "Python wrapper for TA-Lib" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "ta_lib-0.6.3.tar.gz", hash = "sha256:0c628db09b3fab6e5c26979e608b674e7aecc10359c82ba8d53f729767a856ac"}, +] + +[package.dependencies] +numpy = "*" +setuptools = "*" + [[package]] name = "tabulate" version = "0.9.0" @@ -3498,4 +3585,4 @@ test = ["pytest", "pytest-cov"] [metadata] lock-version = "2.1" python-versions = "^3.12" -content-hash = "9fbcdd3a9fba083ae2a2138f3b82492b3559f8dcd3a7fde8ab521f36387327af" +content-hash = "40ca96657ad381e086f3ea182f88c07ff7d44daa425efe1942266d112701c0ba" diff --git a/pyproject.toml b/pyproject.toml index 66f688e..b56db84 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,6 +14,9 @@ jupyter = "^1.1.1" matplotlib = "^3.10.0" prophet = "^1.1.6" mplfinance = "^0.12.10b0" +scipy = "^1.15.1" +ta-lib = "^0.6.3" +backtrader = "^1.9.78.123" [build-system] diff --git a/回测/backtrader.ipynb b/回测/backtrader.ipynb new file mode 100644 index 0000000..54f657b --- /dev/null +++ b/回测/backtrader.ipynb @@ -0,0 +1,37 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "initial_id", + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "" + ] + } + ], + "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/材料准备/ta-lib.ipynb b/材料准备/ta-lib.ipynb new file mode 100644 index 0000000..f8a4819 --- /dev/null +++ b/材料准备/ta-lib.ipynb @@ -0,0 +1,587 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2025-02-11T06:31:19.433336Z", + "start_time": "2025-02-11T06:31:18.884130Z" + } + }, + "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/分组行情/600519.SH.csv\") \\\n", + " [[\"trade_date\", \"vol\", \"open_qfq\", \"close_qfq\", \"high_qfq\", \"low_qfq\", \"macd\", \"macd_dif\", \"macd_dea\"]]\n", + "df = pd.DataFrame()\n", + "df[[\"date\", \"volume\", \"open\", \"close\", \"high\", \"low\", \"macd\", \"macd_dif\", \"macd_dea\"]] = \\\n", + " source_df[[\"trade_date\", \"vol\", \"open_qfq\", \"close_qfq\", \"high_qfq\", \"low_qfq\", \"macd\", \"macd_dif\", \"macd_dea\"]]\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.sort_values(by='datetime', inplace=True)\n", + "df" + ], + "outputs": [ + { + "data": { + "text/plain": [ + " date volume open close high low \\\n", + "2187 20010827 406318.00 4.23675 4.36443 4.63820 4.03295 \n", + "2188 20010828 129647.79 4.29568 4.52525 4.54244 4.24902 \n", + "2189 20010829 53252.75 4.53999 4.46632 4.54244 4.43195 \n", + "2190 20010830 48013.06 4.45405 4.55472 4.60505 4.41967 \n", + "2191 20010831 23231.48 4.56086 4.54367 4.61856 4.51789 \n", + "... ... ... ... ... ... ... \n", + "2182 20241225 17123.39 1538.80000 1530.00000 1538.80000 1526.10000 \n", + "2183 20241226 18286.51 1534.00000 1527.79000 1538.78000 1523.00000 \n", + "2184 20241227 20759.32 1528.90000 1528.97000 1536.00000 1519.50000 \n", + "2185 20241230 25129.82 1533.97000 1525.00000 1543.96000 1525.00000 \n", + "2186 20241231 39354.45 1525.40000 1524.00000 1545.00000 1522.01000 \n", + "\n", + " macd macd_dif macd_dea datetime datetime_text \n", + "2187 0.000 0.000 0.000 2001-08-27 20010827 \n", + "2188 0.021 0.013 0.003 2001-08-28 20010828 \n", + "2189 0.025 0.018 0.006 2001-08-29 20010829 \n", + "2190 0.037 0.029 0.010 2001-08-30 20010830 \n", + "2191 0.042 0.036 0.016 2001-08-31 20010831 \n", + "... ... ... ... ... ... \n", + "2182 5.430 5.063 2.348 2024-12-25 20241225 \n", + "2183 4.192 4.968 2.872 2024-12-26 20241226 \n", + "2184 3.295 4.931 3.283 2024-12-27 20241227 \n", + "2185 1.993 4.529 3.533 2024-12-30 20241230 \n", + "2186 0.880 4.083 3.643 2024-12-31 20241231 \n", + "\n", + "[5591 rows x 11 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", + " \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", + "
datevolumeopenclosehighlowmacdmacd_difmacd_deadatetimedatetime_text
218720010827406318.004.236754.364434.638204.032950.0000.0000.0002001-08-2720010827
218820010828129647.794.295684.525254.542444.249020.0210.0130.0032001-08-2820010828
21892001082953252.754.539994.466324.542444.431950.0250.0180.0062001-08-2920010829
21902001083048013.064.454054.554724.605054.419670.0370.0290.0102001-08-3020010830
21912001083123231.484.560864.543674.618564.517890.0420.0360.0162001-08-3120010831
....................................
21822024122517123.391538.800001530.000001538.800001526.100005.4305.0632.3482024-12-2520241225
21832024122618286.511534.000001527.790001538.780001523.000004.1924.9682.8722024-12-2620241226
21842024122720759.321528.900001528.970001536.000001519.500003.2954.9313.2832024-12-2720241227
21852024123025129.821533.970001525.000001543.960001525.000001.9934.5293.5332024-12-3020241230
21862024123139354.451525.400001524.000001545.000001522.010000.8804.0833.6432024-12-3120241231
\n", + "

5591 rows × 11 columns

\n", + "
" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 2 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-02-11T06:33:12.365001Z", + "start_time": "2025-02-11T06:33:12.329227Z" + } + }, + "cell_type": "code", + "source": [ + "import talib\n", + "\n", + "dif, dea, hist = talib.MACD(df[\"close\"], fastperiod=12, slowperiod=26, signalperiod=9)\n", + "\n", + "# 将结果添加到数据框\n", + "df['DIF'] = dif\n", + "df['DEA'] = dea\n", + "df['MACD'] = hist\n", + "\n", + "#根据close列计算macd值\n", + "talib.SMA(df[\"close\"], timeperiod=26, step=10)\n", + "\n", + "df" + ], + "id": "72b1c0c3f57e8b8e", + "outputs": [ + { + "data": { + "text/plain": [ + " date volume open close high low \\\n", + "2187 20010827 406318.00 4.23675 4.36443 4.63820 4.03295 \n", + "2188 20010828 129647.79 4.29568 4.52525 4.54244 4.24902 \n", + "2189 20010829 53252.75 4.53999 4.46632 4.54244 4.43195 \n", + "2190 20010830 48013.06 4.45405 4.55472 4.60505 4.41967 \n", + "2191 20010831 23231.48 4.56086 4.54367 4.61856 4.51789 \n", + "... ... ... ... ... ... ... \n", + "2182 20241225 17123.39 1538.80000 1530.00000 1538.80000 1526.10000 \n", + "2183 20241226 18286.51 1534.00000 1527.79000 1538.78000 1523.00000 \n", + "2184 20241227 20759.32 1528.90000 1528.97000 1536.00000 1519.50000 \n", + "2185 20241230 25129.82 1533.97000 1525.00000 1543.96000 1525.00000 \n", + "2186 20241231 39354.45 1525.40000 1524.00000 1545.00000 1522.01000 \n", + "\n", + " macd macd_dif macd_dea datetime datetime_text DIF DEA \\\n", + "2187 0.000 0.000 0.000 2001-08-27 20010827 NaN NaN \n", + "2188 0.021 0.013 0.003 2001-08-28 20010828 NaN NaN \n", + "2189 0.025 0.018 0.006 2001-08-29 20010829 NaN NaN \n", + "2190 0.037 0.029 0.010 2001-08-30 20010830 NaN NaN \n", + "2191 0.042 0.036 0.016 2001-08-31 20010831 NaN NaN \n", + "... ... ... ... ... ... ... ... \n", + "2182 5.430 5.063 2.348 2024-12-25 20241225 5.062711 2.347629 \n", + "2183 4.192 4.968 2.872 2024-12-26 20241226 4.967756 2.871654 \n", + "2184 3.295 4.931 3.283 2024-12-27 20241227 4.930880 3.283499 \n", + "2185 1.993 4.529 3.533 2024-12-30 20241230 4.529101 3.532620 \n", + "2186 0.880 4.083 3.643 2024-12-31 20241231 4.082931 3.642682 \n", + "\n", + " MACD \n", + "2187 NaN \n", + "2188 NaN \n", + "2189 NaN \n", + "2190 NaN \n", + "2191 NaN \n", + "... ... \n", + "2182 2.715082 \n", + "2183 2.096102 \n", + "2184 1.647381 \n", + "2185 0.996481 \n", + "2186 0.440249 \n", + "\n", + "[5591 rows x 14 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", + " \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", + "
datevolumeopenclosehighlowmacdmacd_difmacd_deadatetimedatetime_textDIFDEAMACD
218720010827406318.004.236754.364434.638204.032950.0000.0000.0002001-08-2720010827NaNNaNNaN
218820010828129647.794.295684.525254.542444.249020.0210.0130.0032001-08-2820010828NaNNaNNaN
21892001082953252.754.539994.466324.542444.431950.0250.0180.0062001-08-2920010829NaNNaNNaN
21902001083048013.064.454054.554724.605054.419670.0370.0290.0102001-08-3020010830NaNNaNNaN
21912001083123231.484.560864.543674.618564.517890.0420.0360.0162001-08-3120010831NaNNaNNaN
.............................................
21822024122517123.391538.800001530.000001538.800001526.100005.4305.0632.3482024-12-25202412255.0627112.3476292.715082
21832024122618286.511534.000001527.790001538.780001523.000004.1924.9682.8722024-12-26202412264.9677562.8716542.096102
21842024122720759.321528.900001528.970001536.000001519.500003.2954.9313.2832024-12-27202412274.9308803.2834991.647381
21852024123025129.821533.970001525.000001543.960001525.000001.9934.5293.5332024-12-30202412304.5291013.5326200.996481
21862024123139354.451525.400001524.000001545.000001522.010000.8804.0833.6432024-12-31202412314.0829313.6426820.440249
\n", + "

5591 rows × 14 columns

\n", + "
" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 3 + } + ], + "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/行情监控/Holdle策略.ipynb b/行情监控/Holdle策略.ipynb index 10b415f..7bbd880 100644 --- a/行情监控/Holdle策略.ipynb +++ b/行情监控/Holdle策略.ipynb @@ -3,28 +3,28 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-02-10T14:37:48.747081Z", - "start_time": "2025-02-10T14:37:48.743083Z" + "end_time": "2025-02-11T02:51:57.789440Z", + "start_time": "2025-02-11T02:51:57.208223Z" } }, "cell_type": "code", "source": "import pandas as pd", "id": "6a10e07f5f498bc6", "outputs": [], - "execution_count": 27 + "execution_count": 1 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-02-10T14:54:43.071056Z", - "start_time": "2025-02-10T14:54:43.027108Z" + "end_time": "2025-02-11T03:14:30.972240Z", + "start_time": "2025-02-11T03:14:30.857326Z" } }, "cell_type": "code", "source": [ - "# source_df = pd.read_csv(\"/Users/lanyuanxiaoyao/Documents/日线行情/000001.SZ.csv\") \\\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/分组行情/600519.SH.csv\") \\\n", " [[\"trade_date\", \"vol\", \"open_qfq\", \"close_qfq\", \"high_qfq\", \"low_qfq\", \"macd\", \"macd_dif\", \"macd_dea\"]]\n", "df = pd.DataFrame()\n", "df[[\"date\", \"volume\", \"open\", \"close\", \"high\", \"low\", \"macd\", \"macd_dif\", \"macd_dea\"]] = \\\n", @@ -39,33 +39,33 @@ { "data": { "text/plain": [ - " date volume open close high low macd \\\n", - "0 19910404 3.00 0.38158 0.38158 0.38158 0.38158 0.000 \n", - "1 19910405 2.00 0.37970 0.37970 0.37970 0.37970 0.000 \n", - "2 19910408 2.00 0.37595 0.37595 0.37595 0.37595 -0.001 \n", - "3 19910409 4.00 0.37407 0.37407 0.37407 0.37407 -0.001 \n", - "4 19910410 15.00 0.37219 0.37219 0.37219 0.37219 -0.002 \n", - "... ... ... ... ... ... ... ... \n", - "3813 20241225 1475282.94 11.86000 11.92000 12.02000 11.84000 0.050 \n", - "3814 20241226 1000074.70 11.92000 11.86000 11.93000 11.78000 0.051 \n", - "3815 20241227 1290012.28 11.87000 11.83000 11.90000 11.66000 0.044 \n", - "3816 20241230 1351846.36 11.78000 11.95000 11.97000 11.78000 0.052 \n", - "3817 20241231 1475367.33 11.93000 11.70000 11.99000 11.70000 0.020 \n", + " date volume open close high low \\\n", + "2187 20010827 406318.00 4.23675 4.36443 4.63820 4.03295 \n", + "2188 20010828 129647.79 4.29568 4.52525 4.54244 4.24902 \n", + "2189 20010829 53252.75 4.53999 4.46632 4.54244 4.43195 \n", + "2190 20010830 48013.06 4.45405 4.55472 4.60505 4.41967 \n", + "2191 20010831 23231.48 4.56086 4.54367 4.61856 4.51789 \n", + "... ... ... ... ... ... ... \n", + "2182 20241225 17123.39 1538.80000 1530.00000 1538.80000 1526.10000 \n", + "2183 20241226 18286.51 1534.00000 1527.79000 1538.78000 1523.00000 \n", + "2184 20241227 20759.32 1528.90000 1528.97000 1536.00000 1519.50000 \n", + "2185 20241230 25129.82 1533.97000 1525.00000 1543.96000 1525.00000 \n", + "2186 20241231 39354.45 1525.40000 1524.00000 1545.00000 1522.01000 \n", "\n", - " macd_dif macd_dea datetime datetime_text \n", - "0 0.000 0.000 1991-04-04 19910404 \n", - "1 0.000 0.000 1991-04-05 19910405 \n", - "2 -0.001 0.000 1991-04-08 19910408 \n", - "3 -0.001 0.000 1991-04-09 19910409 \n", - "4 -0.002 -0.001 1991-04-10 19910410 \n", - "... ... ... ... ... \n", - "3813 0.080 0.055 2024-12-25 20241225 \n", - "3814 0.087 0.062 2024-12-26 20241226 \n", - "3815 0.089 0.067 2024-12-27 20241227 \n", - "3816 0.100 0.074 2024-12-30 20241230 \n", - "3817 0.086 0.076 2024-12-31 20241231 \n", + " macd macd_dif macd_dea datetime datetime_text \n", + "2187 0.000 0.000 0.000 2001-08-27 20010827 \n", + "2188 0.021 0.013 0.003 2001-08-28 20010828 \n", + "2189 0.025 0.018 0.006 2001-08-29 20010829 \n", + "2190 0.037 0.029 0.010 2001-08-30 20010830 \n", + "2191 0.042 0.036 0.016 2001-08-31 20010831 \n", + "... ... ... ... ... ... \n", + "2182 5.430 5.063 2.348 2024-12-25 20241225 \n", + "2183 4.192 4.968 2.872 2024-12-26 20241226 \n", + "2184 3.295 4.931 3.283 2024-12-27 20241227 \n", + "2185 1.993 4.529 3.533 2024-12-30 20241230 \n", + "2186 0.880 4.083 3.643 2024-12-31 20241231 \n", "\n", - "[8022 rows x 11 columns]" + "[5591 rows x 11 columns]" ], "text/html": [ "
\n", @@ -101,74 +101,74 @@ " \n", " \n", " \n", - " 0\n", - " 19910404\n", - " 3.00\n", - " 0.38158\n", - " 0.38158\n", - " 0.38158\n", - " 0.38158\n", + " 2187\n", + " 20010827\n", + " 406318.00\n", + " 4.23675\n", + " 4.36443\n", + " 4.63820\n", + " 4.03295\n", " 0.000\n", " 0.000\n", " 0.000\n", - " 1991-04-04\n", - " 19910404\n", + " 2001-08-27\n", + " 20010827\n", " \n", " \n", - " 1\n", - " 19910405\n", - " 2.00\n", - " 0.37970\n", - " 0.37970\n", - " 0.37970\n", - " 0.37970\n", - " 0.000\n", - " 0.000\n", - " 0.000\n", - " 1991-04-05\n", - " 19910405\n", + " 2188\n", + " 20010828\n", + " 129647.79\n", + " 4.29568\n", + " 4.52525\n", + " 4.54244\n", + " 4.24902\n", + " 0.021\n", + " 0.013\n", + " 0.003\n", + " 2001-08-28\n", + " 20010828\n", " \n", " \n", - " 2\n", - " 19910408\n", - " 2.00\n", - " 0.37595\n", - " 0.37595\n", - " 0.37595\n", - " 0.37595\n", - " -0.001\n", - " -0.001\n", - " 0.000\n", - " 1991-04-08\n", - " 19910408\n", + " 2189\n", + " 20010829\n", + " 53252.75\n", + " 4.53999\n", + " 4.46632\n", + " 4.54244\n", + " 4.43195\n", + " 0.025\n", + " 0.018\n", + " 0.006\n", + " 2001-08-29\n", + " 20010829\n", " \n", " \n", - " 3\n", - " 19910409\n", - " 4.00\n", - " 0.37407\n", - " 0.37407\n", - " 0.37407\n", - " 0.37407\n", - " -0.001\n", - " -0.001\n", - " 0.000\n", - " 1991-04-09\n", - " 19910409\n", + " 2190\n", + " 20010830\n", + " 48013.06\n", + " 4.45405\n", + " 4.55472\n", + " 4.60505\n", + " 4.41967\n", + " 0.037\n", + " 0.029\n", + " 0.010\n", + " 2001-08-30\n", + " 20010830\n", " \n", " \n", - " 4\n", - " 19910410\n", - " 15.00\n", - " 0.37219\n", - " 0.37219\n", - " 0.37219\n", - " 0.37219\n", - " -0.002\n", - " -0.002\n", - " -0.001\n", - " 1991-04-10\n", - " 19910410\n", + " 2191\n", + " 20010831\n", + " 23231.48\n", + " 4.56086\n", + " 4.54367\n", + " 4.61856\n", + " 4.51789\n", + " 0.042\n", + " 0.036\n", + " 0.016\n", + " 2001-08-31\n", + " 20010831\n", " \n", " \n", " ...\n", @@ -185,87 +185,87 @@ " ...\n", " \n", " \n", - " 3813\n", + " 2182\n", " 20241225\n", - " 1475282.94\n", - " 11.86000\n", - " 11.92000\n", - " 12.02000\n", - " 11.84000\n", - " 0.050\n", - " 0.080\n", - " 0.055\n", + " 17123.39\n", + " 1538.80000\n", + " 1530.00000\n", + " 1538.80000\n", + " 1526.10000\n", + " 5.430\n", + " 5.063\n", + " 2.348\n", " 2024-12-25\n", " 20241225\n", " \n", " \n", - " 3814\n", + " 2183\n", " 20241226\n", - " 1000074.70\n", - " 11.92000\n", - " 11.86000\n", - " 11.93000\n", - " 11.78000\n", - " 0.051\n", - " 0.087\n", - " 0.062\n", + " 18286.51\n", + " 1534.00000\n", + " 1527.79000\n", + " 1538.78000\n", + " 1523.00000\n", + " 4.192\n", + " 4.968\n", + " 2.872\n", " 2024-12-26\n", " 20241226\n", " \n", " \n", - " 3815\n", + " 2184\n", " 20241227\n", - " 1290012.28\n", - " 11.87000\n", - " 11.83000\n", - " 11.90000\n", - " 11.66000\n", - " 0.044\n", - " 0.089\n", - " 0.067\n", + " 20759.32\n", + " 1528.90000\n", + " 1528.97000\n", + " 1536.00000\n", + " 1519.50000\n", + " 3.295\n", + " 4.931\n", + " 3.283\n", " 2024-12-27\n", " 20241227\n", " \n", " \n", - " 3816\n", + " 2185\n", " 20241230\n", - " 1351846.36\n", - " 11.78000\n", - " 11.95000\n", - " 11.97000\n", - " 11.78000\n", - " 0.052\n", - " 0.100\n", - " 0.074\n", + " 25129.82\n", + " 1533.97000\n", + " 1525.00000\n", + " 1543.96000\n", + " 1525.00000\n", + " 1.993\n", + " 4.529\n", + " 3.533\n", " 2024-12-30\n", " 20241230\n", " \n", " \n", - " 3817\n", + " 2186\n", " 20241231\n", - " 1475367.33\n", - " 11.93000\n", - " 11.70000\n", - " 11.99000\n", - " 11.70000\n", - " 0.020\n", - " 0.086\n", - " 0.076\n", + " 39354.45\n", + " 1525.40000\n", + " 1524.00000\n", + " 1545.00000\n", + " 1522.01000\n", + " 0.880\n", + " 4.083\n", + " 3.643\n", " 2024-12-31\n", " 20241231\n", " \n", " \n", "\n", - "

8022 rows × 11 columns

\n", + "

5591 rows × 11 columns

\n", "
" ] }, - "execution_count": 35, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 35 + "execution_count": 9 }, { "metadata": { @@ -923,13 +923,15 @@ "cell_type": "code", "source": [ "daily_df = df.copy()[[\"datetime\", \"volume\", \"open\", \"close\", \"high\", \"low\"]]\n", - "monthly_df = daily_df.groupby(pd.Grouper(key='datetime', freq='ME')).agg({\n", - " \"volume\": \"sum\",\n", - " \"open\": \"first\",\n", - " \"close\": \"last\",\n", - " \"high\": \"max\",\n", - " \"low\": \"min\",\n", - "})\n", + "monthly_df = daily_df.groupby(pd.Grouper(key='datetime', freq='ME')).agg(\n", + " {\n", + " \"volume\": \"sum\",\n", + " \"open\": \"first\",\n", + " \"close\": \"last\",\n", + " \"high\": \"max\",\n", + " \"low\": \"min\",\n", + " }\n", + ")\n", "monthly_df.reset_index(inplace=True)\n", "monthly_df.set_index('datetime', inplace=True)\n", "monthly_df" @@ -1152,6 +1154,217 @@ "2.在上述筛选出的月份中,找出那些该月份的前一个月的MACD值小于0的月份" ], "id": "8a98fd3bbe6cfffb" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-02-11T03:14:36.513645Z", + "start_time": "2025-02-11T03:14:36.474163Z" + } + }, + "cell_type": "code", + "source": [ + "daily_df = df.copy()\n", + "import pandas as pd\n", + "import talib\n", + "import numpy as np\n", + "from scipy.signal import argrelextrema\n", + "\n", + "\n", + "# 假设daily_df已经导入,列名为datetime, open, close, high, low\n", + "# 代码中会直接使用daily_df\n", + "\n", + "# 步骤1: 计算月线行情和月线的MACD\n", + "# 首先需要将日线行情转换为月线行情\n", + "def calculate_monthly_data(daily_df):\n", + " \"\"\"\n", + " 将日线行情转换为月线行情\n", + " datetime: 转换为日期的月初\n", + " open: 每个月的第一个交易日的开盘价\n", + " close: 每个月的最后一个交易日的收盘价\n", + " high: 每个月的最高价\n", + " low: 每个月的最低价\n", + " \"\"\"\n", + " # 将datetime列转换为日期格式\n", + " daily_df['datetime'] = pd.to_datetime(daily_df['datetime'])\n", + "\n", + " # 按月份分组\n", + " monthly_df = daily_df.groupby(pd.Grouper(key='datetime', freq='M')).agg(\n", + " {\n", + " 'open': 'first',\n", + " 'close': 'last',\n", + " 'high': 'max',\n", + " 'low': 'min'\n", + " }\n", + " )\n", + " return monthly_df\n", + "\n", + "\n", + "# 计算月线的MACD指标\n", + "def calculate_monthly_macd(monthly_df):\n", + " \"\"\"\n", + " 计算月线的MACD指标,包括DIF, DEA和MACD柱状图值\n", + " \"\"\"\n", + " # 获取收盘价序列\n", + " close_prices = monthly_df['close'].values\n", + "\n", + " # 计算MACD\n", + " dif, dea, hist = talib.MACD(close_prices, fastperiod=12, slowperiod=26, signalperiod=9)\n", + "\n", + " # 将结果添加到数据框\n", + " monthly_df['DIF'] = dif\n", + " monthly_df['DEA'] = dea\n", + " monthly_df['MACD'] = hist\n", + "\n", + " return monthly_df\n", + "\n", + "\n", + "# 筛选出符合条件的月份\n", + "def filter_monthly_macd(monthly_df):\n", + " \"\"\"\n", + " 筛选出满足条件的月份:\n", + " DIF和DEA均在0轴上方,且MACD值大于0并且小于DIF和DEA\n", + " \"\"\"\n", + " # 定义筛选条件\n", + " condition = (monthly_df['DIF'] > 0) & \\\n", + " (monthly_df['DEA'] > 0) & \\\n", + " (monthly_df['MACD'] > 0) & \\\n", + " (monthly_df['MACD'] < monthly_df['DIF']) & \\\n", + " (monthly_df['MACD'] < monthly_df['DEA'])\n", + "\n", + " # 筛选符合条件的月份\n", + " filtered_months = monthly_df[condition]\n", + " return filtered_months\n", + "\n", + "\n", + "# 步骤2: 进一步筛选符合条件的月份\n", + "def further_filter_months(filtered_months, monthly_df):\n", + " \"\"\"\n", + " 在步骤1筛选出的月份中,进一步筛选:\n", + " 1. 该月份的前一个月的MACD值小于0\n", + " 2. 该月份前几个月MACD值经历了从下降(至少连续下降超过2个月)再回升的第一个月\n", + " \"\"\"\n", + " # 合并所有月份的数据\n", + " merged_df = monthly_df.merge(\n", + " filtered_months[['DIF', 'DEA', 'MACD']],\n", + " left_index=True, right_index=True,\n", + " how='left', suffixes=('', '_filtered')\n", + " )\n", + "\n", + " # 条件1: 前一个月的MACD值小于0\n", + " condition1 = merged_df['MACD_filtered'].shift(1) < 0\n", + "\n", + " # 条件2: 前几个月MACD经历了从下降超过2个月再回升的第一个月\n", + " # 使用rolling窗口检查是否连续下降超过2个月,然后回升\n", + " # 创建一个标志,表示是否处于连续下降状态\n", + " merged_df['macd_diff'] = merged_df['MACD_filtered'].diff()\n", + " merged_df['descending'] = merged_df['macd_diff'] < 0\n", + "\n", + " # 使用rolling窗口计算连续下降超过2个月\n", + " merged_df['consecutive_desc'] = merged_df['descending'].rolling(window=3).sum() >= 2\n", + "\n", + " # 检查前一个月是否在连续下降,当前月是否回升\n", + " condition2 = (merged_df['consecutive_desc'].shift(1)) & \\\n", + " (merged_df['macd_diff'] > 0)\n", + "\n", + " # 筛选满足条件的月份\n", + " further_filtered = merged_df[condition1 | condition2]\n", + "\n", + " # 返回筛选出的月份的索引(日期)\n", + " return further_filtered.index.tolist()\n", + "\n", + "\n", + "# 步骤3: 在日线行情中判断峰值\n", + "def find_dayline_peaks(further_filtered_months, daily_df):\n", + " \"\"\"\n", + " 在步骤2筛选出的月份中,从下一个月开始,在日线行情中找到前两个峰值\n", + " \"\"\"\n", + " # 确保日线行情已经按日期排序\n", + " daily_df = daily_df.sort_values(by='datetime')\n", + "\n", + " # 将日线行情的索引设置为datetime\n", + " daily_df.set_index('datetime', inplace=True)\n", + "\n", + " # 初始化结果列表\n", + " result_dates = []\n", + "\n", + " for month in further_filtered_months:\n", + " # 获取下一个月的起始日期\n", + " next_month_start = month + pd.offsets.MonthBegin(1)\n", + " next_month_end = month + pd.offsets.MonthEnd(2) # 可能需要调整范围\n", + "\n", + " # 截取日线行情数据\n", + " period_df = daily_df.loc[next_month_start:next_month_end]\n", + "\n", + " # 找到收盘价的峰值\n", + " # 使用scipy的argrelextrema函数找到相对高点\n", + " peak_indices = argrelextrema(period_df['close'].values, np.greater, order=5)[0]\n", + " if len(peak_indices) >= 2:\n", + " # 获取前两个峰值\n", + " first_peak = peak_indices[0]\n", + " second_peak = peak_indices[1]\n", + "\n", + " # 比较两个峰值\n", + " if period_df['close'].iloc[second_peak] > period_df['close'].iloc[first_peak]:\n", + " result_dates.append(period_df.index[second_peak])\n", + "\n", + " return result_dates\n", + "\n", + "\n", + "# 步骤4: 输出结果\n", + "def main(daily_df):\n", + " # 步骤1: 计算月线行情和MACD\n", + " monthly_df = calculate_monthly_data(daily_df.copy())\n", + " monthly_df = calculate_monthly_macd(monthly_df)\n", + "\n", + " # 步骤1: 筛选出符合条件的月份\n", + " filtered_months = filter_monthly_macd(monthly_df)\n", + "\n", + " if filtered_months.empty:\n", + " print(\"没有满足步骤1条件的月份\")\n", + " return\n", + "\n", + " # 步骤2: 进一步筛选符合条件的月份\n", + " further_filtered_months = further_filter_months(filtered_months, monthly_df)\n", + "\n", + " if not further_filtered_months:\n", + " print(\"没有满足步骤2条件的月份\")\n", + " return\n", + "\n", + " # 步骤3: 在日线行情中查找峰值\n", + " result_dates = find_dayline_peaks(further_filtered_months, daily_df)\n", + "\n", + " # 输出结果\n", + " if result_dates:\n", + " print(\"满足条件的日期:\")\n", + " for date in result_dates:\n", + " print(date.date())\n", + " else:\n", + " print(\"没有找到符合条件的日期\")\n", + "\n", + "\n", + "main(daily_df)" + ], + "id": "46bd60b709f637a2", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "满足条件的日期:\n", + "2005-09-16\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/7h/w0cmp4zj6mn9br_6nyj310m40000gn/T/ipykernel_60768/2739124595.py:26: FutureWarning: 'M' is deprecated and will be removed in a future version, please use 'ME' instead.\n", + " monthly_df = daily_df.groupby(pd.Grouper(key='datetime', freq='M')).agg(\n" + ] + } + ], + "execution_count": 10 } ], "metadata": {