From e86ada382cc0b109335a63b6c389eccb8c577cf5 Mon Sep 17 00:00:00 2001 From: monoid Date: Mon, 6 Jun 2022 10:55:12 +0900 Subject: [PATCH] fix: ewm bug and new collector --- gen.py | 11 +- pages.py | 7 +- test.ipynb | 659 +++++++++++++++++++++++++++++++++++++++++------------ 3 files changed, 523 insertions(+), 154 deletions(-) diff --git a/gen.py b/gen.py index 9625649..c3b56cc 100644 --- a/gen.py +++ b/gen.py @@ -103,6 +103,9 @@ def collect(data: DataStore, collector: OutputCollector, corp: database.KRXCorp d60 = stock["CLOSE"].loc[::-1].rolling(window=60 ).mean().dropna().loc[::-1] + if (d60.iloc[nday+2] > d60.iloc[nday+1] and d60.iloc[nday+1] < d60.iloc[nday]): + collector.collect("60일선반등",corp, stock.index[nday]) + if (isRelativeDiffLessThan(d5, d20, 0.01, nday) and isRelativeDiffLessThan(d5, d60, 0.01, nday)): collector.collect("cross 2", corp, stock.index[nday]) @@ -133,10 +136,10 @@ def collect(data: DataStore, collector: OutputCollector, corp: database.KRXCorp if (isVolumeNTimes(stock, 5, nday)): collector.collect("volumeX5", corp, stock.index[nday]) - ewm12 = stock["CLOSE"].loc[::-1].ewm(span=12).mean().loc[::-1] - ewm26 = stock["CLOSE"].loc[::-1].ewm(span=26).mean().loc[::-1] - macd = (ewm12 - ewm26) - signal = macd.ewm(span=9).mean() + ewm5 = stock["CLOSE"].loc[::-1].ewm(span=5).mean().loc[::-1] + ewm10 = stock["CLOSE"].loc[::-1].ewm(span=10).mean().loc[::-1] + macd = (ewm5 - ewm10) + signal = macd.loc[::-1].ewm(span=4).mean().loc[::-1] if (isMACDCrossSignal(macd, signal, nday)): collector.collect("macd", corp, stock.index[nday]) diff --git a/pages.py b/pages.py index e0f630f..af5fa4d 100644 --- a/pages.py +++ b/pages.py @@ -35,6 +35,11 @@ d20d5의 조건에서 더해서 거래량이 이전 날짜보다 5배 증가한 """}, {name:"macd",desc: """\ signal과 macd가 서로 교차한 시점을 찾습니다. 즉 signal이 아래로 떨어지고 -macd가 위로 올라가는 시점을 찾습니다. +macd가 위로 올라가는 시점을 찾습니다. macd 는 5일선과 10일선으로 이루어지고 +시그널을 구하기 위한 이동 평균은 4일입니다. """}, + { + name:"60일선반등",desc: """\ +60일선이 반등하는 시점을 찾습니다.""" + } ] \ No newline at end of file diff --git a/test.ipynb b/test.ipynb index fb9b177..770b689 100644 --- a/test.ipynb +++ b/test.ipynb @@ -16,7 +16,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -25,16 +25,16 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 14, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -45,7 +45,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -54,7 +54,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -63,7 +63,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -72,16 +72,16 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ - "data = GetStockPriceFrom(db,\"155660\", 61)\n" + "data = GetStockPriceFrom(db,\"294870\", 61)\n" ] }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 28, "metadata": {}, "outputs": [], "source": [ @@ -90,7 +90,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 29, "metadata": {}, "outputs": [], "source": [ @@ -99,7 +99,7 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 30, "metadata": {}, "outputs": [], "source": [ @@ -108,7 +108,397 @@ }, { "cell_type": "code", - "execution_count": 92, + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "
CODECLOSEDIFFOPENHIGHLOWVOLUME
DATE
2022-06-0329487013700100137001380013600175508
2022-06-0229487013600250138501385013550350113
2022-05-312948701385050138501395013800276819
2022-05-3029487013800100138501395013750191087
2022-05-2729487013700150140501410013600392051
........................
2022-03-15294870162002001480016450147502701677
2022-03-142948701640020501850019250160004436719
2022-03-1129487018450100184501850018000997048
2022-03-102948701835014001745018350174001754702
2022-03-0829487016950450171001750016800878964
\n", + "

61 rows × 7 columns

\n", + "
" + ], + "text/plain": [ + " CODE CLOSE DIFF OPEN HIGH LOW VOLUME\n", + "DATE \n", + "2022-06-03 294870 13700 100 13700 13800 13600 175508\n", + "2022-06-02 294870 13600 250 13850 13850 13550 350113\n", + "2022-05-31 294870 13850 50 13850 13950 13800 276819\n", + "2022-05-30 294870 13800 100 13850 13950 13750 191087\n", + "2022-05-27 294870 13700 150 14050 14100 13600 392051\n", + "... ... ... ... ... ... ... ...\n", + "2022-03-15 294870 16200 200 14800 16450 14750 2701677\n", + "2022-03-14 294870 16400 2050 18500 19250 16000 4436719\n", + "2022-03-11 294870 18450 100 18450 18500 18000 997048\n", + "2022-03-10 294870 18350 1400 17450 18350 17400 1754702\n", + "2022-03-08 294870 16950 450 17100 17500 16800 878964\n", + "\n", + "[61 rows x 7 columns]" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "stock" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "DATE\n", + "2022-06-03 175508\n", + "2022-06-02 350113\n", + "2022-05-31 276819\n", + "2022-05-30 191087\n", + "2022-05-27 392051\n", + " ... \n", + "2022-03-15 2701677\n", + "2022-03-14 4436719\n", + "2022-03-11 997048\n", + "2022-03-10 1754702\n", + "2022-03-08 878964\n", + "Name: VOLUME, Length: 61, dtype: int64" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "volume = stock[\"VOLUME\"]\n", + "volume" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "DATE\n", + "2022-06-03 True\n", + "2022-06-02 False\n", + "2022-05-31 True\n", + "2022-05-30 True\n", + "2022-05-27 False\n", + " ... \n", + "2022-03-15 False\n", + "2022-03-14 False\n", + "2022-03-11 True\n", + "2022-03-10 True\n", + "2022-03-08 False\n", + "Name: CLOSE, Length: 61, dtype: bool" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "biggerThanYesterday = stock[\"CLOSE\"].shift(-1) < stock[\"CLOSE\"]\n", + "biggerThanYesterday" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [], + "source": [ + "ObvWeight = biggerThanYesterday.map(lambda x: 1 if x else -1)\n", + "ObvWeight" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "DATE\n", + "2022-06-03 175508\n", + "2022-06-02 -350113\n", + "2022-05-31 276819\n", + "2022-05-30 191087\n", + "2022-05-27 -392051\n", + " ... \n", + "2022-03-15 -2701677\n", + "2022-03-14 -4436719\n", + "2022-03-11 997048\n", + "2022-03-10 1754702\n", + "2022-03-08 -878964\n", + "Length: 61, dtype: int64" + ] + }, + "execution_count": 66, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "factor = volume * ObvWeight\n", + "factor" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "DATE\n", + "2022-06-03 -1804451\n", + "2022-06-02 -1979959\n", + "2022-05-31 -1629846\n", + "2022-05-30 -1906665\n", + "2022-05-27 -2097752\n", + " ... \n", + "2022-03-15 -5265610\n", + "2022-03-14 -2563933\n", + "2022-03-11 1872786\n", + "2022-03-10 875738\n", + "2022-03-08 -878964\n", + "Length: 61, dtype: int64" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "obv = factor.iloc[::-1].cumsum().iloc[::-1]\n", + "obv" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19],\n", + " [Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, '')])" + ] + }, + "execution_count": 73, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(obv.iloc[:20].iloc[::-1])\n", + "plt.xticks(rotation = 45)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, "metadata": {}, "outputs": [], "source": [ @@ -122,177 +512,148 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": 41, "metadata": {}, "outputs": [], "source": [ - "ewm12 = stock[\"CLOSE\"].loc[::-1].ewm(span=12).mean().loc[::-1]\n", - "ewm26 = stock[\"CLOSE\"].loc[::-1].ewm(span=26).mean().loc[::-1]\n", - "macd = (ewm12 - ewm26)\n", - "signal = macd.ewm(span=9).mean()" + "ewm5 = stock[\"CLOSE\"].loc[::-1].ewm(span=5).mean().loc[::-1]\n", + "ewm10 = stock[\"CLOSE\"].loc[::-1].ewm(span=10).mean().loc[::-1]\n", + "macd = (ewm5 - ewm10)\n", + "signal = macd.loc[::-1].ewm(span=4).mean().loc[::-1]" ] }, { "cell_type": "code", - "execution_count": 101, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "DATE\n", - "2022-05-20 148.895069\n", - "2022-05-19 152.584580\n", - "2022-05-18 122.762721\n", - "2022-05-17 97.031260\n", - "2022-05-16 50.671176\n", - " ... \n", - "2022-02-28 7.956286\n", - "2022-02-25 1.291958\n", - "2022-02-24 -0.770309\n", - "2022-02-23 4.262821\n", - "2022-02-22 0.000000\n", - "Name: CLOSE, Length: 61, dtype: float64" - ] - }, - "execution_count": 101, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "macd" - ] - }, - { - "cell_type": "code", - "execution_count": 105, + "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", - "execution_count": 115, + "execution_count": 48, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['2022-05-16', '2022-05-15']" - ] - }, - "execution_count": 115, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [] + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt" + ] }, { "cell_type": "code", - "execution_count": 142, + "execution_count": 51, "metadata": {}, "outputs": [ { "data": { - "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", - "
abc
0123
1456
\n", - "
" - ], "text/plain": [ - " a b c\n", - "0 1 2 3\n", - "1 4 5 6" + "([0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n", + " [Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, '')])" ] }, - "execution_count": 142, + "execution_count": 51, "metadata": {}, "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" } ], - "source": [] + "source": [ + "plt.plot(macd.iloc[0:10].iloc[::-1],label=\"macd\")\n", + "plt.legend()\n", + "plt.plot(signal.iloc[0:10].iloc[::-1],label=\"signal\")\n", + "plt.legend()\n", + "plt.xticks(rotation=45)" + ] }, { "cell_type": "code", - "execution_count": 132, + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "from gen import *" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "dataStore = DataStore()\n", + "krx_corps = dataStore.getAllKRXCorp()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "collector = OutputCollector()\n", + "prepareCollector(collector)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 2564/2564 [01:10<00:00, 36.62it/s] \n" + ] + } + ], + "source": [ + "for corp in tqdm.tqdm(krx_corps):\n", + " for nday in range(0, 5):\n", + " collect(dataStore, collector, corp, nday)\n", + " dataStore.clearCache()" + ] + }, + { + "cell_type": "code", + "execution_count": 26, "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
abc
\n", - "
" - ], "text/plain": [ - "Empty DataFrame\n", - "Columns: [a, b, c]\n", - "Index: []" + "['2022-05-27',\n", + " '2022-06-02',\n", + " '2022-05-31',\n", + " '2022-05-30',\n", + " '2021-04-14',\n", + " '2022-05-04',\n", + " '2022-01-28',\n", + " '2022-05-16',\n", + " '2021-07-05',\n", + " '2022-02-10']" ] }, - "execution_count": 132, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -302,10 +663,10 @@ ], "metadata": { "interpreter": { - "hash": "4958a03c5ef93b3c628112f436609f44fba8a7f6eb1fb9f266a15f7204ae796a" + "hash": "315ddbd22344660769d1dae43a6a5e914850a7ce75ac77a9d658327898fcf0d6" }, "kernelspec": { - "display_name": "Python 3.10.2 ('stock': venv)", + "display_name": "Python 3.9.2 ('stock': venv)", "language": "python", "name": "python3" }, @@ -319,7 +680,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.2" + "version": "3.9.2" }, "orig_nbformat": 4 },