├── 1) Backtest - Multi time-frame - Nifty stocks.ipynb ├── 2) Crossover strategy in OOPs.ipynb ├── Alice Blue Api Connection ├── 1. Getting Live data Alice.ipynb ├── 2. SMA Buy sell signal - Aliceblue live data.ipynb └── account_details.py ├── Data_Analytics_works ├── .ipynb_checkpoints │ └── Tick data to Minutes OHLC data -checkpoint.ipynb └── Tick data to Minutes OHLC data .ipynb ├── Frequently used Technical_indicators.txt ├── Install Ta-Lib on Linux.txt ├── Moving_Average_Crossover strategy ├── 50-200 EMA and RSI - Signal generator.ipynb ├── 8-20 EMA strategy.ipynb └── Reliance dual moving average cross over buy and sell signal.ipynb ├── README.md └── exploratory-data-analysis-on-5-minute-data.ipynb /1) Backtest - Multi time-frame - Nifty stocks.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | " This strategy, checked with multi time frame and different indicators\n", 8 | " are used. And checked with stocks from Nifty 50\n", 9 | " Last update Dec 2021" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 1, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "import pandas as pd\n", 19 | "import numpy as np\n", 20 | "from time import sleep\n", 21 | "import datetime\n", 22 | "import talib\n", 23 | "import indicators" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "execution_count": 2, 29 | "metadata": {}, 30 | "outputs": [], 31 | "source": [ 32 | "def read_data_backetesting(path, name, time_frame, start_date, end_date):\n", 33 | " df = pd.read_csv(path+time_frame+'/'+name+'.csv')\n", 34 | " df = df.set_index(df['date'])\n", 35 | " df = df[start_date:end_date]\n", 36 | " return df\n", 37 | "\n", 38 | "def apply_indicators(df, ema_small, ema_big, ema_bigger, rsi_param, atr_param, ):\n", 39 | " df['masmall'] = talib.EMA(df['close'], timeperiod = ema_small)\n", 40 | " df['mabig'] = talib.EMA(df['close'], timeperiod = ema_big)\n", 41 | " df['mabigger'] = talib.EMA(df['close'], timeperiod = ema_bigger)\n", 42 | " df['rsi'] = talib.RSI(df['close'], timeperiod = rsi_param)\n", 43 | " df['atr'] = talib.ATR(df['high'], df['low'], df['close'], timeperiod = atr_param)\n", 44 | " df['adx'] = talib.ADX(df['high'], df['low'], df['close'])\n", 45 | " df['previous_candle_close'] = df['close'].shift(1)\n", 46 | " indicators.SuperTrend(df=df, period=7, multiplier=3, ohlc=['open', 'high', 'low', 'close'])\n", 47 | " return df\n", 48 | "\n", 49 | "def check_entry_condition(index, candle1, df3, df5, df15, dfday, rsi_bull_level, rsi_bear_level):\n", 50 | " empty_series = {'masmall':0, 'mabig':0, 'mabigger':0, 'rsi':0, 'atr':0, 'adx':0, 'previous_candle_close':0, \n", 51 | " 'STX_7_3':0, 'close':0}\n", 52 | " candle3 = pd.Series(empty_series)\n", 53 | " candle5 = pd.Series(empty_series)\n", 54 | " candle15 = pd.Series(empty_series)\n", 55 | " if (int(dtime[14:16]) % 3 == 0):\n", 56 | "# print('Checking actual 3min candle')\n", 57 | " candle3 = df3.loc[dtime]\n", 58 | "# print(candle3)\n", 59 | " if (int(dtime[14:16]) % 5 == 0):\n", 60 | " candle5 = df5.loc[dtime]\n", 61 | " if (int(dtime[14:16]) % 15 == 0):\n", 62 | " candle15 = df15.loc[dtime]\n", 63 | " \n", 64 | " # buy condition on 3 min timeframe\n", 65 | " buy_condition1 = candle3['masmall'] > candle3['mabig'] > candle3['mabigger']\n", 66 | " buy_condition2 = candle3['rsi'] > rsi_bull_level\n", 67 | " buy_condition3 = candle3['STX_7_3'] == 'up'\n", 68 | " buy_condition4 = candle3['adx'] > 25\n", 69 | "# buy_condition4 = True\n", 70 | " buy_condition5 = candle3['close'] > candle3['previous_candle_close']\n", 71 | " buy_condition6 = candle3['close'] > dfday.loc[index[:11] + '00:00:00+05:30']['yh']\n", 72 | " \n", 73 | " # buy condition on 5 min timeframe\n", 74 | " buy_condition7 = candle5['masmall'] > candle5['mabig'] > candle5['mabigger']\n", 75 | " buy_condition8 = candle5['rsi'] > rsi_bull_level\n", 76 | " buy_condition9 = candle5['STX_7_3'] == 'up'\n", 77 | " buy_condition10 = candle5['adx'] > 22.5\n", 78 | "# buy_condition10 = True\n", 79 | " buy_condition11 = candle5['close'] > candle5['previous_candle_close']\n", 80 | " buy_condition12 = candle5['close'] > dfday.loc[index[:11] + '00:00:00+05:30']['yh']\n", 81 | " \n", 82 | " # buy condition on 15 min timeframe\n", 83 | " buy_condition13 = candle15['masmall'] > candle15['mabig'] > candle15['mabigger']\n", 84 | " buy_condition14 = candle15['STX_7_3'] == 'up'\n", 85 | " buy_condition15 = candle15['adx'] > 19\n", 86 | "# buy_condition15 = True\n", 87 | " buy_condition16 = candle15['close'] > candle15['previous_candle_close']\n", 88 | " \n", 89 | " return buy_condition1, buy_condition2, buy_condition3, buy_condition4, buy_condition5, buy_condition6, buy_condition7, buy_condition8, buy_condition9, buy_condition10, buy_condition11, buy_condition12, buy_condition13, buy_condition14, buy_condition15, buy_condition16" 90 | ] 91 | }, 92 | { 93 | "cell_type": "code", 94 | "execution_count": 3, 95 | "metadata": {}, 96 | "outputs": [], 97 | "source": [ 98 | "# watchlist = ['NIFTY BANK', 'NIFTY 50']\n", 99 | "watchlist = ['ADANIPORTS', 'ASIANPAINT', 'AXISBANK', 'BAJAJ-AUTO', 'BAJAJFINSV', \n", 100 | " 'BAJFINANCE', 'BHARTIARTL', 'BPCL', 'BRITANNIA', 'CIPLA', 'COALINDIA','DIVISLAB','DRREDDY',\n", 101 | " 'GRASIM','HCLTECH','HDFC','HDFCBANK','HEROMOTOCO','HINDALCO','HINDUNILVR','ICICIBANK','INDUSINDBK',\n", 102 | " 'INFY','IOC','ITC','JSWSTEEL','KOTAKBANK','LT','M&M','MARUTI','NESTLEIND','NTPC','ONGC','POWERGRID',\n", 103 | " 'RELIANCE','SBILIFE','SBIN','SHREECEM','SUNPHARMA','TATACONSUM','TATAMOTORS','TATASTEEL','TCS',\n", 104 | " 'TECHM','TITAN','ULTRACEMCO','UPL','WIPRO']\n", 105 | "path = './Historical_saved_data/'" 106 | ] 107 | }, 108 | { 109 | "cell_type": "code", 110 | "execution_count": 4, 111 | "metadata": {}, 112 | "outputs": [], 113 | "source": [ 114 | "status = {'name':None, 'date':None, 'entry_time': None, 'entry_price': None, 'buy_sell': None, 'qty':None, \n", 115 | " 'target':None, 'sl':None, 'exit_time': None, 'exit_price':None, 'pnl':None, 'remark' : None, 'traded' : None}\n", 116 | "risk_per_trade = 1000\n", 117 | "final_results = {}\n", 118 | "tradeno = 0" 119 | ] 120 | }, 121 | { 122 | "cell_type": "code", 123 | "execution_count": 5, 124 | "metadata": {}, 125 | "outputs": [], 126 | "source": [ 127 | "# required_date = '2020-06-01 09:15:00+05:30'\n", 128 | "start_date = '2021-01-01'\n", 129 | "end_date = '2021-06-24'\n", 130 | "ema_small = 8\n", 131 | "ema_big = 20\n", 132 | "ema_bigger = 50\n", 133 | "rsi_param = 7\n", 134 | "atr_param = 7\n", 135 | "rsi_bull_level = 60\n", 136 | "rsi_bear_level = 40\n", 137 | "atr_multiplier = 0.5*2" 138 | ] 139 | }, 140 | { 141 | "cell_type": "code", 142 | "execution_count": 9, 143 | "metadata": { 144 | "scrolled": false 145 | }, 146 | "outputs": [ 147 | { 148 | "name": "stdout", 149 | "output_type": "stream", 150 | "text": [ 151 | "Backtesting for: ADANIPORTS\n", 152 | "Total Trades: 92\n", 153 | "Total SL: 42 SL trade percentage: 45.65\n", 154 | "Total P&L: 1553.71\n", 155 | "Total investment: 643527.0\n", 156 | "Profit percentage: 0.24\n", 157 | "############## ***** ##############\n", 158 | "Backtesting for: ASIANPAINT\n", 159 | "Total Trades: 54\n", 160 | "Total SL: 32 SL trade percentage: 59.26\n", 161 | "Total P&L: -6.55\n", 162 | "Total investment: 1443278.0\n", 163 | "Profit percentage: -0.0\n", 164 | "############## ***** ##############\n", 165 | "Backtesting for: AXISBANK\n", 166 | "Total Trades: 56\n", 167 | "Total SL: 26 SL trade percentage: 46.43\n", 168 | "Total P&L: 674.3\n", 169 | "Total investment: 398895.5\n", 170 | "Profit percentage: 0.17\n", 171 | "############## ***** ##############\n", 172 | "Backtesting for: BAJAJ-AUTO\n", 173 | "Total Trades: 50\n", 174 | "Total SL: 28 SL trade percentage: 56.0\n", 175 | "Total P&L: 1449.33\n", 176 | "Total investment: 1931549.0\n", 177 | "Profit percentage: 0.08\n", 178 | "############## ***** ##############\n", 179 | "Backtesting for: BAJAJFINSV\n", 180 | "Total Trades: 68\n", 181 | "Total SL: 33 SL trade percentage: 48.53\n", 182 | "Total P&L: 13615.02\n", 183 | "Total investment: 7019803.5\n", 184 | "Profit percentage: 0.19\n", 185 | "############## ***** ##############\n", 186 | "Backtesting for: BAJFINANCE\n", 187 | "Total Trades: 77\n", 188 | "Total SL: 34 SL trade percentage: 44.16\n", 189 | "Total P&L: 3798.99\n", 190 | "Total investment: 4177559.5\n", 191 | "Profit percentage: 0.09\n", 192 | "############## ***** ##############\n", 193 | "Backtesting for: BHARTIARTL\n", 194 | "Total Trades: 37\n", 195 | "Total SL: 28 SL trade percentage: 75.68\n", 196 | "Total P&L: -118.49\n", 197 | "Total investment: 206017.0\n", 198 | "Profit percentage: -0.06\n", 199 | "############## ***** ##############\n", 200 | "Backtesting for: BPCL\n", 201 | "Total Trades: 41\n", 202 | "Total SL: 23 SL trade percentage: 56.1\n", 203 | "Total P&L: 252.29\n", 204 | "Total investment: 178871.0\n", 205 | "Profit percentage: 0.14\n", 206 | "############## ***** ##############\n", 207 | "Backtesting for: BRITANNIA\n", 208 | "Total Trades: 35\n", 209 | "Total SL: 19 SL trade percentage: 54.29\n", 210 | "Total P&L: 420.9\n", 211 | "Total investment: 1240794.5\n", 212 | "Profit percentage: 0.03\n", 213 | "############## ***** ##############\n", 214 | "Backtesting for: CIPLA\n", 215 | "Total Trades: 28\n", 216 | "Total SL: 18 SL trade percentage: 64.29\n", 217 | "Total P&L: 223.23\n", 218 | "Total investment: 247764.0\n", 219 | "Profit percentage: 0.09\n", 220 | "############## ***** ##############\n" 221 | ] 222 | } 223 | ], 224 | "source": [ 225 | "for name in watchlist[:10]:\n", 226 | " status = {'name':None, 'date':None, 'entry_time': None, 'entry_price': None, 'buy_sell': None, 'qty':None, \n", 227 | " 'target':None, 'sl':None, 'exit_time': None, 'exit_price':None, 'pnl':None, 'remark' : None, 'traded' : None}\n", 228 | " total_pl = 0\n", 229 | " total_sl, profitable_trades = 0, 0\n", 230 | " total_investment = 0\n", 231 | " print('Backtesting for: ', name)\n", 232 | " \n", 233 | " # Read 1, 3, 5, 15 minutes and daily data\n", 234 | " df1 = read_data_backetesting(path, name, 'minute', start_date, end_date)\n", 235 | " df3 = read_data_backetesting(path, name, '3minute', start_date, end_date)\n", 236 | " df5 = read_data_backetesting(path, name, '5minute', start_date, end_date)\n", 237 | " df15 = read_data_backetesting(path, name, '15minute', start_date, end_date)\n", 238 | " dfday = read_data_backetesting(path, name, 'day', start_date, end_date)\n", 239 | " \n", 240 | " # apply indicators to required data \n", 241 | " df1 = apply_indicators(df1, ema_small, ema_big, ema_bigger, rsi_param, atr_param)\n", 242 | " df3 = apply_indicators(df3, ema_small, ema_big, ema_bigger, rsi_param, atr_param)\n", 243 | " df5 = apply_indicators(df5, ema_small, ema_big, ema_bigger, rsi_param, atr_param)\n", 244 | " df15 = apply_indicators(df15, ema_small, ema_big, ema_bigger, rsi_param, atr_param)\n", 245 | " dfday = apply_indicators(dfday, ema_small, ema_big, ema_bigger, rsi_param, atr_param)\n", 246 | " \n", 247 | " dfday['yh'] = dfday['high'].shift(1)\n", 248 | " dfday['yl'] = dfday['low'].shift(1)\n", 249 | " \n", 250 | " try:\n", 251 | " for dtime, candle in df1[:].iterrows():\n", 252 | " entry_values = check_entry_condition(dtime, candle, df3, df5, df15, dfday, rsi_bull_level, rsi_bear_level)\n", 253 | " bc1, bc2, bc3, bc4, bc5, bc6, bc7, bc8, bc9, bc10, bc11, bc12, bc13, bc14, bc15, bc16 = entry_values\n", 254 | "\n", 255 | " # Entry condition\n", 256 | " if bc1 and bc2 and bc3 and bc4 and bc5 and bc6 and bc7 and bc8 and bc9 and bc10 and bc11 and bc12 and bc13 and bc14 and bc15 and bc16:\n", 257 | " tradeno += 1\n", 258 | " status['name'] = name\n", 259 | " status['date'] = dtime[:10] \n", 260 | " status['entry_time'] = dtime[:16]\n", 261 | " status['entry_price'] = candle['close']\n", 262 | " status['buy_sell'] = 'buy'\n", 263 | " status['sl'] = round((candle['close'] - (atr_multiplier*candle['atr'])), 1)\n", 264 | " status['target'] = candle['close'] * 1.01\n", 265 | " status['qty'] = 10\n", 266 | " status['traded'] = 'yes'\n", 267 | " total_investment += status['entry_price'] * status['qty']\n", 268 | "# print(f\"Buy {name}, time {dtime[:16]}, price {candle['close']}\")\n", 269 | " continue\n", 270 | "\n", 271 | " # Exit condition\n", 272 | " if status['traded'] == 'yes':\n", 273 | "\n", 274 | " if (status['buy_sell'] == 'buy') and ((candle['low'] < status['sl']) or (dtime[11:16] == \"15:15\") or (candle['high'] >= status['target'])):\n", 275 | "\n", 276 | " # if target is achieved\n", 277 | " if (candle['high'] >= status['target']):\n", 278 | " status['pnl'] = round((status['target'] - status['entry_price'])*status['qty'] , 2)\n", 279 | " status['remark'] = 'buy_target'\n", 280 | " status['exit_price'] = status['target']\n", 281 | " status['exit_time'] = dtime[:16]\n", 282 | " total_pl += ((status['target'] - status['entry_price']))*status['qty']\n", 283 | "# print(f\"Sell at Target {name}, time {dtime[:16]}, price {status['target']}\")\n", 284 | "# print(f\"Profit: {round((status['target'] - status['entry_price'])*status['qty'] , 2)}\")\n", 285 | "\n", 286 | " # if sl is hit\n", 287 | " if (candle['low'] <= status['sl']):\n", 288 | " status['pnl'] = round(((status['sl'] - status['entry_price']))*status['qty'], 2)\n", 289 | " status['remark'] = 'buy_sl_hit'\n", 290 | " status['exit_price'] = status['sl']\n", 291 | " status['exit_time'] = dtime[:16]\n", 292 | " total_pl += ((status['sl'] - status['entry_price']))*status['qty']\n", 293 | "# print(f\"Sell at SL {name}, time {dtime[:16]}, price {status['sl']}\")\n", 294 | "# print('Loss: ', round(((status['sl'] - status['entry_price']))*status['qty'], 2))\n", 295 | " total_sl += 1\n", 296 | "\n", 297 | " # if no sl hit, then exit at 15:15\n", 298 | " if (dtime[11:16] == '15:15'):\n", 299 | " status['pnl'] = round(((candle['close'] - status['entry_price']))*status['qty'], 2)\n", 300 | " status['remark'] = 'market_over'\n", 301 | " status['exit_price'] = candle['close']\n", 302 | " status['exit_time'] = dtime[:16]\n", 303 | " total_pl += ((candle['close'] - status['entry_price']))*status['qty']\n", 304 | "# print(f\"Sell at Market close {name}, time {dtime[:16]}, price {candle['close']}\")\n", 305 | "# print('Profit: ', round(((candle['close'] - status['entry_price']))*status['qty'], 2))\n", 306 | "\n", 307 | " final_results[tradeno] = status\n", 308 | " status = {'name':None, 'date':None, 'entry_time': None, 'entry_price': None, 'buy_sell': None, 'qty':None, \n", 309 | " 'target':None, 'sl':None, 'exit_time': None, 'exit_price':None, 'pnl':None, 'remark' : None, 'traded' : None}\n", 310 | " \n", 311 | " except Exception as e:\n", 312 | " print('Error: ', e)\n", 313 | " \n", 314 | " print('Total Trades: ', tradeno)\n", 315 | " print('Total SL: ', total_sl, 'SL trade percentage: ', round((total_sl/tradeno)*100 , 2))\n", 316 | " print('Total P&L: ', round(total_pl, 2))\n", 317 | " print('Total investment: ', total_investment)\n", 318 | " print('Profit percentage: ', round((total_pl / total_investment) * 100, 2))\n", 319 | " \n", 320 | " # reset status\n", 321 | " status = {'name':None, 'date':None, 'entry_time': None, 'entry_price': None, 'buy_sell': None, 'qty':None, \n", 322 | "\n", 323 | " 'target':None, 'sl':None, 'exit_time': None, 'exit_price':None, 'pnl':None, 'remark' : None, 'traded' : None}\n", 324 | "\n", 325 | " pd.DataFrame(final_results).T.to_csv('./BT_results/bt3.1/'+name+'.csv', index = None)\n", 326 | " final_results = {}\n", 327 | " tradeno = 0\n", 328 | " print('############## ***** ##############')" 329 | ] 330 | }, 331 | { 332 | "cell_type": "code", 333 | "execution_count": null, 334 | "metadata": {}, 335 | "outputs": [], 336 | "source": [] 337 | }, 338 | { 339 | "cell_type": "code", 340 | "execution_count": null, 341 | "metadata": {}, 342 | "outputs": [], 343 | "source": [] 344 | }, 345 | { 346 | "cell_type": "code", 347 | "execution_count": null, 348 | "metadata": {}, 349 | "outputs": [], 350 | "source": [] 351 | }, 352 | { 353 | "cell_type": "code", 354 | "execution_count": null, 355 | "metadata": {}, 356 | "outputs": [], 357 | "source": [] 358 | }, 359 | { 360 | "cell_type": "code", 361 | "execution_count": null, 362 | "metadata": {}, 363 | "outputs": [], 364 | "source": [] 365 | }, 366 | { 367 | "cell_type": "code", 368 | "execution_count": null, 369 | "metadata": {}, 370 | "outputs": [], 371 | "source": [] 372 | }, 373 | { 374 | "cell_type": "code", 375 | "execution_count": null, 376 | "metadata": {}, 377 | "outputs": [], 378 | "source": [] 379 | }, 380 | { 381 | "cell_type": "code", 382 | "execution_count": null, 383 | "metadata": {}, 384 | "outputs": [], 385 | "source": [] 386 | } 387 | ], 388 | "metadata": { 389 | "kernelspec": { 390 | "display_name": "Python 3", 391 | "language": "python", 392 | "name": "python3" 393 | }, 394 | "language_info": { 395 | "codemirror_mode": { 396 | "name": "ipython", 397 | "version": 3 398 | }, 399 | "file_extension": ".py", 400 | "mimetype": "text/x-python", 401 | "name": "python", 402 | "nbconvert_exporter": "python", 403 | "pygments_lexer": "ipython3", 404 | "version": "3.6.9" 405 | } 406 | }, 407 | "nbformat": 4, 408 | "nbformat_minor": 4 409 | } 410 | -------------------------------------------------------------------------------- /Alice Blue Api Connection/1. Getting Live data Alice.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "from alice_blue import *\n", 10 | "import time\n", 11 | "import pandas as pd\n", 12 | "import numpy as np\n", 13 | "import datetime\n", 14 | "import account_details" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 3, 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": [ 23 | "usr_name = account_details.usr_name\n", 24 | "pwd = account_details.pwd\n", 25 | "tfa = account_details.tfa\n", 26 | "app_id = account_details.app_id\n", 27 | "api_scrt = account_details.api_scrt\n", 28 | "\n", 29 | "# redirect url = 'https://ant.aliceblueonline.com/plugin/callback'" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": 4, 35 | "metadata": {}, 36 | "outputs": [ 37 | { 38 | "name": "stdout", 39 | "output_type": "stream", 40 | "text": [ 41 | "5OoOVGxCzVavNyaDE-8nuFRo5tZAmE97CAL0pU8jiwo.T30FtUHnQOD2Uz84sDR3Vy_sLLYMMgHNhP_yrbbK3lU\n" 42 | ] 43 | } 44 | ], 45 | "source": [ 46 | "access_token = AliceBlue.login_and_get_access_token(username= usr_name, password= pwd, twoFA=tfa, \n", 47 | " api_secret=api_scrt, app_id = app_id)\n", 48 | "print(access_token)" 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": 5, 54 | "metadata": {}, 55 | "outputs": [], 56 | "source": [ 57 | "alice = AliceBlue(username=usr_name, password=pwd, access_token=access_token)" 58 | ] 59 | }, 60 | { 61 | "cell_type": "code", 62 | "execution_count": 6, 63 | "metadata": {}, 64 | "outputs": [ 65 | { 66 | "name": "stdout", 67 | "output_type": "stream", 68 | "text": [ 69 | "Available balance: 208.38\n" 70 | ] 71 | } 72 | ], 73 | "source": [ 74 | "# get balance\n", 75 | "print('Available balance: ', alice.get_balance()['data']['cash_positions'][0]['available']['cashmarginavailable'])" 76 | ] 77 | }, 78 | { 79 | "cell_type": "code", 80 | "execution_count": 6, 81 | "metadata": {}, 82 | "outputs": [], 83 | "source": [ 84 | "# df_reliance = pd.DataFrame(columns=['timestamp', 'ltp', 'volume'])\n", 85 | "# timestamp = []\n", 86 | "# ltp = []\n", 87 | "# volume = []\n", 88 | "\n", 89 | "df_reliance = pd.DataFrame(columns=['timestamp', 'ltp', 'volume'])\n", 90 | "timestamp_reliance = []\n", 91 | "ltp_reliance = []\n", 92 | "volume_reliance = []\n", 93 | "\n", 94 | "df_hdfcbank = pd.DataFrame(columns=['timestamp', 'ltp', 'volume'])\n", 95 | "timestamp_hdfcbank = []\n", 96 | "ltp_hdfcbank = []\n", 97 | "volume_hdfcbank = []" 98 | ] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "execution_count": 7, 103 | "metadata": { 104 | "scrolled": true 105 | }, 106 | "outputs": [], 107 | "source": [ 108 | "socket_opened = False\n", 109 | "# ltp = []\n", 110 | "def event_handler_quote_update(message):\n", 111 | "# print(f\"quote update {message}\")\n", 112 | "# print('time: ', datetime.datetime.fromtimestamp(message['exchange_time_stamp']).strftime('%Y-%m-%d %H:%M:%S'))\n", 113 | "# print('price: ', message['ltp'])\n", 114 | "\n", 115 | " if message['instrument'].symbol == 'RELIANCE': \n", 116 | " # save data\n", 117 | " timestamp_reliance.append(datetime.datetime.fromtimestamp(message['exchange_time_stamp']).strftime('%Y-%m-%d %H:%M:%S'))\n", 118 | " ltp_reliance.append(message['ltp'])\n", 119 | " volume_reliance.append(message['volume'])\n", 120 | " \n", 121 | "# print('Reliance data: ')\n", 122 | "# print('LTP: ', message['ltp'])\n", 123 | "# print('Volume: ', message['volume'])\n", 124 | " \n", 125 | " if message['instrument'].symbol == 'HDFCBANK': \n", 126 | " # save data\n", 127 | " timestamp_hdfcbank.append(datetime.datetime.fromtimestamp(message['exchange_time_stamp']).strftime('%Y-%m-%d %H:%M:%S'))\n", 128 | " ltp_hdfcbank.append(message['ltp'])\n", 129 | " volume_hdfcbank.append(message['volume'])\n", 130 | " \n", 131 | "# print('HDFC Bank data: ')\n", 132 | "# print('LTP: ', message['ltp'])\n", 133 | "# print('Volume: ', message['volume'])\n", 134 | "\n", 135 | " \n", 136 | "\n", 137 | "def open_callback():\n", 138 | " global socket_opened\n", 139 | " socket_opened = True\n", 140 | "\n", 141 | "alice.start_websocket(subscribe_callback=event_handler_quote_update,\n", 142 | " socket_open_callback=open_callback,\n", 143 | " run_in_background=True)\n", 144 | "while(socket_opened==False):\n", 145 | " pass\n", 146 | "\n", 147 | "# alice.subscribe(alice.get_instrument_by_symbol('NSE', 'RELIANCE'), LiveFeedType.MARKET_DATA)\n", 148 | "# alice.subscribe(alice.get_instrument_by_symbol('NSE', 'Nifty Bank'), LiveFeedType.COMPACT)\n", 149 | "# alice.subscribe(alice.get_instrument_by_symbol('NSE', 'RELIANCE'), LiveFeedType.COMPACT)\n", 150 | "instrument = [alice.get_instrument_by_symbol('NSE', 'RELIANCE'), \n", 151 | " alice.get_instrument_by_symbol('NSE', 'HDFCBANK')]\n", 152 | "\n", 153 | "alice.subscribe(instrument, LiveFeedType.MARKET_DATA)\n" 154 | ] 155 | }, 156 | { 157 | "cell_type": "code", 158 | "execution_count": 8, 159 | "metadata": { 160 | "scrolled": true 161 | }, 162 | "outputs": [], 163 | "source": [ 164 | "# while True:\n", 165 | "# if ((len(ltp) % 60) == 0):\n", 166 | "# df_reliance['timestamp'] = timestamp\n", 167 | "# df_reliance['ltp'] = ltp\n", 168 | "# df_reliance['volume'] = volume\n", 169 | "# df_reliance.to_csv('Reliance_24_march.csv', index=False)\n", 170 | "# print('Data saved')\n", 171 | "# print('Amount of data saved: ', len(ltp))" 172 | ] 173 | }, 174 | { 175 | "cell_type": "code", 176 | "execution_count": null, 177 | "metadata": { 178 | "scrolled": true 179 | }, 180 | "outputs": [ 181 | { 182 | "name": "stdout", 183 | "output_type": "stream", 184 | "text": [ 185 | "Data saved\n", 186 | "Amount of data saved: 30\n", 187 | "Data saved\n", 188 | "Amount of data saved: 30\n", 189 | "Data saved\n", 190 | "Amount of data saved: 89\n", 191 | "Data saved\n", 192 | "Amount of data saved: 90\n" 193 | ] 194 | } 195 | ], 196 | "source": [ 197 | "from time import sleep\n", 198 | "while(True):\n", 199 | " df_reliance = pd.DataFrame(columns=['timestamp', 'ltp', 'volume'])\n", 200 | " df_reliance['timestamp'] = timestamp_reliance\n", 201 | " df_reliance['ltp'] = ltp_reliance\n", 202 | " df_reliance['volume'] = volume_reliance\n", 203 | " df_reliance.to_csv('./Tick_data/Reliance_08_April.csv', index=False)\n", 204 | " print('Data saved')\n", 205 | " print('Amount of data saved: ', len(ltp_reliance))\n", 206 | " \n", 207 | " df_hdfcbank = pd.DataFrame(columns=['timestamp', 'ltp', 'volume'])\n", 208 | " df_hdfcbank['timestamp'] = timestamp_hdfcbank\n", 209 | " df_hdfcbank['ltp'] = ltp_hdfcbank\n", 210 | " df_hdfcbank['volume'] = volume_hdfcbank\n", 211 | " df_hdfcbank.to_csv('./Tick_data/Hdfcbank_08_April.csv', index = False)\n", 212 | " print('Data saved')\n", 213 | " print('Amount of data saved: ', len(ltp_hdfcbank))\n", 214 | " sleep(60)" 215 | ] 216 | }, 217 | { 218 | "cell_type": "code", 219 | "execution_count": 13, 220 | "metadata": { 221 | "scrolled": true 222 | }, 223 | "outputs": [], 224 | "source": [ 225 | "# alice.unsubscribe(alice.get_instrument_by_symbol('NSE', 'Nifty Bank'), LiveFeedType.MARKET_DATA)" 226 | ] 227 | }, 228 | { 229 | "cell_type": "code", 230 | "execution_count": 14, 231 | "metadata": {}, 232 | "outputs": [], 233 | "source": [ 234 | "# alice.subscribe([alice.get_instrument_by_symbol('NSE', 'TATASTEEL'), alice.get_instrument_by_symbol('NSE', 'RELIANCE')], LiveFeedType.MARKET_DATA)" 235 | ] 236 | }, 237 | { 238 | "cell_type": "code", 239 | "execution_count": null, 240 | "metadata": {}, 241 | "outputs": [], 242 | "source": [] 243 | }, 244 | { 245 | "cell_type": "code", 246 | "execution_count": null, 247 | "metadata": {}, 248 | "outputs": [], 249 | "source": [] 250 | }, 251 | { 252 | "cell_type": "code", 253 | "execution_count": null, 254 | "metadata": {}, 255 | "outputs": [], 256 | "source": [] 257 | }, 258 | { 259 | "cell_type": "code", 260 | "execution_count": null, 261 | "metadata": {}, 262 | "outputs": [], 263 | "source": [] 264 | } 265 | ], 266 | "metadata": { 267 | "kernelspec": { 268 | "display_name": "Python 3", 269 | "language": "python", 270 | "name": "python3" 271 | }, 272 | "language_info": { 273 | "codemirror_mode": { 274 | "name": "ipython", 275 | "version": 3 276 | }, 277 | "file_extension": ".py", 278 | "mimetype": "text/x-python", 279 | "name": "python", 280 | "nbconvert_exporter": "python", 281 | "pygments_lexer": "ipython3", 282 | "version": "3.6.9" 283 | } 284 | }, 285 | "nbformat": 4, 286 | "nbformat_minor": 2 287 | } 288 | -------------------------------------------------------------------------------- /Alice Blue Api Connection/2. SMA Buy sell signal - Aliceblue live data.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | " For Infosys, Live buy sell signals generated \n", 8 | " based on 5-20 SMA cross-over" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | " My respect towrds - krishnavelu@aliceblue - for this program and\n", 16 | " implementing aliceblue library in a very simple manner. \n", 17 | " \n", 18 | " And special thanks to Aliceblue, for providing this API in free of cost. " 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": 1, 24 | "metadata": {}, 25 | "outputs": [], 26 | "source": [ 27 | "# importing packages \n", 28 | "import logging\n", 29 | "import datetime\n", 30 | "import statistics\n", 31 | "from time import sleep\n", 32 | "import account_details # this contains username, password, api details\n", 33 | "from alice_blue import *" 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": null, 39 | "metadata": {}, 40 | "outputs": [], 41 | "source": [ 42 | "# Config - Username, password, API details loaded from account_details file\n", 43 | "username = account_details.usr_name\n", 44 | "password = account_details.pwd\n", 45 | "app_id = account_details.app_id\n", 46 | "api_secret = account_details.api_scrt\n", 47 | "twoFA = account_details.tfa\n", 48 | "EMA_CROSS_SCRIP = 'INFY'\n", 49 | "logging.basicConfig(level=logging.DEBUG) # Optional for getting debug messages.\n", 50 | "# Config" 51 | ] 52 | }, 53 | { 54 | "cell_type": "code", 55 | "execution_count": null, 56 | "metadata": {}, 57 | "outputs": [], 58 | "source": [ 59 | "ltp = 0\n", 60 | "socket_opened = False\n", 61 | "alice = None\n", 62 | "def event_handler_quote_update(message):\n", 63 | " global ltp\n", 64 | " ltp = message['ltp']" 65 | ] 66 | }, 67 | { 68 | "cell_type": "code", 69 | "execution_count": null, 70 | "metadata": {}, 71 | "outputs": [], 72 | "source": [ 73 | "def open_callback():\n", 74 | " global socket_opened\n", 75 | " socket_opened = True" 76 | ] 77 | }, 78 | { 79 | "cell_type": "code", 80 | "execution_count": null, 81 | "metadata": {}, 82 | "outputs": [], 83 | "source": [ 84 | "# Buy order \n", 85 | "def buy_signal(ins_scrip):\n", 86 | " global alice\n", 87 | " alice.place_order(transaction_type = TransactionType.Buy,\n", 88 | " instrument = ins_scrip,\n", 89 | " quantity = 1,\n", 90 | " order_type = OrderType.Market,\n", 91 | " product_type = ProductType.Intraday,\n", 92 | " price = 0.0,\n", 93 | " trigger_price = None,\n", 94 | " stop_loss = None,\n", 95 | " square_off = None,\n", 96 | " trailing_sl = None,\n", 97 | " is_amo = False)" 98 | ] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "execution_count": null, 103 | "metadata": {}, 104 | "outputs": [], 105 | "source": [ 106 | "# Sell order\n", 107 | "def sell_signal(ins_scrip):\n", 108 | " global alice\n", 109 | " alice.place_order(transaction_type = TransactionType.Sell,\n", 110 | " instrument = ins_scrip,\n", 111 | " quantity = 1,\n", 112 | " order_type = OrderType.Market,\n", 113 | " product_type = ProductType.Intraday,\n", 114 | " price = 0.0,\n", 115 | " trigger_price = None,\n", 116 | " stop_loss = None,\n", 117 | " square_off = None,\n", 118 | " trailing_sl = None,\n", 119 | " is_amo = False)" 120 | ] 121 | }, 122 | { 123 | "cell_type": "code", 124 | "execution_count": null, 125 | "metadata": {}, 126 | "outputs": [], 127 | "source": [ 128 | "def main():\n", 129 | " global socket_opened\n", 130 | " global alice\n", 131 | " global username\n", 132 | " global password\n", 133 | " global twoFA\n", 134 | " global api_secret\n", 135 | " global EMA_CROSS_SCRIP\n", 136 | " \n", 137 | " minute_close = []\n", 138 | " \n", 139 | " # Access token is fetched from aliceblue\n", 140 | " access_token = AliceBlue.login_and_get_access_token(username=username, password=password, twoFA=twoFA, \n", 141 | " api_secret=api_secret, app_id = app_id)\n", 142 | " # alice object is created\n", 143 | " alice = AliceBlue(username=username, password=password, access_token=access_token, \n", 144 | " master_contracts_to_download=['NSE'])\n", 145 | " \n", 146 | " \n", 147 | " print('User Profile: ', alice.get_profile()) # get profile\n", 148 | " print('User Balance: ', alice.get_balance()) # get balance / margin limits\n", 149 | " # print(alice.get_daywise_positions()) # get daywise positions\n", 150 | " # print(alice.get_netwise_positions()) # get netwise positions\n", 151 | " # print(alice.get_holding_positions()) # get holding positions\n", 152 | " \n", 153 | " ins_scrip = alice.get_instrument_by_symbol('NSE', EMA_CROSS_SCRIP)\n", 154 | " \n", 155 | " # Open the socket\n", 156 | " socket_opened = False\n", 157 | " alice.start_websocket(subscribe_callback=event_handler_quote_update,\n", 158 | " socket_open_callback=open_callback,\n", 159 | " run_in_background=True)\n", 160 | " \n", 161 | " while(socket_opened==False): # wait till socket open & then subscribe\n", 162 | " pass\n", 163 | " alice.subscribe(ins_scrip, LiveFeedType.COMPACT) # instrument is subscribed\n", 164 | " \n", 165 | " # Each minute data is recorded here.\n", 166 | " # Logic for buy - if SMA5 > SMA20\n", 167 | " # Logic for Sell - if SMA20 > SMA5\n", 168 | " # Sleep() is used program will not letgo in between\n", 169 | " current_signal = ''\n", 170 | " while True:\n", 171 | " if(datetime.datetime.now().second == 0): # recorded data in each minute\n", 172 | " minute_close.append(ltp)\n", 173 | " print('Minute data: ', ltp)\n", 174 | " if(len(minute_close) > 20):\n", 175 | " sma_5 = statistics.mean(minute_close[-5:])\n", 176 | " sma_20 = statistics.mean(minute_close[-20:])\n", 177 | " if(current_signal != 'buy'):\n", 178 | " # if(sma_5 > sma_20):\n", 179 | " # buy_signal(ins_scrip)\n", 180 | " current_signal = 'buy'\n", 181 | " print('Buy')\n", 182 | " if(current_signal != 'sell'):\n", 183 | " # if(sma_5 < sma_20):\n", 184 | " # sell_signal(ins_scrip)\n", 185 | " current_signal = 'sell'\n", 186 | " print('Sell')\n", 187 | " sleep(1)\n", 188 | " sleep(0.2) # sleep for 200ms" 189 | ] 190 | }, 191 | { 192 | "cell_type": "code", 193 | "execution_count": null, 194 | "metadata": {}, 195 | "outputs": [], 196 | "source": [ 197 | "if(__name__ == '__main__'):\n", 198 | " main()" 199 | ] 200 | }, 201 | { 202 | "cell_type": "code", 203 | "execution_count": null, 204 | "metadata": {}, 205 | "outputs": [], 206 | "source": [] 207 | }, 208 | { 209 | "cell_type": "code", 210 | "execution_count": null, 211 | "metadata": {}, 212 | "outputs": [], 213 | "source": [] 214 | }, 215 | { 216 | "cell_type": "code", 217 | "execution_count": null, 218 | "metadata": {}, 219 | "outputs": [], 220 | "source": [] 221 | }, 222 | { 223 | "cell_type": "code", 224 | "execution_count": null, 225 | "metadata": {}, 226 | "outputs": [], 227 | "source": [] 228 | }, 229 | { 230 | "cell_type": "code", 231 | "execution_count": null, 232 | "metadata": {}, 233 | "outputs": [], 234 | "source": [] 235 | }, 236 | { 237 | "cell_type": "code", 238 | "execution_count": null, 239 | "metadata": {}, 240 | "outputs": [], 241 | "source": [] 242 | } 243 | ], 244 | "metadata": { 245 | "kernelspec": { 246 | "display_name": "Python 3", 247 | "language": "python", 248 | "name": "python3" 249 | }, 250 | "language_info": { 251 | "codemirror_mode": { 252 | "name": "ipython", 253 | "version": 3 254 | }, 255 | "file_extension": ".py", 256 | "mimetype": "text/x-python", 257 | "name": "python", 258 | "nbconvert_exporter": "python", 259 | "pygments_lexer": "ipython3", 260 | "version": "3.6.9" 261 | } 262 | }, 263 | "nbformat": 4, 264 | "nbformat_minor": 2 265 | } 266 | -------------------------------------------------------------------------------- /Alice Blue Api Connection/account_details.py: -------------------------------------------------------------------------------- 1 | usr_name = 'your_aliceblue_username' 2 | pwd = 'your_aliceblue_password' 3 | tfa = 'your_two_fector_authentication@aliceblue' 4 | app_id = 'your_appid' 5 | api_scrt = 'your_api_secret_generated_at_creation_of_app_at_aliceblue' 6 | 7 | # redirect url = 'https://ant.aliceblueonline.com/plugin/callback' 8 | -------------------------------------------------------------------------------- /Data_Analytics_works/.ipynb_checkpoints/Tick data to Minutes OHLC data -checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | " Here seconds tick data is converted to per minute OHLC" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 125, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "import pandas as pd\n", 17 | "import numpy as np\n", 18 | "from datetime import date" 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": 126, 24 | "metadata": { 25 | "scrolled": true 26 | }, 27 | "outputs": [ 28 | { 29 | "data": { 30 | "text/html": [ 31 | "
\n", 32 | "\n", 45 | "\n", 46 | " \n", 47 | " \n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | "
timestampltpvolume
02021-03-26 09:15:4914487.700
12021-03-26 09:15:5014489.600
22021-03-26 09:15:5114490.350
32021-03-26 09:15:5214492.200
42021-03-26 09:15:5314493.950
\n", 87 | "
" 88 | ], 89 | "text/plain": [ 90 | " timestamp ltp volume\n", 91 | "0 2021-03-26 09:15:49 14487.70 0\n", 92 | "1 2021-03-26 09:15:50 14489.60 0\n", 93 | "2 2021-03-26 09:15:51 14490.35 0\n", 94 | "3 2021-03-26 09:15:52 14492.20 0\n", 95 | "4 2021-03-26 09:15:53 14493.95 0" 96 | ] 97 | }, 98 | "execution_count": 126, 99 | "metadata": {}, 100 | "output_type": "execute_result" 101 | } 102 | ], 103 | "source": [ 104 | "# Here I have kept tick data in the dataframe\n", 105 | "path = '/home/debashis/Data/Finance_Data/Live_data_work/scripts/Tick_data3/'\n", 106 | "df_nifty_bank = pd.read_csv(path+'Nifty_26_march.csv', low_memory=False)\n", 107 | "df_nifty_bank.head()" 108 | ] 109 | }, 110 | { 111 | "cell_type": "code", 112 | "execution_count": 127, 113 | "metadata": {}, 114 | "outputs": [ 115 | { 116 | "data": { 117 | "text/html": [ 118 | "
\n", 119 | "\n", 132 | "\n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | "
timestampltpvolume
02021-03-26 09:15:4914487.700
12021-03-26 09:15:5014489.600
22021-03-26 09:15:5114490.350
32021-03-26 09:15:5214492.200
42021-03-26 09:15:5314493.950
\n", 174 | "
" 175 | ], 176 | "text/plain": [ 177 | " timestamp ltp volume\n", 178 | "0 2021-03-26 09:15:49 14487.70 0\n", 179 | "1 2021-03-26 09:15:50 14489.60 0\n", 180 | "2 2021-03-26 09:15:51 14490.35 0\n", 181 | "3 2021-03-26 09:15:52 14492.20 0\n", 182 | "4 2021-03-26 09:15:53 14493.95 0" 183 | ] 184 | }, 185 | "execution_count": 127, 186 | "metadata": {}, 187 | "output_type": "execute_result" 188 | } 189 | ], 190 | "source": [ 191 | "# timestamp is treated as date_time here\n", 192 | "df_nifty_bank['timestamp'] = pd.to_datetime(df_nifty_bank['timestamp'])\n", 193 | "df_nifty_bank.head()" 194 | ] 195 | }, 196 | { 197 | "cell_type": "code", 198 | "execution_count": 128, 199 | "metadata": {}, 200 | "outputs": [], 201 | "source": [ 202 | "# df_nifty_bank.timestamp.values[0]" 203 | ] 204 | }, 205 | { 206 | "cell_type": "markdown", 207 | "metadata": {}, 208 | "source": [ 209 | " Task:\n", 210 | " - Present data in each seconds\n", 211 | " - Generate OHLC for each minute\n", 212 | " " 213 | ] 214 | }, 215 | { 216 | "cell_type": "code", 217 | "execution_count": 129, 218 | "metadata": {}, 219 | "outputs": [ 220 | { 221 | "name": "stdout", 222 | "output_type": "stream", 223 | "text": [ 224 | "Today date is: 2021-03-26\n" 225 | ] 226 | } 227 | ], 228 | "source": [ 229 | "# Returns the current local date\n", 230 | "# today = date.today()\n", 231 | "today = '2021-03-26'\n", 232 | "print(\"Today date is: \", today)" 233 | ] 234 | }, 235 | { 236 | "cell_type": "code", 237 | "execution_count": 130, 238 | "metadata": {}, 239 | "outputs": [ 240 | { 241 | "name": "stdout", 242 | "output_type": "stream", 243 | "text": [ 244 | "Start time: 2021-03-26 09:15:00, End time: 2021-03-26 15:29:00\n" 245 | ] 246 | } 247 | ], 248 | "source": [ 249 | "start_time = str(today)+' 09:15:00'\n", 250 | "end_time = str(today)+' 15:29:00'\n", 251 | "print('Start time: {0}, End time: {1}'.format(start_time, end_time))" 252 | ] 253 | }, 254 | { 255 | "cell_type": "code", 256 | "execution_count": 131, 257 | "metadata": {}, 258 | "outputs": [ 259 | { 260 | "name": "stdout", 261 | "output_type": "stream", 262 | "text": [ 263 | "Length of Minutes data: 375\n" 264 | ] 265 | } 266 | ], 267 | "source": [ 268 | "# create minute-wise timestamp\n", 269 | "time_bin_1_min = pd.date_range(start=start_time, end = end_time, freq='1min')\n", 270 | "print('Length of Minutes data: ', len(time_bin_1_min))" 271 | ] 272 | }, 273 | { 274 | "cell_type": "code", 275 | "execution_count": 132, 276 | "metadata": {}, 277 | "outputs": [], 278 | "source": [ 279 | "# Create the data frame\n", 280 | "required_columns = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume']\n", 281 | "df_minute_data = pd.DataFrame(columns=required_columns)\n", 282 | "df_minute_data.head()\n", 283 | "\n", 284 | "# Create empty lists to store data\n", 285 | "date, open_, high, low, close, volume = [], [], [], [], [], []\n", 286 | "\n", 287 | "for x in range(len(time_bin_1_min)-1):\n", 288 | " # Collect all LTP data for this minute\n", 289 | " start_minute = time_bin_1_min[x]\n", 290 | " end_minute = time_bin_1_min[x+1]\n", 291 | "# print('Time Range: {0} to {1}'.format(start_minute, end_minute))\n", 292 | " \n", 293 | " # Create the mask\n", 294 | " mask = ((df_nifty_bank['timestamp'] >= start_minute) & (df_nifty_bank['timestamp'] < end_minute))\n", 295 | " \n", 296 | " df_temp = df_nifty_bank.loc[mask]\n", 297 | " temp_open = df_temp.ltp.values[0]\n", 298 | " temp_low = min(df_temp.ltp.values)\n", 299 | " temp_high = max(df_temp.ltp.values)\n", 300 | " temp_close = df_temp.ltp.values[-1]\n", 301 | " temp_volume = np.mean(df_temp.volume.values)\n", 302 | "# print('Open, High, Low, Close: ', temp_open, temp_high, temp_low, temp_close)\n", 303 | " date.append(start_minute)\n", 304 | " open_.append(temp_open)\n", 305 | " high.append(temp_high)\n", 306 | " low.append(temp_low)\n", 307 | " close.append(temp_close)\n", 308 | " volume.append(temp_volume)\n", 309 | " \n", 310 | "df_minute_data.Date = date\n", 311 | "df_minute_data.Open = open_\n", 312 | "df_minute_data.High = high\n", 313 | "df_minute_data.Low = low\n", 314 | "df_minute_data.Close = close\n", 315 | "df_minute_data.Volume = volume" 316 | ] 317 | }, 318 | { 319 | "cell_type": "code", 320 | "execution_count": 133, 321 | "metadata": {}, 322 | "outputs": [ 323 | { 324 | "data": { 325 | "text/html": [ 326 | "
\n", 327 | "\n", 340 | "\n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | "
OpenHighLowCloseVolume
count374.000000374.00000374.000000374.000000374.0
mean14508.46497314513.2576214503.90414414508.3752670.0
std33.37109232.4781833.68772733.2043020.0
min14419.85000014426.5500014415.35000014420.1500000.0
25%14482.61250014486.0250014478.57500014482.6375000.0
50%14518.72500014523.0750014514.60000014517.7750000.0
75%14534.98750014538.4375014529.97500014535.0000000.0
max14566.55000014572.6500014562.95000014567.2000000.0
\n", 418 | "
" 419 | ], 420 | "text/plain": [ 421 | " Open High Low Close Volume\n", 422 | "count 374.000000 374.00000 374.000000 374.000000 374.0\n", 423 | "mean 14508.464973 14513.25762 14503.904144 14508.375267 0.0\n", 424 | "std 33.371092 32.47818 33.687727 33.204302 0.0\n", 425 | "min 14419.850000 14426.55000 14415.350000 14420.150000 0.0\n", 426 | "25% 14482.612500 14486.02500 14478.575000 14482.637500 0.0\n", 427 | "50% 14518.725000 14523.07500 14514.600000 14517.775000 0.0\n", 428 | "75% 14534.987500 14538.43750 14529.975000 14535.000000 0.0\n", 429 | "max 14566.550000 14572.65000 14562.950000 14567.200000 0.0" 430 | ] 431 | }, 432 | "execution_count": 133, 433 | "metadata": {}, 434 | "output_type": "execute_result" 435 | } 436 | ], 437 | "source": [ 438 | "df_minute_data.describe()" 439 | ] 440 | }, 441 | { 442 | "cell_type": "code", 443 | "execution_count": 134, 444 | "metadata": {}, 445 | "outputs": [ 446 | { 447 | "data": { 448 | "text/html": [ 449 | "
\n", 450 | "\n", 463 | "\n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | "
DateOpenHighLowCloseVolume
02021-03-26 09:15:0014487.7014496.214487.7014493.250.0
12021-03-26 09:16:0014494.1014494.114461.2514468.900.0
22021-03-26 09:17:0014468.4014474.714458.6514464.300.0
32021-03-26 09:18:0014464.6014487.714464.6014482.750.0
42021-03-26 09:19:0014481.2514483.214461.4514462.550.0
\n", 523 | "
" 524 | ], 525 | "text/plain": [ 526 | " Date Open High Low Close Volume\n", 527 | "0 2021-03-26 09:15:00 14487.70 14496.2 14487.70 14493.25 0.0\n", 528 | "1 2021-03-26 09:16:00 14494.10 14494.1 14461.25 14468.90 0.0\n", 529 | "2 2021-03-26 09:17:00 14468.40 14474.7 14458.65 14464.30 0.0\n", 530 | "3 2021-03-26 09:18:00 14464.60 14487.7 14464.60 14482.75 0.0\n", 531 | "4 2021-03-26 09:19:00 14481.25 14483.2 14461.45 14462.55 0.0" 532 | ] 533 | }, 534 | "execution_count": 134, 535 | "metadata": {}, 536 | "output_type": "execute_result" 537 | } 538 | ], 539 | "source": [ 540 | "df_minute_data.head()" 541 | ] 542 | }, 543 | { 544 | "cell_type": "code", 545 | "execution_count": 135, 546 | "metadata": {}, 547 | "outputs": [ 548 | { 549 | "data": { 550 | "text/html": [ 551 | "
\n", 552 | "\n", 565 | "\n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | " \n", 595 | " \n", 596 | " \n", 597 | " \n", 598 | " \n", 599 | " \n", 600 | " \n", 601 | " \n", 602 | " \n", 603 | " \n", 604 | " \n", 605 | " \n", 606 | " \n", 607 | " \n", 608 | " \n", 609 | " \n", 610 | " \n", 611 | " \n", 612 | " \n", 613 | " \n", 614 | " \n", 615 | " \n", 616 | " \n", 617 | " \n", 618 | " \n", 619 | " \n", 620 | " \n", 621 | " \n", 622 | " \n", 623 | " \n", 624 | "
DateOpenHighLowCloseVolume
3692021-03-26 15:24:0014524.4514530.5514520.4014522.650.0
3702021-03-26 15:25:0014523.0014528.1014520.7514528.100.0
3712021-03-26 15:26:0014528.3514537.3014526.9014530.350.0
3722021-03-26 15:27:0014532.5014532.8514526.5014528.100.0
3732021-03-26 15:28:0014528.7014530.0514522.7014524.450.0
\n", 625 | "
" 626 | ], 627 | "text/plain": [ 628 | " Date Open High Low Close Volume\n", 629 | "369 2021-03-26 15:24:00 14524.45 14530.55 14520.40 14522.65 0.0\n", 630 | "370 2021-03-26 15:25:00 14523.00 14528.10 14520.75 14528.10 0.0\n", 631 | "371 2021-03-26 15:26:00 14528.35 14537.30 14526.90 14530.35 0.0\n", 632 | "372 2021-03-26 15:27:00 14532.50 14532.85 14526.50 14528.10 0.0\n", 633 | "373 2021-03-26 15:28:00 14528.70 14530.05 14522.70 14524.45 0.0" 634 | ] 635 | }, 636 | "execution_count": 135, 637 | "metadata": {}, 638 | "output_type": "execute_result" 639 | } 640 | ], 641 | "source": [ 642 | "df_minute_data.tail()" 643 | ] 644 | }, 645 | { 646 | "cell_type": "code", 647 | "execution_count": 137, 648 | "metadata": {}, 649 | "outputs": [], 650 | "source": [ 651 | "# Save per minute data to disk\n", 652 | "\n", 653 | "# df_minute_data.to_csv('/home/debashis/Data/Finance_Data/Live_data_work/Minutes_data/'+str(today)+'_per_minutes_NIFTY_.csv',\n", 654 | "# index=False)" 655 | ] 656 | }, 657 | { 658 | "cell_type": "code", 659 | "execution_count": null, 660 | "metadata": {}, 661 | "outputs": [], 662 | "source": [] 663 | }, 664 | { 665 | "cell_type": "code", 666 | "execution_count": null, 667 | "metadata": {}, 668 | "outputs": [], 669 | "source": [] 670 | } 671 | ], 672 | "metadata": { 673 | "kernelspec": { 674 | "display_name": "Python 3", 675 | "language": "python", 676 | "name": "python3" 677 | }, 678 | "language_info": { 679 | "codemirror_mode": { 680 | "name": "ipython", 681 | "version": 3 682 | }, 683 | "file_extension": ".py", 684 | "mimetype": "text/x-python", 685 | "name": "python", 686 | "nbconvert_exporter": "python", 687 | "pygments_lexer": "ipython3", 688 | "version": "3.6.9" 689 | } 690 | }, 691 | "nbformat": 4, 692 | "nbformat_minor": 2 693 | } 694 | -------------------------------------------------------------------------------- /Data_Analytics_works/Tick data to Minutes OHLC data .ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | " Here seconds tick data is converted to per minute OHLC" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 125, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "import pandas as pd\n", 17 | "import numpy as np\n", 18 | "from datetime import date" 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": 126, 24 | "metadata": { 25 | "scrolled": true 26 | }, 27 | "outputs": [ 28 | { 29 | "data": { 30 | "text/html": [ 31 | "
\n", 32 | "\n", 45 | "\n", 46 | " \n", 47 | " \n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | "
timestampltpvolume
02021-03-26 09:15:4914487.700
12021-03-26 09:15:5014489.600
22021-03-26 09:15:5114490.350
32021-03-26 09:15:5214492.200
42021-03-26 09:15:5314493.950
\n", 87 | "
" 88 | ], 89 | "text/plain": [ 90 | " timestamp ltp volume\n", 91 | "0 2021-03-26 09:15:49 14487.70 0\n", 92 | "1 2021-03-26 09:15:50 14489.60 0\n", 93 | "2 2021-03-26 09:15:51 14490.35 0\n", 94 | "3 2021-03-26 09:15:52 14492.20 0\n", 95 | "4 2021-03-26 09:15:53 14493.95 0" 96 | ] 97 | }, 98 | "execution_count": 126, 99 | "metadata": {}, 100 | "output_type": "execute_result" 101 | } 102 | ], 103 | "source": [ 104 | "# Here I have kept tick data in the dataframe\n", 105 | "path = '/home/debashis/Data/Finance_Data/Live_data_work/scripts/Tick_data3/'\n", 106 | "df_nifty_bank = pd.read_csv(path+'Nifty_26_march.csv', low_memory=False)\n", 107 | "df_nifty_bank.head()" 108 | ] 109 | }, 110 | { 111 | "cell_type": "code", 112 | "execution_count": 127, 113 | "metadata": {}, 114 | "outputs": [ 115 | { 116 | "data": { 117 | "text/html": [ 118 | "
\n", 119 | "\n", 132 | "\n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | "
timestampltpvolume
02021-03-26 09:15:4914487.700
12021-03-26 09:15:5014489.600
22021-03-26 09:15:5114490.350
32021-03-26 09:15:5214492.200
42021-03-26 09:15:5314493.950
\n", 174 | "
" 175 | ], 176 | "text/plain": [ 177 | " timestamp ltp volume\n", 178 | "0 2021-03-26 09:15:49 14487.70 0\n", 179 | "1 2021-03-26 09:15:50 14489.60 0\n", 180 | "2 2021-03-26 09:15:51 14490.35 0\n", 181 | "3 2021-03-26 09:15:52 14492.20 0\n", 182 | "4 2021-03-26 09:15:53 14493.95 0" 183 | ] 184 | }, 185 | "execution_count": 127, 186 | "metadata": {}, 187 | "output_type": "execute_result" 188 | } 189 | ], 190 | "source": [ 191 | "# timestamp is treated as date_time here\n", 192 | "df_nifty_bank['timestamp'] = pd.to_datetime(df_nifty_bank['timestamp'])\n", 193 | "df_nifty_bank.head()" 194 | ] 195 | }, 196 | { 197 | "cell_type": "code", 198 | "execution_count": 128, 199 | "metadata": {}, 200 | "outputs": [], 201 | "source": [ 202 | "# df_nifty_bank.timestamp.values[0]" 203 | ] 204 | }, 205 | { 206 | "cell_type": "markdown", 207 | "metadata": {}, 208 | "source": [ 209 | " Task:\n", 210 | " - Present data in each seconds\n", 211 | " - Generate OHLC for each minute\n", 212 | " " 213 | ] 214 | }, 215 | { 216 | "cell_type": "code", 217 | "execution_count": 129, 218 | "metadata": {}, 219 | "outputs": [ 220 | { 221 | "name": "stdout", 222 | "output_type": "stream", 223 | "text": [ 224 | "Today date is: 2021-03-26\n" 225 | ] 226 | } 227 | ], 228 | "source": [ 229 | "# Returns the current local date\n", 230 | "# today = date.today()\n", 231 | "today = '2021-03-26'\n", 232 | "print(\"Today date is: \", today)" 233 | ] 234 | }, 235 | { 236 | "cell_type": "code", 237 | "execution_count": 130, 238 | "metadata": {}, 239 | "outputs": [ 240 | { 241 | "name": "stdout", 242 | "output_type": "stream", 243 | "text": [ 244 | "Start time: 2021-03-26 09:15:00, End time: 2021-03-26 15:29:00\n" 245 | ] 246 | } 247 | ], 248 | "source": [ 249 | "start_time = str(today)+' 09:15:00'\n", 250 | "end_time = str(today)+' 15:29:00'\n", 251 | "print('Start time: {0}, End time: {1}'.format(start_time, end_time))" 252 | ] 253 | }, 254 | { 255 | "cell_type": "code", 256 | "execution_count": 131, 257 | "metadata": {}, 258 | "outputs": [ 259 | { 260 | "name": "stdout", 261 | "output_type": "stream", 262 | "text": [ 263 | "Length of Minutes data: 375\n" 264 | ] 265 | } 266 | ], 267 | "source": [ 268 | "# create minute-wise timestamp\n", 269 | "time_bin_1_min = pd.date_range(start=start_time, end = end_time, freq='1min')\n", 270 | "print('Length of Minutes data: ', len(time_bin_1_min))" 271 | ] 272 | }, 273 | { 274 | "cell_type": "code", 275 | "execution_count": 132, 276 | "metadata": {}, 277 | "outputs": [], 278 | "source": [ 279 | "# Create the data frame\n", 280 | "required_columns = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume']\n", 281 | "df_minute_data = pd.DataFrame(columns=required_columns)\n", 282 | "df_minute_data.head()\n", 283 | "\n", 284 | "# Create empty lists to store data\n", 285 | "date, open_, high, low, close, volume = [], [], [], [], [], []\n", 286 | "\n", 287 | "for x in range(len(time_bin_1_min)-1):\n", 288 | " # Collect all LTP data for this minute\n", 289 | " start_minute = time_bin_1_min[x]\n", 290 | " end_minute = time_bin_1_min[x+1]\n", 291 | "# print('Time Range: {0} to {1}'.format(start_minute, end_minute))\n", 292 | " \n", 293 | " # Create the mask\n", 294 | " mask = ((df_nifty_bank['timestamp'] >= start_minute) & (df_nifty_bank['timestamp'] < end_minute))\n", 295 | " \n", 296 | " df_temp = df_nifty_bank.loc[mask]\n", 297 | " temp_open = df_temp.ltp.values[0]\n", 298 | " temp_low = min(df_temp.ltp.values)\n", 299 | " temp_high = max(df_temp.ltp.values)\n", 300 | " temp_close = df_temp.ltp.values[-1]\n", 301 | " temp_volume = np.mean(df_temp.volume.values)\n", 302 | "# print('Open, High, Low, Close: ', temp_open, temp_high, temp_low, temp_close)\n", 303 | " date.append(start_minute)\n", 304 | " open_.append(temp_open)\n", 305 | " high.append(temp_high)\n", 306 | " low.append(temp_low)\n", 307 | " close.append(temp_close)\n", 308 | " volume.append(temp_volume)\n", 309 | " \n", 310 | "df_minute_data.Date = date\n", 311 | "df_minute_data.Open = open_\n", 312 | "df_minute_data.High = high\n", 313 | "df_minute_data.Low = low\n", 314 | "df_minute_data.Close = close\n", 315 | "df_minute_data.Volume = volume" 316 | ] 317 | }, 318 | { 319 | "cell_type": "code", 320 | "execution_count": 133, 321 | "metadata": {}, 322 | "outputs": [ 323 | { 324 | "data": { 325 | "text/html": [ 326 | "
\n", 327 | "\n", 340 | "\n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | "
OpenHighLowCloseVolume
count374.000000374.00000374.000000374.000000374.0
mean14508.46497314513.2576214503.90414414508.3752670.0
std33.37109232.4781833.68772733.2043020.0
min14419.85000014426.5500014415.35000014420.1500000.0
25%14482.61250014486.0250014478.57500014482.6375000.0
50%14518.72500014523.0750014514.60000014517.7750000.0
75%14534.98750014538.4375014529.97500014535.0000000.0
max14566.55000014572.6500014562.95000014567.2000000.0
\n", 418 | "
" 419 | ], 420 | "text/plain": [ 421 | " Open High Low Close Volume\n", 422 | "count 374.000000 374.00000 374.000000 374.000000 374.0\n", 423 | "mean 14508.464973 14513.25762 14503.904144 14508.375267 0.0\n", 424 | "std 33.371092 32.47818 33.687727 33.204302 0.0\n", 425 | "min 14419.850000 14426.55000 14415.350000 14420.150000 0.0\n", 426 | "25% 14482.612500 14486.02500 14478.575000 14482.637500 0.0\n", 427 | "50% 14518.725000 14523.07500 14514.600000 14517.775000 0.0\n", 428 | "75% 14534.987500 14538.43750 14529.975000 14535.000000 0.0\n", 429 | "max 14566.550000 14572.65000 14562.950000 14567.200000 0.0" 430 | ] 431 | }, 432 | "execution_count": 133, 433 | "metadata": {}, 434 | "output_type": "execute_result" 435 | } 436 | ], 437 | "source": [ 438 | "df_minute_data.describe()" 439 | ] 440 | }, 441 | { 442 | "cell_type": "code", 443 | "execution_count": 134, 444 | "metadata": {}, 445 | "outputs": [ 446 | { 447 | "data": { 448 | "text/html": [ 449 | "
\n", 450 | "\n", 463 | "\n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | "
DateOpenHighLowCloseVolume
02021-03-26 09:15:0014487.7014496.214487.7014493.250.0
12021-03-26 09:16:0014494.1014494.114461.2514468.900.0
22021-03-26 09:17:0014468.4014474.714458.6514464.300.0
32021-03-26 09:18:0014464.6014487.714464.6014482.750.0
42021-03-26 09:19:0014481.2514483.214461.4514462.550.0
\n", 523 | "
" 524 | ], 525 | "text/plain": [ 526 | " Date Open High Low Close Volume\n", 527 | "0 2021-03-26 09:15:00 14487.70 14496.2 14487.70 14493.25 0.0\n", 528 | "1 2021-03-26 09:16:00 14494.10 14494.1 14461.25 14468.90 0.0\n", 529 | "2 2021-03-26 09:17:00 14468.40 14474.7 14458.65 14464.30 0.0\n", 530 | "3 2021-03-26 09:18:00 14464.60 14487.7 14464.60 14482.75 0.0\n", 531 | "4 2021-03-26 09:19:00 14481.25 14483.2 14461.45 14462.55 0.0" 532 | ] 533 | }, 534 | "execution_count": 134, 535 | "metadata": {}, 536 | "output_type": "execute_result" 537 | } 538 | ], 539 | "source": [ 540 | "df_minute_data.head()" 541 | ] 542 | }, 543 | { 544 | "cell_type": "code", 545 | "execution_count": 135, 546 | "metadata": {}, 547 | "outputs": [ 548 | { 549 | "data": { 550 | "text/html": [ 551 | "
\n", 552 | "\n", 565 | "\n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | " \n", 595 | " \n", 596 | " \n", 597 | " \n", 598 | " \n", 599 | " \n", 600 | " \n", 601 | " \n", 602 | " \n", 603 | " \n", 604 | " \n", 605 | " \n", 606 | " \n", 607 | " \n", 608 | " \n", 609 | " \n", 610 | " \n", 611 | " \n", 612 | " \n", 613 | " \n", 614 | " \n", 615 | " \n", 616 | " \n", 617 | " \n", 618 | " \n", 619 | " \n", 620 | " \n", 621 | " \n", 622 | " \n", 623 | " \n", 624 | "
DateOpenHighLowCloseVolume
3692021-03-26 15:24:0014524.4514530.5514520.4014522.650.0
3702021-03-26 15:25:0014523.0014528.1014520.7514528.100.0
3712021-03-26 15:26:0014528.3514537.3014526.9014530.350.0
3722021-03-26 15:27:0014532.5014532.8514526.5014528.100.0
3732021-03-26 15:28:0014528.7014530.0514522.7014524.450.0
\n", 625 | "
" 626 | ], 627 | "text/plain": [ 628 | " Date Open High Low Close Volume\n", 629 | "369 2021-03-26 15:24:00 14524.45 14530.55 14520.40 14522.65 0.0\n", 630 | "370 2021-03-26 15:25:00 14523.00 14528.10 14520.75 14528.10 0.0\n", 631 | "371 2021-03-26 15:26:00 14528.35 14537.30 14526.90 14530.35 0.0\n", 632 | "372 2021-03-26 15:27:00 14532.50 14532.85 14526.50 14528.10 0.0\n", 633 | "373 2021-03-26 15:28:00 14528.70 14530.05 14522.70 14524.45 0.0" 634 | ] 635 | }, 636 | "execution_count": 135, 637 | "metadata": {}, 638 | "output_type": "execute_result" 639 | } 640 | ], 641 | "source": [ 642 | "df_minute_data.tail()" 643 | ] 644 | }, 645 | { 646 | "cell_type": "code", 647 | "execution_count": 137, 648 | "metadata": {}, 649 | "outputs": [], 650 | "source": [ 651 | "# Save per minute data to disk\n", 652 | "\n", 653 | "# df_minute_data.to_csv('/home/debashis/Data/Finance_Data/Live_data_work/Minutes_data/'+str(today)+'_per_minutes_NIFTY_.csv',\n", 654 | "# index=False)" 655 | ] 656 | }, 657 | { 658 | "cell_type": "code", 659 | "execution_count": null, 660 | "metadata": {}, 661 | "outputs": [], 662 | "source": [] 663 | }, 664 | { 665 | "cell_type": "code", 666 | "execution_count": null, 667 | "metadata": {}, 668 | "outputs": [], 669 | "source": [] 670 | } 671 | ], 672 | "metadata": { 673 | "kernelspec": { 674 | "display_name": "Python 3", 675 | "language": "python", 676 | "name": "python3" 677 | }, 678 | "language_info": { 679 | "codemirror_mode": { 680 | "name": "ipython", 681 | "version": 3 682 | }, 683 | "file_extension": ".py", 684 | "mimetype": "text/x-python", 685 | "name": "python", 686 | "nbconvert_exporter": "python", 687 | "pygments_lexer": "ipython3", 688 | "version": "3.6.9" 689 | } 690 | }, 691 | "nbformat": 4, 692 | "nbformat_minor": 2 693 | } 694 | -------------------------------------------------------------------------------- /Frequently used Technical_indicators.txt: -------------------------------------------------------------------------------- 1 | ## Technical indicators 2 | 3 | 1) Simple moving averages(SMA), 4 | 2) Exponential moving average(EMA), 5 | 3) Kaufman's adaptive moving average(KAMA), 6 | 4) Stop or reversal(SAR), 7 | 5) Triangular moving average(TRIMA), 8 | 6) Average directional index(ADX), 9 | 7) Absolute price oscillator(APO), 10 | 8) Commodity channel index(CCI), 11 | 9) Moving average convergence divergence(MACD), 12 | 10) Money flow index(MFI), 13 | 11) Momentum indicator (MOM), 14 | 12) Rate-of-change(ROC), 15 | 13) percentage price oscillator(PPO), 16 | 14) Relative Strength Index (RSI) 17 | 15) Stochastic Oscillator (STOCH) 18 | 16) Ultimate Oscillator (ULTOSC) 19 | 17) Williams % R (WillR) 20 | 18) Average true range (ATR) 21 | 19) True Range - (TRANGE) 22 | 20) Price Transform Functions (TYPPRICE) 23 | 21) Median Price (MEDPRICE) 24 | 22) Typical Price (TYPPRICE) 25 | 23) Weighted Close Price (WCLPRICE) 26 | 24) Hilbert Transform - Dominant Cycle Period (HT_DCPERIOD) 27 | 25) Hilbert Transform - Dominant Cycle Phase (HT_DCPHASE) 28 | 26) Hilbert Transform - Phasor Components (HT_PHASOR) 29 | 27) Hilbert Transform - SineWave (HT_SINE) 30 | 28) Hilbert Transform - Trend vs Cycle Mode (HT_TRENDMODE) 31 | 29) Beta - (BETA) 32 | 33 | 34 | Ref: https://mrjbq7.github.io/ta-lib/ 35 | 36 | -------------------------------------------------------------------------------- /Install Ta-Lib on Linux.txt: -------------------------------------------------------------------------------- 1 | Install Ta-Lib on Linux 2 | ------------------------- 3 | sudo apt-get -y install gcc build-essential 4 | 5 | 6 | Install using Anaconda 7 | ---------------------- 8 | wget -O inst_conda.sh "https://repo.anaconda.com/archive/Anaconda3-2020.11-Linux-x86_64.sh" \ 9 | && /bin/bash inst_conda.sh -b \ 10 | && rm inst_conda.sh \ 11 | && ./anaconda3/bin/conda init \ 12 | && source ~/.bashrc \ 13 | && conda create -n quantra python=3.6.8 -y \ 14 | && conda activate quantra 15 | 16 | 17 | Install using PIP 18 | ------------------ 19 | wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz \ 20 | && sudo tar -xzf ta-lib-0.4.0-src.tar.gz \ 21 | && sudo rm ta-lib-0.4.0-src.tar.gz \ 22 | && cd ta-lib/ \ 23 | && sudo ./configure --prefix=/usr \ 24 | && sudo make \ 25 | && sudo make install \ 26 | && cd ~ \ 27 | && sudo rm -rf ta-lib/ \ 28 | && pip install ta-lib 29 | 30 | 31 | 32 | 33 | Ref: https://blog.quantinsti.com/install-ta-lib-python/ 34 | -------------------------------------------------------------------------------- /Moving_Average_Crossover strategy/50-200 EMA and RSI - Signal generator.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | " Run this program every morning to get Buy and Sell signal\n", 8 | " Based on Moving average and RSI value" 9 | ] 10 | }, 11 | { 12 | "cell_type": "code", 13 | "execution_count": 1, 14 | "metadata": {}, 15 | "outputs": [], 16 | "source": [ 17 | "from nsepy import get_history\n", 18 | "import datetime\n", 19 | "import talib" 20 | ] 21 | }, 22 | { 23 | "cell_type": "code", 24 | "execution_count": 2, 25 | "metadata": {}, 26 | "outputs": [ 27 | { 28 | "name": "stdout", 29 | "output_type": "stream", 30 | "text": [ 31 | "Number of stocks in watchlist: 50\n" 32 | ] 33 | } 34 | ], 35 | "source": [ 36 | "# Include Nifty50 stocks to watchlist\n", 37 | "watchlist = ['ADANIPORTS', 'ASIANPAINT', 'AXISBANK', 'BAJAJ-AUTO', \n", 38 | " 'BAJFINANCE', 'BAJAJFINSV', 'BPCL', 'BHARTIARTL', \n", 39 | " 'BRITANNIA', 'CIPLA', 'COALINDIA', 'DIVISLAB', \n", 40 | " 'DRREDDY', 'EICHERMOT', 'GAIL', 'GRASIM', \n", 41 | " 'HCLTECH', 'HDFCBANK', 'HDFCLIFE', 'HEROMOTOCO', \n", 42 | " 'HINDALCO', 'HINDUNILVR', 'HDFC', 'ICICIBANK', \n", 43 | " 'ITC', 'IOC', 'INDUSINDBK', 'INFY', 'JSWSTEEL', \n", 44 | " 'KOTAKBANK', 'LT', 'M&M', 'MARUTI', 'NTPC', \n", 45 | " 'NESTLEIND', 'ONGC', 'POWERGRID', 'RELIANCE', \n", 46 | " 'SBILIFE', 'SHREECEM', 'SBIN', 'SUNPHARMA', \n", 47 | " 'TCS', 'TATAMOTORS', 'TATASTEEL', 'TECHM', \n", 48 | " 'TITAN', 'UPL', 'ULTRACEMCO', 'WIPRO']\n", 49 | "print('Number of stocks in watchlist: ', len(watchlist))" 50 | ] 51 | }, 52 | { 53 | "cell_type": "markdown", 54 | "metadata": {}, 55 | "source": [ 56 | " ## Buy Logic\n", 57 | " --------------------\n", 58 | " When MA-50 > MA-200 and RSI above 60\n", 59 | " \n", 60 | " ## Sell Logic\n", 61 | " --------------------\n", 62 | " When MA-50 < MA-200 and RSI below 40" 63 | ] 64 | }, 65 | { 66 | "cell_type": "markdown", 67 | "metadata": {}, 68 | "source": [ 69 | " We can change MA and RSI values according to our requirement" 70 | ] 71 | }, 72 | { 73 | "cell_type": "code", 74 | "execution_count": 3, 75 | "metadata": {}, 76 | "outputs": [], 77 | "source": [ 78 | "short_ema = 50\n", 79 | "long_ema = 200\n", 80 | "\n", 81 | "# Find yesterday date\n", 82 | "today_date = datetime.date.today()\n", 83 | "yesterday_date = today_date - datetime.timedelta(days = 1)\n", 84 | "\n", 85 | "# date format in YYYY,MM,DD\n", 86 | "start_date = datetime.date(2020,1,1)\n", 87 | "end_date = yesterday_date" 88 | ] 89 | }, 90 | { 91 | "cell_type": "code", 92 | "execution_count": 4, 93 | "metadata": {}, 94 | "outputs": [ 95 | { 96 | "name": "stdout", 97 | "output_type": "stream", 98 | "text": [ 99 | "Buy signal in ASIANPAINT\n", 100 | "Buy signal in BAJFINANCE\n", 101 | "Buy signal in BPCL\n", 102 | "Buy signal in BRITANNIA\n", 103 | "Buy signal in DIVISLAB\n", 104 | "Buy signal in DRREDDY\n", 105 | "Buy signal in HCLTECH\n", 106 | "Buy signal in HDFCLIFE\n", 107 | "Buy signal in IOC\n", 108 | "Buy signal in INFY\n", 109 | "Buy signal in NTPC\n", 110 | "Buy signal in NESTLEIND\n", 111 | "Buy signal in ONGC\n", 112 | "Buy signal in POWERGRID\n", 113 | "Buy signal in RELIANCE\n", 114 | "Buy signal in SBIN\n", 115 | "Buy signal in TCS\n", 116 | "Buy signal in TATAMOTORS\n", 117 | "Buy signal in TECHM\n", 118 | "Buy signal in TITAN\n", 119 | "Buy signal in UPL\n", 120 | "Buy signal in WIPRO\n" 121 | ] 122 | } 123 | ], 124 | "source": [ 125 | "for name in watchlist[:]:\n", 126 | "\n", 127 | " df = get_history(symbol=name, start=start_date, end=yesterday_date) # fetch data for specified date\n", 128 | " df['ma50'] = talib.EMA(df['Close'], timeperiod=short_ema)\n", 129 | " df['ma200'] = talib.EMA(df['Close'], timeperiod=long_ema)\n", 130 | " df['rsi14'] = talib.RSI(df['Close'], timeperiod=14)\n", 131 | "\n", 132 | " last_candle = df.iloc[-1]\n", 133 | "# print((last_candle))\n", 134 | "\n", 135 | " # buy signal\n", 136 | " if (last_candle['ma50'] > last_candle['ma200']) and (last_candle['rsi14'] > 60):\n", 137 | " print(\"Buy signal in \", name)\n", 138 | "\n", 139 | " # sell signal\n", 140 | " if (last_candle['ma50'] < last_candle['ma200']) and (last_candle['rsi14'] < 40):\n", 141 | " print(\"sell signal in \", name)\n", 142 | "\n" 143 | ] 144 | }, 145 | { 146 | "cell_type": "code", 147 | "execution_count": 23, 148 | "metadata": {}, 149 | "outputs": [], 150 | "source": [ 151 | "# df.head(10)" 152 | ] 153 | }, 154 | { 155 | "cell_type": "code", 156 | "execution_count": 36, 157 | "metadata": {}, 158 | "outputs": [], 159 | "source": [ 160 | "# We can also findout, for a particular stock, when was the crossover happened. \n", 161 | "# i.e. on which date this strategy actually generated the buy or sell signal" 162 | ] 163 | }, 164 | { 165 | "cell_type": "code", 166 | "execution_count": null, 167 | "metadata": {}, 168 | "outputs": [], 169 | "source": [ 170 | "# we can also mantain our buy and sell histroy, so that, we can introduce our hold position" 171 | ] 172 | }, 173 | { 174 | "cell_type": "code", 175 | "execution_count": null, 176 | "metadata": {}, 177 | "outputs": [], 178 | "source": [] 179 | }, 180 | { 181 | "cell_type": "code", 182 | "execution_count": null, 183 | "metadata": {}, 184 | "outputs": [], 185 | "source": [] 186 | }, 187 | { 188 | "cell_type": "code", 189 | "execution_count": null, 190 | "metadata": {}, 191 | "outputs": [], 192 | "source": [] 193 | }, 194 | { 195 | "cell_type": "code", 196 | "execution_count": null, 197 | "metadata": {}, 198 | "outputs": [], 199 | "source": [] 200 | }, 201 | { 202 | "cell_type": "code", 203 | "execution_count": null, 204 | "metadata": {}, 205 | "outputs": [], 206 | "source": [] 207 | }, 208 | { 209 | "cell_type": "code", 210 | "execution_count": null, 211 | "metadata": {}, 212 | "outputs": [], 213 | "source": [] 214 | }, 215 | { 216 | "cell_type": "code", 217 | "execution_count": null, 218 | "metadata": {}, 219 | "outputs": [], 220 | "source": [] 221 | }, 222 | { 223 | "cell_type": "code", 224 | "execution_count": null, 225 | "metadata": {}, 226 | "outputs": [], 227 | "source": [] 228 | }, 229 | { 230 | "cell_type": "code", 231 | "execution_count": null, 232 | "metadata": {}, 233 | "outputs": [], 234 | "source": [] 235 | }, 236 | { 237 | "cell_type": "code", 238 | "execution_count": null, 239 | "metadata": {}, 240 | "outputs": [], 241 | "source": [] 242 | } 243 | ], 244 | "metadata": { 245 | "kernelspec": { 246 | "display_name": "Python 3", 247 | "language": "python", 248 | "name": "python3" 249 | }, 250 | "language_info": { 251 | "codemirror_mode": { 252 | "name": "ipython", 253 | "version": 3 254 | }, 255 | "file_extension": ".py", 256 | "mimetype": "text/x-python", 257 | "name": "python", 258 | "nbconvert_exporter": "python", 259 | "pygments_lexer": "ipython3", 260 | "version": "3.6.9" 261 | } 262 | }, 263 | "nbformat": 4, 264 | "nbformat_minor": 4 265 | } 266 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # -------------------------------------------------------------------------------- /exploratory-data-analysis-on-5-minute-data.ipynb: -------------------------------------------------------------------------------- 1 | {"cells":[{"source":"\"Kaggle\"","metadata":{},"cell_type":"markdown","outputs":[],"execution_count":0},{"cell_type":"markdown","id":"8468e5b5","metadata":{"papermill":{"duration":0.005046,"end_time":"2022-08-21T10:00:07.420678","exception":false,"start_time":"2022-08-21T10:00:07.415632","status":"completed"},"tags":[]},"source":["### This is initial data analysis about this dataset. \n","\n"," This contains how to load this dataset and start doing analysis. "]},{"cell_type":"markdown","id":"1f425c0d","metadata":{"papermill":{"duration":0.003621,"end_time":"2022-08-21T10:00:07.428524","exception":false,"start_time":"2022-08-21T10:00:07.424903","status":"completed"},"tags":[]},"source":["# **Steps for EDA**\n","\n","* **Missing values or data**\n"," - Relationship of missing values with target variable\n","* **Check how many are numerical values and categorical values**\n","* **Check for data distribution**\n","* **Check for outliers present in data**\n","* **If any extra features can be created out of the present data**\n","* **Apply feature selection techniques to justify each feature for target value**\n"]},{"cell_type":"code","execution_count":1,"id":"3e52ba19","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","execution":{"iopub.execute_input":"2022-08-21T10:00:07.43914Z","iopub.status.busy":"2022-08-21T10:00:07.4382Z","iopub.status.idle":"2022-08-21T10:00:07.450594Z","shell.execute_reply":"2022-08-21T10:00:07.449579Z"},"papermill":{"duration":0.020745,"end_time":"2022-08-21T10:00:07.453119","exception":false,"start_time":"2022-08-21T10:00:07.432374","status":"completed"},"tags":[]},"outputs":[],"source":["# Import necessary libraries\n","\n","import numpy as np # linear algebra\n","import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n","import os\n","\n","from matplotlib import pyplot as plt # for plotting purposes"]},{"cell_type":"code","execution_count":2,"id":"94dbda8a","metadata":{"execution":{"iopub.execute_input":"2022-08-21T10:00:07.464153Z","iopub.status.busy":"2022-08-21T10:00:07.462857Z","iopub.status.idle":"2022-08-21T10:00:07.480622Z","shell.execute_reply":"2022-08-21T10:00:07.4784Z"},"papermill":{"duration":0.025778,"end_time":"2022-08-21T10:00:07.483063","exception":false,"start_time":"2022-08-21T10:00:07.457285","status":"completed"},"tags":[]},"outputs":[{"name":"stdout","output_type":"stream","text":["/kaggle/input/nifty-50-minute-data/NIFTY 50 - Hourly data.csv\n","/kaggle/input/nifty-50-minute-data/NIFTY 50 - 5minute data.csv\n","/kaggle/input/nifty-50-minute-data/NIFTY 50 - 3 minute data.csv\n","/kaggle/input/nifty-50-minute-data/NIFTY 50 - 15minute data.csv\n","/kaggle/input/nifty-50-minute-data/NIFTY 50 - Minute data.csv\n","/kaggle/input/nifty-50-minute-data/NIFTY 50 - Daily data.csv\n"]}],"source":["# List of files availeble in the current directory\n","for dirname, _, filenames in os.walk('/kaggle/input'):\n"," for filename in filenames:\n"," print(os.path.join(dirname, filename))"]},{"cell_type":"code","execution_count":3,"id":"2fa6d42d","metadata":{"execution":{"iopub.execute_input":"2022-08-21T10:00:07.493712Z","iopub.status.busy":"2022-08-21T10:00:07.492954Z","iopub.status.idle":"2022-08-21T10:00:07.500212Z","shell.execute_reply":"2022-08-21T10:00:07.49835Z"},"papermill":{"duration":0.015567,"end_time":"2022-08-21T10:00:07.502842","exception":false,"start_time":"2022-08-21T10:00:07.487275","status":"completed"},"tags":[]},"outputs":[{"name":"stdout","output_type":"stream","text":["NIFTY 50 - 5minute data.csv\n","Data path: /kaggle/input/nifty-50-minute-data/NIFTY 50 - 5minute data.csv\n"]}],"source":["# Here clarify about the data is loaded or not\n","filename = 'NIFTY 50 - 5minute data.csv'\n","print(filename)\n","data_path = os.path.join(dirname, filename)\n","print('Data path: ', data_path)"]},{"cell_type":"code","execution_count":4,"id":"8ed2b4cb","metadata":{"execution":{"iopub.execute_input":"2022-08-21T10:00:07.513459Z","iopub.status.busy":"2022-08-21T10:00:07.512957Z","iopub.status.idle":"2022-08-21T10:00:07.806508Z","shell.execute_reply":"2022-08-21T10:00:07.804671Z"},"papermill":{"duration":0.301936,"end_time":"2022-08-21T10:00:07.80912","exception":false,"start_time":"2022-08-21T10:00:07.507184","status":"completed"},"tags":[]},"outputs":[{"name":"stdout","output_type":"stream","text":[" date open high low close volume\n","0 2015-01-09 09:15:00+05:30 8285.45 8301.30 8285.45 8301.20 0\n","1 2015-01-09 09:20:00+05:30 8300.50 8303.00 8293.25 8301.00 0\n","2 2015-01-09 09:25:00+05:30 8301.65 8302.55 8286.80 8294.15 0\n","3 2015-01-09 09:30:00+05:30 8294.10 8295.75 8280.65 8288.50 0\n","4 2015-01-09 09:35:00+05:30 8289.10 8290.45 8278.00 8283.45 0\n"]}],"source":["# Read dataset into dataframe\n","dataset = pd.read_csv(data_path)\n","print(dataset.head())"]},{"cell_type":"markdown","id":"d98f29f3","metadata":{"papermill":{"duration":0.00402,"end_time":"2022-08-21T10:00:07.81754","exception":false,"start_time":"2022-08-21T10:00:07.81352","status":"completed"},"tags":[]},"source":["### Since this data belongs to index category, so volume data is not available"]},{"cell_type":"code","execution_count":5,"id":"a03216b3","metadata":{"execution":{"iopub.execute_input":"2022-08-21T10:00:07.82816Z","iopub.status.busy":"2022-08-21T10:00:07.827669Z","iopub.status.idle":"2022-08-21T10:00:08.129519Z","shell.execute_reply":"2022-08-21T10:00:08.128457Z"},"papermill":{"duration":0.310342,"end_time":"2022-08-21T10:00:08.132128","exception":false,"start_time":"2022-08-21T10:00:07.821786","status":"completed"},"tags":[]},"outputs":[{"data":{"text/plain":["[]"]},"execution_count":5,"metadata":{},"output_type":"execute_result"},{"data":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAuAAAAGDCAYAAABqVqVgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAABgaElEQVR4nO3dd3hUxfoH8O+bnpAKCb2E3nukShGQqmK91+5Vr91rL0ERFBWxXP3ptberXhULdukKSJEWkF4DBAgdAklISJ/fH3u2Zc9udpPds5vN9/M8eThnZs7Z2WUD787OvCNKKRARERERkTFC/N0BIiIiIqK6hAE4EREREZGBGIATERERERmIATgRERERkYEYgBMRERERGYgBOBERERGRgRiAExHVIiJyVkTaaMfRIvKLiOSKyLf+7psrIrJERP7p734QEQUCBuBERAFCRLJE5LiI1LMp+6eILDGfK6VilVJ7tdMrATQC0EApdZWIfCIiz9Xg8ZeISJEW5J8VkZ2V6q8Vkf0iUiAiP4pI/eo+VhX9yBKRUb64NxFRIGAATkQUWEIB3O9m21YAdimlyrz4+PdqQX6sUqqjuVBEugJ4D8ANMAX9hQDe9uLjEhHVGQzAiYgCy8sAHhGRRL1KEVEi0k5EngEwBcDftdHqOwBcB+Ax7fwXEXlURL6rdP0bIvJ6Nfp1HYBflFJLlVJnATwF4HIRiXPSzwtFZIc2PeZNAGJT11ZEFonIKRE5KSJfmJ+viPwPQEsAv2jP4zGt/FsROardb6n2gYCIqFZiAE5EFFgyACwB8IirRkqpqQCmA/haG61+D8AXAF7Szi8G8DmAsTbBbRiAqwF85uLWL2hB8QoRGW5T3hXARpvH3wOgBECHyjcQkWQA3wOYDCAZwB4Ag22bAHgBQFMAnQG0APC0dt8bABwAcLH2PF7SrpkLoD2AhgDWa8+ViKhWYgBORBR4pgD4l4ik1OQmSqkjAJYCuEorGgvgpFJqnZNLHgfQBkAzAO/DNArdVquLBZBbqX0uAL0R8PEAtiqlZimlSgH8H4CjNv3KVEotVEoVK6VOAHgVwLAqnsvHSql8pVQxTMF6TxFJcHUNEVGgYgBORBRglFJbAPwKIN0Lt/sUwPXa8fUA/uficVebg1yl1KcAVsAUTAPAWQDxlS6JB5Cvc6umAA7a3FfZnotIIxH5SkQOiUgeTCP1yc76JSKhIjJDRPZo7bO0KqfXEBEFMgbgRESBaSqA22AajXaX0in7EUAPEekG4CJ4NnVDwTp3eyuAnuYKLRViJIBdOtcdgWlaibmt2J7DNHVGAeiulIqH6YOB2NRXfh7XApgIYBSABACp5lt78FyIiAIGA3AiogCklMoE8DWA+zy47BhMU0hs71MEYBaALwGsUUod0LtQRBJFZIyIRIlImIhcB2AogHlaky8AXCwiQ7Q0idMAfK+U0hsBnw2gq4hcrs07vw9AY5v6OJhG1HNFpBmAR6t4HnEAigGcAhADUwBPRFRrMQAnIgpc0wDUq7KV1UcAuojIGRH50ab8UwDd4WL6CYBwAM8BOAHgJIB/AbhUKbULAJRSWwHcCVMgfhymoPhuvRsppU7CNO98BkxBc3uYprOYPQOgD0xzyGfDtGDT1gsAJmvP4xGYFo3uB3AIwDYAq1w8DyKigCemqXlERBSsRKQlgB0AGiul8vzdHyKiuo4j4EREQUxEQgA8BOArBt9ERIEhzN8dICIi39Dmah+DafrGWD93h4iINJyCQkRERERkIE5BISIiIiIyEANwIiIiIiID1bk54MnJySo1NdXf3SAiIiKiILZu3bqTSqkUvbo6F4CnpqYiIyPD390gIiIioiAmIvud1XEKChERERGRgRiAExEREREZiAE4EREREZGBGIATERERERmIATgRERERkYEYgBMRERERGYgBOBERERGRgRiAExEREREZiAE4EREREZGBGIATERERERmIATgRERERkYEYgBMRERGRz2Uez/d3FwIGA3AiIiIi8qk5m49g1KtLMW/LUX93JSAwACciIiIin7r7i/UAgB1H8/zck8DAAJyIiIiIDHEsr8jfXQgIDMCJiIiIyBAz1xz0dxcCAgNwIiIiIiIDMQAnIiIiolqpqLQcpeUV/u6GxxiAExEREZFhUtNnY/2B0165V6en5uH8Fxd55V5GYgBORERERD5TXqEcyi5/+88a33fd/hwAwLG84hrfy2gMwImIiIjIZ4pKy31y3yveWemT+xqBATgRERER+UxxmfM52rnnSpGRlePxPSt0RtVrEwbgREREROQz7yzJdFp3zxfrceW7K1FQXObRPRduP1bTbvkVA3AiIiIi8pkPlu1zWrc88yQA4Ou1nuUHb5IQVaM++ZvPAnAR+VhEjovIFpuyXiKySkQ2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uEeEhViCbyIicq5+DTZ4I6pLGICTV9mOgNeU7XxrvQ1vzHK0HTMf+dYUVH+Tke20bUFxGTpOnufQxnZEe93+09XqLxFRXfePQakAgMt7N/NvR4gCHANw8opFDw8DADxzSVev3jdrxgTdhY/X9m9pd55TUILkWOsodWr6bN0pJl2nzncoy5oxAU9d1MWrHx6IiOqiS3s3w1V9m+OJCTXf8I0omIkvNjMJZGlpaSojI8Pf3aAaOpZXhP7Tf3fZ5v0b+mJ018aW88NnzmHQjEV2bUIE2PuCNcDPLypFeGgI89kSERFRjYjIOqVUml4dR8CpVmoUH4X+reu7bHNKm5piZp6iYuubOwbancdFhTP4JiIiIp9iAE611rvX93VZn1MpAI/WCazbpHDaCRERERmLaQip1kqqF4HrB7TE56sOAABGdW6I37Yft9SfPGufCuv3Haa6NU+ORIN6kTiRX8wV+0RERGQ4joBTrXb/yA6W43X7T2PbtDGW8/+uyNK9pmFcFEJDxGGzHyIiIiIjMACnWs02P3dBSTliIsLwt7Tmdm3WHziNE9wYgoiIiAIEp6BQ0Jh+WXcAwEtX9rTk+Z696Qju+XK9P7tFREREZIcBONV626aNwaHT59C+UZxDHYNvIiIiCjScgkK1XkxEmG7wradeBFMMEhERkX8xAKc6paCk3N9dICIiojqOATgFpRev6O7vLhARERHpYgBOQSk2MtzfXSAiIiLSxQCcglJ4qPi7C0RERES6GIBTUPp10xHL8Y0DW/mxJ0RERET2GIBTUOraNN5y/PTFXTGuW2MAwL0XtPNXl4iIiIgAMACnIDWycyMAQMdGcQgJEXRqbArI60Uy9T0RERH5F6MRCkptkuvhn+e3xrX9WwIAbhvaGgUlZbh5cKp/O0ZERER1niil/N0HQ6WlpamMjAx/d4OIiIiIgpiIrFNKpenVcQoKEREREZGBGIATERERERmIATgRERERkYEYgBMRERERGYgBOBERERGRgRiAExEREREZiAE4EREREZGBGIATERERERmIATgRERERkYEYgBMRERERGYgBOBERERGRgRiAExEREREZiAE4EREREZGBRCnl7z4YSkROANjvh4dOBnDSD49bl/E1NxZfb+PxNTcWX2/j8TU3Fl9v72qllErRq6hzAbi/iEiGUirN3/2oS/iaG4uvt/H4mhuL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\n","text/plain":["
"]},"metadata":{"needs_background":"light"},"output_type":"display_data"}],"source":["plt.figure(figsize = (12, 6))\n","plt.title('Nifty 50 data')\n","plt.rcParams.update({'font.size': 14})\n","plt.xlabel('Time in 5 minutes')\n","plt.ylabel('Price')\n","plt.plot(dataset['close'])\n"]},{"cell_type":"markdown","id":"bb027ee5","metadata":{"papermill":{"duration":0.004954,"end_time":"2022-08-21T10:00:08.142357","exception":false,"start_time":"2022-08-21T10:00:08.137403","status":"completed"},"tags":[]},"source":["### Categorical and Numerical data\n","* Categorical data refers to a data type that can be stored and identified based on the names or labels given to them.\n","* Numerical data refers to the data that is in the form of numbers, and not in any language or descriptive form."]},{"cell_type":"code","execution_count":6,"id":"d8c32866","metadata":{"execution":{"iopub.execute_input":"2022-08-21T10:00:08.155207Z","iopub.status.busy":"2022-08-21T10:00:08.154401Z","iopub.status.idle":"2022-08-21T10:00:08.160445Z","shell.execute_reply":"2022-08-21T10:00:08.159346Z"},"papermill":{"duration":0.015244,"end_time":"2022-08-21T10:00:08.162818","exception":false,"start_time":"2022-08-21T10:00:08.147574","status":"completed"},"tags":[]},"outputs":[{"name":"stdout","output_type":"stream","text":["hi\n"]}],"source":["print('hi')"]},{"cell_type":"code","execution_count":null,"id":"df0655a8","metadata":{"papermill":{"duration":0.004808,"end_time":"2022-08-21T10:00:08.172717","exception":false,"start_time":"2022-08-21T10:00:08.167909","status":"completed"},"tags":[]},"outputs":[],"source":[]},{"cell_type":"code","execution_count":null,"id":"67c602a5","metadata":{"papermill":{"duration":0.004862,"end_time":"2022-08-21T10:00:08.182536","exception":false,"start_time":"2022-08-21T10:00:08.177674","status":"completed"},"tags":[]},"outputs":[],"source":[]},{"cell_type":"code","execution_count":null,"id":"e111c887","metadata":{"papermill":{"duration":0.006474,"end_time":"2022-08-21T10:00:08.194158","exception":false,"start_time":"2022-08-21T10:00:08.187684","status":"completed"},"tags":[]},"outputs":[],"source":[]},{"cell_type":"code","execution_count":null,"id":"a9e8b35c","metadata":{"papermill":{"duration":0.004957,"end_time":"2022-08-21T10:00:08.204537","exception":false,"start_time":"2022-08-21T10:00:08.19958","status":"completed"},"tags":[]},"outputs":[],"source":[]},{"cell_type":"code","execution_count":null,"id":"452f0350","metadata":{"papermill":{"duration":0.004779,"end_time":"2022-08-21T10:00:08.214536","exception":false,"start_time":"2022-08-21T10:00:08.209757","status":"completed"},"tags":[]},"outputs":[],"source":[]},{"cell_type":"code","execution_count":null,"id":"9c88b726","metadata":{"papermill":{"duration":0.004589,"end_time":"2022-08-21T10:00:08.22408","exception":false,"start_time":"2022-08-21T10:00:08.219491","status":"completed"},"tags":[]},"outputs":[],"source":[]},{"cell_type":"code","execution_count":null,"id":"e4cebbec","metadata":{"papermill":{"duration":0.006369,"end_time":"2022-08-21T10:00:08.235769","exception":false,"start_time":"2022-08-21T10:00:08.2294","status":"completed"},"tags":[]},"outputs":[],"source":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","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.7.12"},"papermill":{"default_parameters":{},"duration":11.486519,"end_time":"2022-08-21T10:00:08.970986","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2022-08-21T09:59:57.484467","version":"2.3.4"}},"nbformat":4,"nbformat_minor":5} --------------------------------------------------------------------------------