Stock/test.ipynb

979 lines
63 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import sqlite3\n",
"from typing import Dict\n",
"from render import * \n",
"import db as database\n",
"from jinja2 import Environment, PackageLoader, select_autoescape\n",
"import pandas as pd"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import importlib"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<module 'db' from '/data/sss/f/tt/Stock/db.py'>"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"importlib.reload(database)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"db = sqlite3.connect(\"stock.db\")\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"False"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"db.in_transaction"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"krx = database.GetAllKRXCorp(db)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"krxDf = pd.DataFrame([corp.toDict() for corp in krx])"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"data = GetStockPriceFrom(db,\"212310\", 61)\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"s = pd.DataFrame(data, columns=[s for s in database.STOCK_INDEX.__members__.keys()])"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"s.set_index(\"DATE\", inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"stock = s"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>CODE</th>\n",
" <th>CLOSE</th>\n",
" <th>DIFF</th>\n",
" <th>OPEN</th>\n",
" <th>HIGH</th>\n",
" <th>LOW</th>\n",
" <th>VOLUME</th>\n",
" </tr>\n",
" <tr>\n",
" <th>DATE</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2023-06-02</th>\n",
" <td>212310</td>\n",
" <td>2375</td>\n",
" <td>75</td>\n",
" <td>2205</td>\n",
" <td>2615</td>\n",
" <td>2205</td>\n",
" <td>19</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2023-06-01</th>\n",
" <td>212310</td>\n",
" <td>2300</td>\n",
" <td>35</td>\n",
" <td>2335</td>\n",
" <td>2645</td>\n",
" <td>2215</td>\n",
" <td>16</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2023-05-31</th>\n",
" <td>212310</td>\n",
" <td>2335</td>\n",
" <td>0</td>\n",
" <td>2340</td>\n",
" <td>2340</td>\n",
" <td>2335</td>\n",
" <td>145</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2023-05-30</th>\n",
" <td>212310</td>\n",
" <td>2335</td>\n",
" <td>190</td>\n",
" <td>2275</td>\n",
" <td>2790</td>\n",
" <td>2275</td>\n",
" <td>6245</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2023-05-26</th>\n",
" <td>212310</td>\n",
" <td>2525</td>\n",
" <td>30</td>\n",
" <td>2450</td>\n",
" <td>2780</td>\n",
" <td>2420</td>\n",
" <td>658</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2023-03-13</th>\n",
" <td>212310</td>\n",
" <td>3190</td>\n",
" <td>100</td>\n",
" <td>3695</td>\n",
" <td>3695</td>\n",
" <td>2805</td>\n",
" <td>2967</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2023-03-10</th>\n",
" <td>212310</td>\n",
" <td>3290</td>\n",
" <td>15</td>\n",
" <td>3675</td>\n",
" <td>3675</td>\n",
" <td>3110</td>\n",
" <td>9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2023-03-09</th>\n",
" <td>212310</td>\n",
" <td>3275</td>\n",
" <td>205</td>\n",
" <td>3800</td>\n",
" <td>3800</td>\n",
" <td>3220</td>\n",
" <td>467</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2023-03-08</th>\n",
" <td>212310</td>\n",
" <td>3480</td>\n",
" <td>15</td>\n",
" <td>3460</td>\n",
" <td>3480</td>\n",
" <td>3460</td>\n",
" <td>289</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2023-03-07</th>\n",
" <td>212310</td>\n",
" <td>3495</td>\n",
" <td>235</td>\n",
" <td>3495</td>\n",
" <td>3500</td>\n",
" <td>3315</td>\n",
" <td>125</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>61 rows × 7 columns</p>\n",
"</div>"
],
"text/plain": [
" CODE CLOSE DIFF OPEN HIGH LOW VOLUME\n",
"DATE \n",
"2023-06-02 212310 2375 75 2205 2615 2205 19\n",
"2023-06-01 212310 2300 35 2335 2645 2215 16\n",
"2023-05-31 212310 2335 0 2340 2340 2335 145\n",
"2023-05-30 212310 2335 190 2275 2790 2275 6245\n",
"2023-05-26 212310 2525 30 2450 2780 2420 658\n",
"... ... ... ... ... ... ... ...\n",
"2023-03-13 212310 3190 100 3695 3695 2805 2967\n",
"2023-03-10 212310 3290 15 3675 3675 3110 9\n",
"2023-03-09 212310 3275 205 3800 3800 3220 467\n",
"2023-03-08 212310 3480 15 3460 3480 3460 289\n",
"2023-03-07 212310 3495 235 3495 3500 3315 125\n",
"\n",
"[61 rows x 7 columns]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"stock"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"DATE\n",
"2023-06-02 2374.0\n",
"2023-06-01 2398.0\n",
"2023-05-31 2404.0\n",
"2023-05-30 2434.0\n",
"2023-05-26 2447.0\n",
"2023-05-25 2447.0\n",
"Name: CLOSE, dtype: float64"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"close = stock[\"CLOSE\"]\n",
"d5 = stock[\"CLOSE\"].iloc[:10].loc[::-1].rolling(window=5\n",
" ).mean().dropna().loc[::-1]\n",
"d5"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"DATE\n",
"2023-06-02 88.487287\n",
"2023-06-01 103.778611\n",
"2023-05-31 97.365292\n",
"2023-05-30 93.834962\n",
"2023-05-26 80.202868\n",
"2023-05-25 80.202868\n",
"Name: CLOSE, dtype: float64"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dstd5 = close.iloc[:10].loc[::-1].rolling(window=5).std().dropna().loc[::-1]\n",
"dstd5"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"DATE\n",
"2023-06-01 2398.0\n",
"2023-05-31 2404.0\n",
"Name: CLOSE, dtype: float64"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"d5[[1,2]]"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(50.04, 0.2, 50.44, True)"
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a = 51\n",
"arr = np.array([50]* 24 + [a])\n",
"m = arr.mean()\n",
"std = arr.std(ddof=1)\n",
"m, std , m + 2*std, m+2*std < a"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"10.0"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(a-50)/5"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"59.082092668956086"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"krx.__len__() * ((100-95.4499736104)/100)*0.5"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"DATE\n",
"2023-05-22 27\n",
"2023-05-19 403\n",
"2023-05-18 1\n",
"2023-05-17 5\n",
"2023-05-16 3711\n",
" ... \n",
"2023-02-28 1017\n",
"2023-02-27 799\n",
"2023-02-24 12\n",
"2023-02-23 688\n",
"2023-02-22 4\n",
"Name: VOLUME, Length: 61, dtype: int64"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"volume = stock[\"VOLUME\"]\n",
"volume"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'2023-05-22'"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"stock.index[0]"
]
},
{
"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": 29,
"metadata": {},
"outputs": [],
"source": [
"close = stock[\"CLOSE\"]\n",
"d5 = stock[\"CLOSE\"].loc[::-1].rolling(window=5\n",
" ).mean().dropna().loc[::-1]\n",
"d10 = stock[\"CLOSE\"].loc[::-1].rolling(window=10\n",
" ).mean().dropna().loc[::-1]\n",
"d20 = stock[\"CLOSE\"].loc[::-1].rolling(window=20\n",
" ).mean().dropna().loc[::-1]\n",
"d30 = stock[\"CLOSE\"].loc[::-1].rolling(window=30\n",
" ).mean().dropna().loc[::-1]\n",
"d60 = stock[\"CLOSE\"].loc[::-1].rolling(window=60\n",
" ).mean().dropna().loc[::-1]"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"def isRelativeDiffLessThan(a:pd.Series,b:pd.Series, threshold: float,nday:int) -> bool:\n",
" return (a.iloc[nday] - b.iloc[nday]) / b.iloc[nday] < threshold"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"def every(f, xs):\n",
" for x in xs:\n",
" if not f(x):\n",
" return False\n",
" return True"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"evert\n",
"6236.0 6290 -54.0\n"
]
},
{
"data": {
"text/plain": [
"-0.008585055643879173"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a = [d5, d10, d20, d30, d60]\n",
"if every(lambda i: isRelativeDiffLessThan(i,close,0.05,0), a):\n",
" print(\"evert\")\n",
"print(d5.iloc[0] , close.iloc[0],d5.iloc[0] - close.iloc[0])\n",
"(d5.iloc[0] - close.iloc[0]) / close.iloc[0]"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"-0.1876921038685744"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(d60.iloc[0] - close.iloc[0])/close.iloc[0]"
]
},
{
"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": [
"<Figure size 432x288 with 1 Axes>"
]
},
"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": [
"d5 = stock[\"CLOSE\"].loc[::-1].rolling(window=5\n",
" ).mean().dropna().loc[::-1]\n",
"d20 = stock[\"CLOSE\"].loc[::-1].rolling(window=20\n",
" ).mean().dropna().loc[::-1]\n",
"d60 = stock[\"CLOSE\"].loc[::-1].rolling(window=60\n",
" ).mean().dropna().loc[::-1]"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [],
"source": [
"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": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"([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": 51,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"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": 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/plain": [
"['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": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": []
}
],
"metadata": {
"interpreter": {
"hash": "315ddbd22344660769d1dae43a6a5e914850a7ce75ac77a9d658327898fcf0d6"
},
"kernelspec": {
"display_name": "Python 3.9.2 ('stock': venv)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.2"
},
"orig_nbformat": 4
},
"nbformat": 4,
"nbformat_minor": 2
}