├── # 验证小市值结合盈利指标过滤策略.ipynb ├── .gitignore ├── 002475.csv ├── 600256.csv ├── README.md ├── fft-filter.ipynb ├── getstockcsv.py ├── newfeature.py ├── singlelstm.ipynb ├── singlelstm2.ipynb ├── sklearn机器学习单票回测.ipynb ├── xmm.csv └── 保存K线数据到数据库.ipynb /# 验证小市值结合盈利指标过滤策略.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 验证小市值结合盈利指标过滤策略" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": { 14 | "ExecuteTime": { 15 | "end_time": "2019-10-07T01:19:15.137015Z", 16 | "start_time": "2019-10-07T01:19:13.865910Z" 17 | } 18 | }, 19 | "outputs": [], 20 | "source": [ 21 | "#常规库引用\n", 22 | "import datetime\n", 23 | "import tushare as ts\n", 24 | "# import rqalpha_data\n", 25 | "import pandas as pd\n", 26 | "import numpy as np\n", 27 | "import tushare as ts\n", 28 | "import baostock as bs\n", 29 | "import talib as talib\n", 30 | "import seaborn as sns\n", 31 | "import math\n", 32 | "import statsmodels.tsa.stattools as stattool\n", 33 | "import matplotlib.pyplot as plt \n", 34 | "plt.rcParams['figure.figsize'] = (18.0, 6.0)\n", 35 | "from sqlalchemy import create_engine\n", 36 | "\n", 37 | "engine = create_engine(\"mysql+pymysql://{}:{}@{}/{}?charset={}\".format('root', '12345678', '127.0.0.1:3306', 'finance','UTF8MB4'))\n", 38 | "conn = engine.connect()#创建连接" 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": 30, 44 | "metadata": { 45 | "ExecuteTime": { 46 | "end_time": "2019-10-07T02:01:50.459824Z", 47 | "start_time": "2019-10-07T02:00:38.800072Z" 48 | } 49 | }, 50 | "outputs": [ 51 | { 52 | "name": "stdout", 53 | "output_type": "stream", 54 | "text": [ 55 | "(1332913, 24)\n", 56 | "(228430, 24)\n" 57 | ] 58 | } 59 | ], 60 | "source": [ 61 | "datas=pd.DataFrame()\n", 62 | "#flowmkt<=40,大概是50%分位数,为了减少数据量提前过滤\n", 63 | "for sscode in ['000','001','002','300','600','601','603'][:]:\n", 64 | " datas=pd.concat([datas,pd.read_sql('select * from k'+sscode+' where date>\"2016-01-01\" \\\n", 65 | " AND isST=0 AND eprofit>1 AND flowmkt<=60 AND esale>0 \\\n", 66 | " AND pctChg>-9.7 AND pctChg<=9.7 AND turn>=0.5 order by date \\\n", 67 | " ',con=conn)],axis=0)\n", 68 | "print(datas.shape)\n", 69 | "datas=datas[datas.groupby('date')['flowmkt'].rank()<=250]\n", 70 | "print(datas.shape)\n" 71 | ] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": 31, 76 | "metadata": { 77 | "ExecuteTime": { 78 | "end_time": "2019-10-07T02:01:51.961805Z", 79 | "start_time": "2019-10-07T02:01:51.635186Z" 80 | } 81 | }, 82 | "outputs": [ 83 | { 84 | "name": "stdout", 85 | "output_type": "stream", 86 | "text": [ 87 | "(228430, 15)\n", 88 | "(182782, 15) (228430, 15)\n" 89 | ] 90 | } 91 | ], 92 | "source": [ 93 | "n=200\n", 94 | "sdata=datas\n", 95 | "# sdata['amo']=sdata.close/sdata.emoney\n", 96 | "sdata['ape']=sdata.close/sdata.eprofit\n", 97 | "sdata['asa']=sdata.close/sdata.esale\n", 98 | "sdata['result2']=sdata.result\n", 99 | "sdata.drop(['close','open','preclose','high','low','amount','volume','isST','eb','emoney','esale','result'],axis=1,inplace=True)\n", 100 | "print(datas.shape)\n", 101 | "datas=datas[datas.groupby('date')['ape'].rank()<=n]\n", 102 | "print(datas.shape,sdata.shape)" 103 | ] 104 | }, 105 | { 106 | "cell_type": "code", 107 | "execution_count": 39, 108 | "metadata": { 109 | "ExecuteTime": { 110 | "end_time": "2019-10-07T02:03:06.363597Z", 111 | "start_time": "2019-10-07T02:03:05.816182Z" 112 | } 113 | }, 114 | "outputs": [ 115 | { 116 | "name": "stdout", 117 | "output_type": "stream", 118 | "text": [ 119 | "[-193.11, -110.04, -40.03, 88.52]\n", 120 | "[343.01, 399.55, 122.52, 94.81]\n", 121 | "[396.47, 439.14, 184.96, 81.99]\n", 122 | "[419.43, 486.3, 126.51, 72.1]\n", 123 | "[249.88, 350.18, 53.26, 74.1]\n" 124 | ] 125 | }, 126 | { 127 | "data": { 128 | "image/png": "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\n", 129 | "text/plain": [ 130 | "
" 131 | ] 132 | }, 133 | "metadata": { 134 | "needs_background": "light" 135 | }, 136 | "output_type": "display_data" 137 | } 138 | ], 139 | "source": [ 140 | "stock_data=datas[:-40].copy()\n", 141 | "\n", 142 | "output=pd.DataFrame()\n", 143 | "output['monthresult']=sdata.groupby('date')['result5'].mean()\n", 144 | "# print(stock_data.shape,stock_data.columns)\n", 145 | "i,j,k=int(n*0.95),0.3,2\n", 146 | "turnmin,turnmax,volrmin,volrmax=2,8,6,20\n", 147 | "stock_data=stock_data[stock_data['turn']>turnmin] \n", 148 | "stock_data=stock_data[stock_data['turn']volrmin*0.1] \n", 150 | "stock_data=stock_data[stock_data['volratio']\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0mstock_data\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mstock_data\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstock_data\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'turn'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m<\u001b[0m\u001b[0mturnmax\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0mstock_data\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mstock_data\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstock_data\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'volratio'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m>\u001b[0m\u001b[0mvolrmin\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;36m0.1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0mstock_data\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mstock_data\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstock_data\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'volratio'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m<\u001b[0m\u001b[0mvolrmax\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;36m0.1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 15\u001b[0m \u001b[0mstock_data\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mstock_data\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstock_data\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroupby\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'date'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'asa'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrank\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m<\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0mstock_data\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mstock_data\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstock_data\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroupby\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'date'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'ape'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrank\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m<\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 217 | "\u001b[0;31mKeyboardInterrupt\u001b[0m: " 218 | ] 219 | } 220 | ], 221 | "source": [ 222 | "for turnmin in range(0,4,1):#4\n", 223 | " for turnmax in range(8,20,3):#4\n", 224 | " for volrmin in range(5,10,1):#4\n", 225 | " for volrmax in range(20,28,2):#4\n", 226 | " results=[]\n", 227 | " for i in [0.5,0.6,0.7,0.8,0.9]:#8\n", 228 | " for j in [0.5,0.6,0.7,0.8,0.9]:#5\n", 229 | " for k in range(1,5,1): #4\n", 230 | "\n", 231 | " stock_data=datas[:-40].copy()\n", 232 | " stock_data=stock_data[stock_data['turn']>turnmin] \n", 233 | " stock_data=stock_data[stock_data['turn']volrmin*0.1] \n", 235 | " stock_data=stock_data[stock_data['volratio']\n", 117 | "\n", 130 | "\n", 131 | " \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 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | "
datecodeopenhighlowclosepreclosevolumeamount
02015-03-02sz.00000114.030014.090013.870014.030013.99001018797001423603264.0000
12015-03-03sz.00000113.980013.980013.590013.600014.03001059476291457305040.0000
22015-03-04sz.00000113.620013.720013.500013.570013.6000814973041108145424.0000
32015-03-05sz.00000113.500013.530013.290013.380013.5700828604851109151968.0000
42015-03-06sz.00000113.370013.510013.350013.440013.380055704774748959120.0000
\n", 208 | "" 209 | ], 210 | "text/plain": [ 211 | " date code open high low close preclose \\\n", 212 | "0 2015-03-02 sz.000001 14.0300 14.0900 13.8700 14.0300 13.9900 \n", 213 | "1 2015-03-03 sz.000001 13.9800 13.9800 13.5900 13.6000 14.0300 \n", 214 | "2 2015-03-04 sz.000001 13.6200 13.7200 13.5000 13.5700 13.6000 \n", 215 | "3 2015-03-05 sz.000001 13.5000 13.5300 13.2900 13.3800 13.5700 \n", 216 | "4 2015-03-06 sz.000001 13.3700 13.5100 13.3500 13.4400 13.3800 \n", 217 | "\n", 218 | " volume amount \n", 219 | "0 101879700 1423603264.0000 \n", 220 | "1 105947629 1457305040.0000 \n", 221 | "2 81497304 1108145424.0000 \n", 222 | "3 82860485 1109151968.0000 \n", 223 | "4 55704774 748959120.0000 " 224 | ] 225 | }, 226 | "execution_count": 29, 227 | "metadata": {}, 228 | "output_type": "execute_result" 229 | } 230 | ], 231 | "source": [ 232 | "code='000001'\n", 233 | "start_date='2015-03-01'\n", 234 | "end_date='2019-03-01'\n", 235 | "price=getDataFromBaostock(code,start_date,end_date)\n", 236 | "price.head()" 237 | ] 238 | }, 239 | { 240 | "cell_type": "code", 241 | "execution_count": 73, 242 | "metadata": { 243 | "ExecuteTime": { 244 | "end_time": "2019-08-07T23:58:08.995969Z", 245 | "start_time": "2019-08-07T23:58:08.766082Z" 246 | } 247 | }, 248 | "outputs": [ 249 | { 250 | "data": { 251 | "text/plain": [ 252 | "" 253 | ] 254 | }, 255 | "execution_count": 73, 256 | "metadata": {}, 257 | "output_type": "execute_result" 258 | }, 259 | { 260 | "data": { 261 | "image/png": "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s3wZ4ffdR9HRTBKeeppfzhvIwTsnkvLvGQAE1MGp76Y67loQGxtrxf1pVc8dO3bQsWNHD1XkeXX9+UVERERERM6EOyeHXT1jCf/7fYTddtsJ59LmzSPxmUm0WrQQnzZtTtmPZVn8+pexpG/9iRdGPct7912Er5f9hPMFO3aQ+flCMhcvoig5BXtoKG3XrMbY7afouWYyxmy2LCu2pHM1cg0GERERERERkVNxJiYBnDSCASDowgtJfGYSWd98c9qAIWvValybNvJRzBVMHjvghHABwBiDb6dO+HbqRMMH7id340ZsAQG1Mlw4HU2REBERERERkVrHlVi8RaXjT4s8AnhFRODbretp12GwXC52PvUchwMa0PfecbRpGHjK9sZuJ+Dcc/Hr1q38hddgChhERERERESk1nEmJAIlj2AACB4yhPzt23EePlxqH5tn/o+gIwf4+bKbubpPyyqpszZRwCAiIiIiIiK1jivhCFDyCAYo3q4SIOubkkcxJCel4/zPTH6LaMXYR8ZWTZG1jAIGERERERERqXWcCYnY69fH5uNT4nnvFi3wadumxGkSbrfFgof/SUh+Fq3/8SiBvl5VXW6toIBBREREREREah1XQgKOyJJHL/wucPBgcjdvxpWWdsLxtz/bROzGL0jrfR4dL+xXlWXWKgoYKtkll1xCRkaGp8sQERERERGp05yJiXhFlLz+wu+ChwwBt5vsFSuOH9u8P43smTPwwiL22cequsxaRQFDJbEsC7fbzRdffEFISIinyxEREREREanTyjKCwadjR7waNTo+TSIjt5CX/r2Ywfu/o96oG/Fp1uxslFprKGA4Ay+//DLR0dFER0czdepU9u3bR8eOHbnjjjvo0aMHBw8epEWLFqSkpAAwadIkOnTowJAhQ7jhhhuYMmWKh59ARERERESk9nPn51OUkXHaEQzGGIKGDCZn7Vpc2dk8OP9Hhm+YjwkKpNGdd5ylamsPh6cLKI+E55+nYMfOSu3Tp2MHIh99tNTzmzdv5u2332bjxo1YlkWfPn0YOHAgu3bt4u2332bGjBkntI+Li+Pjjz9my5YtuFwuevToQc+ePSu1ZhERERERETmZK7F4i8rTjWCA4t0k0t75H1/852NSf0ihR9JuIh55GHu9elVdZq1TIwMGT1izZg1XXnklAQEBAFx11VWsXr2a5s2b07dv3xLb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\n", 262 | "text/plain": [ 263 | "
" 264 | ] 265 | }, 266 | "metadata": { 267 | "needs_background": "light" 268 | }, 269 | "output_type": "display_data" 270 | } 271 | ], 272 | "source": [ 273 | "from scipy import signal\n", 274 | "data=pd.to_numeric(price['close'])\n", 275 | "b, a = signal.butter(1, 0.1, 'lowpass') \n", 276 | "# b1, a1 = signal.butter(8, 0.1, 'lowpass') \n", 277 | "# wn=2*滤波频率/采样频率,如果是五日平均,则采用2*1/5=0.4\n", 278 | "meandata=data.rolling(10).mean().shift(-5)\n", 279 | "filtedData = signal.filtfilt(b, a, data) #data为要过滤的信号\n", 280 | "filtedData1 = signal.filtfilt(b, a, data[:-10]) #data为要过滤的信号\n", 281 | "plt.plot(filtedData[-100:],label='filter')\n", 282 | "plt.plot(filtedData1[-90:],label='filter')\n", 283 | "plt.plot(meandata.values[-100:],label='mean')\n", 284 | "plt.plot(data.values[-100:],label='orig')\n", 285 | "plt.legend()" 286 | ] 287 | }, 288 | { 289 | "cell_type": "code", 290 | "execution_count": null, 291 | "metadata": { 292 | "ExecuteTime": { 293 | "end_time": "2019-08-07T23:27:43.750018Z", 294 | "start_time": "2019-08-07T23:27:43.495314Z" 295 | } 296 | }, 297 | "outputs": [], 298 | "source": [] 299 | } 300 | ], 301 | "metadata": { 302 | "hide_input": false, 303 | "kernelspec": { 304 | "display_name": "Python 3", 305 | "language": "python", 306 | "name": "python3" 307 | }, 308 | "language_info": { 309 | "codemirror_mode": { 310 | "name": "ipython", 311 | "version": 3 312 | }, 313 | "file_extension": ".py", 314 | "mimetype": "text/x-python", 315 | "name": "python", 316 | "nbconvert_exporter": "python", 317 | "pygments_lexer": "ipython3", 318 | "version": "3.7.4" 319 | }, 320 | "latex_envs": { 321 | "LaTeX_envs_menu_present": true, 322 | "autoclose": false, 323 | "autocomplete": true, 324 | "bibliofile": "biblio.bib", 325 | "cite_by": "apalike", 326 | "current_citInitial": 1, 327 | "eqLabelWithNumbers": true, 328 | "eqNumInitial": 1, 329 | "hotkeys": { 330 | "equation": "Ctrl-E", 331 | "itemize": "Ctrl-I" 332 | }, 333 | "labels_anchors": false, 334 | "latex_user_defs": false, 335 | "report_style_numbering": false, 336 | "user_envs_cfg": false 337 | }, 338 | "toc": { 339 | "base_numbering": 1, 340 | "nav_menu": {}, 341 | "number_sections": true, 342 | "sideBar": true, 343 | "skip_h1_title": false, 344 | "title_cell": "Table of Contents", 345 | "title_sidebar": "Contents", 346 | "toc_cell": false, 347 | "toc_position": {}, 348 | "toc_section_display": true, 349 | "toc_window_display": false 350 | }, 351 | "varInspector": { 352 | "cols": { 353 | "lenName": 16, 354 | "lenType": 16, 355 | "lenVar": 40 356 | }, 357 | "kernels_config": { 358 | "python": { 359 | "delete_cmd_postfix": "", 360 | "delete_cmd_prefix": "del ", 361 | "library": "var_list.py", 362 | "varRefreshCmd": "print(var_dic_list())" 363 | }, 364 | "r": { 365 | "delete_cmd_postfix": ") ", 366 | "delete_cmd_prefix": "rm(", 367 | "library": "var_list.r", 368 | "varRefreshCmd": "cat(var_dic_list()) " 369 | } 370 | }, 371 | "types_to_exclude": [ 372 | "module", 373 | "function", 374 | "builtin_function_or_method", 375 | "instance", 376 | "_Feature" 377 | ], 378 | "window_display": false 379 | } 380 | }, 381 | "nbformat": 4, 382 | "nbformat_minor": 2 383 | } 384 | -------------------------------------------------------------------------------- /getstockcsv.py: -------------------------------------------------------------------------------- 1 | import newfeature 2 | import numpy as np 3 | import pandas as pd 4 | import tushare as ts 5 | import baostock as bs 6 | import talib 7 | import time 8 | import bcolz 9 | 10 | today=time.strftime('%Y-%m-%d',time.localtime(time.time())) 11 | 12 | def get_quantiles(data,x): 13 | bins=np.r_[-1e100,[np.round(np.quantile(data, i/x),3) for i in range(1,x)],1e100] # [负无穷,data中result这列的1,1/2,1/3...,正无穷] 14 | return bins 15 | 16 | def precode(c): #在代码后载入sz,sh,6开头代表上证,加sh.前缀 17 | return 'sh.'+c if c[0:1]=='6' else 'sz.'+c 18 | 19 | 20 | def cut_to1(alpha,minx=-1,maxx=1): 21 | alpha=alpha.copy() 22 | alpha[alpha>maxx]=maxx # 涨幅超过多少,则截取, 应当是在对异常值进行处理 23 | alpha[alpha50: 38 | 39 | result=result.sort_values('date').set_index('date').fillna(0) 40 | result=result[result['volume']!='0'] # 剔除交易量为0数据(即停牌日期数据) 41 | result=result[result['volume']!=''] 42 | result=result.astype('float32') 43 | if index==0: # 拿个股数据,才执行 44 | result=result[result['psTTM']>0] # 剔除动态市盈率小于0数据 45 | 46 | # 特征工程,通过老特征组合,获得新增特征 47 | # ??????? 48 | result['flowmkt']=0.637*np.arctan(np.log(0.00000001*result['close']*result['volume']/result['turn'])) 49 | result['everyprofit']=0.637*np.arctan(10/result.peTTM) 50 | result['turn']=0.637*np.arctan((result.turn/10)**0.2) 51 | result['everypb']=0.637*np.arctan(2/result.pbMRQ) 52 | result['eversale']=0.637*np.arctan(2/np.sqrt(result.psTTM)) 53 | result['evermoney']=0.637*np.arctan(20/result.pcfNcfTTM) 54 | result.fillna(0,inplace=True) 55 | # result.fillna(0,inplace=True) 56 | 57 | # result['p_change']=result['pctChg'] 58 | # print(symbol,result.shape) 59 | 60 | return result 61 | else: 62 | return [] 63 | 64 | def saveData(path,symbol,data,szzs,days,binscount,r=1,isfeature=1): 65 | """ 66 | path:文件存储路径 67 | symbol:股票代码 68 | data:个股数据 69 | szzs:上证指数数据 70 | days:默认为5,代表交易日 71 | 72 | 73 | """ 74 | #如果是用talib、newfeatures计算的数据,需要解除前120条数据 75 | data.dropna(axis=0,inplace=True) 76 | # data['amount']=0.25*(data.open+data.close+data.high+data.low)*data['volume'] 77 | data_price=data.values 78 | 79 | # 特征工程,组合生成新特征(有些特征往上证指数szzs数据加,又通过szzs新特征算出个股新特征,有些往个股数据加) 80 | data['szpctchg1']=18*szzs['close']/szzs['close'].shift(1)-18 # 今日收盘/昨日收盘 - 1 即18*(当日涨幅 - 1) 81 | data['szpctchg2']=19*szzs['close'].rolling(2).mean()/szzs['close'].shift(2)-19 # 19*(前3日收盘价均值(含当日)/前2日收盘价 - 1) 82 | data['szpctchg4']=10*szzs['close'].rolling(2).mean()/szzs['close'].shift(4)-10 # 10*(前3日收盘价均值(含当日)/前4日收盘价 - 1) 83 | data['szpctchg8']=10*szzs['close'].rolling(4).mean()/szzs['close'].shift(8)-10 # 10*(前4日收盘价均值(含当日)/前8日收盘价 - 1) 84 | data['szpctchg15']=8*szzs['close'].rolling(5).mean()/szzs['close'].shift(15)-8 85 | data['szpctchg30']=6*szzs['close'].rolling(10).mean()/szzs['close'].shift(30)-6 86 | 87 | 88 | szzs['sma5']=szzs['close'].rolling(5).mean() # 大盘5日均线 89 | szzs['sma10']=szzs['close'].rolling(10).mean() 90 | szzs['sma20']=szzs['close'].rolling(20).mean() 91 | szzs['sma40']=szzs['close'].rolling(40).mean() 92 | szzs['sma80']=szzs['close'].rolling(80).mean() 93 | 94 | szzs['max20']=szzs['high'].rolling(20).max().shift() # 大盘20日最高价 95 | szzs['max60']=szzs['high'].rolling(60).max().shift() 96 | szzs['max120']=szzs['high'].rolling(120).max().shift() 97 | 98 | szzs['min20']=szzs['low'].rolling(20).min().shift() # 大盘20日最低价 99 | szzs['min60']=szzs['low'].rolling(60).min().shift() 100 | szzs['min120']=szzs['low'].rolling(120).min().shift() 101 | 102 | data['zs20_min']=cut_to1(2*szzs['close']/szzs['min20']-2)### 大盘2倍的20日内较最低价的涨幅(涨幅超50截取,或跌幅超50%被截取) 103 | data['zs60_min']=cut_to1(2*szzs['close']/szzs['min60']-2)### 104 | data['zs120_min']=cut_to1(2*szzs['close']/szzs['min120']-2)### 105 | 106 | data['zs20_max']=cut_to1(4*szzs['close']/szzs['max20']-4)### 大盘4倍的20日内较最高价的跌幅(涨幅超过25%截取,跌幅超过25%截取) 107 | data['zs60_max']=cut_to1(4*szzs['close']/szzs['max60']-4)### 108 | data['zs120_max']=cut_to1(4*szzs['close']/szzs['max120']-4)### 109 | 110 | data['zs5_d']=cut_to1(20*szzs['sma5'].diff()/szzs['sma5'].shift()) # 大盘5日均线差分/昨日5日均线值,涨跌幅限制-5% ~ 5%截取 111 | data['zs10_d']=cut_to1(40*szzs['sma10'].diff()/szzs['sma10'].shift()) 112 | data['zs20_d']=cut_to1(60*szzs['sma20'].diff()/szzs['sma20'].shift()) 113 | data['zs40_d']=cut_to1(80*szzs['sma40'].diff()/szzs['sma40'].shift()) 114 | data['zs80_d']=cut_to1(100*szzs['sma80'].diff()/szzs['sma80'].shift()) 115 | 116 | data['zsr5']=cut_to1(10*szzs['close']/szzs['sma5']-10) # 大盘收盘价偏离5日均线的幅度,涨跌幅限制-10% ~ 10%截取 117 | data['zsr10']=cut_to1(8*szzs['close']/szzs['sma10']-8) 118 | data['zsr20']=cut_to1(6*szzs['close']/szzs['sma20']-6) 119 | data['zsr40']=cut_to1(6*szzs['close']/szzs['sma40']-6) 120 | data['zsr80']=cut_to1(4*szzs['close']/szzs['sma80']-4) 121 | 122 | szzs['r5_20']=(4*szzs['sma5']/szzs['sma20']-4) # 大盘5日均线偏离20日均线幅度,涨跌幅限制-25% ~ 25%截取 123 | szzs['r10_40']=(4*szzs['sma10']/szzs['sma40']-4) 124 | szzs['r20_80']=(4*szzs['sma20']/szzs['sma80']-4) 125 | szzs['r5_40']=(4*szzs['sma5']/szzs['sma40']-4) 126 | 127 | data['zsr5_20_d']=cut_to1(10*szzs['r5_20'].diff()) # 大盘5日均线较20日均线的偏移幅度的变化值,反应5日和20日均偏离的剧烈程度 128 | data['zsr10_40_d']=cut_to1(20*szzs['r10_40'].diff()) 129 | data['zsr20_80_d']=cut_to1(20*szzs['r20_80'].diff()) 130 | data['zsr5_20']=cut_to1(szzs['r5_20']) 131 | data['zsr10_40']=cut_to1(1*szzs['r10_40']) 132 | data['zsr20_80']=cut_to1(1*szzs['r20_80']) 133 | data['zsr5_40']=cut_to1(1*szzs['r5_40']) 134 | 135 | 136 | szzs['v5']=(10*szzs['volume']/(0.1+szzs['volume'].rolling(5).mean())) # 大盘交易量较5日均交易量均值偏移幅度,0.1是考虑到rolling前几个值为null 137 | szzs['v10']=(10*szzs['volume']/(0.1+szzs['volume'].rolling(10).mean())) # 衡量交易量较平均值异常增减的情况 138 | szzs['v20']=(10*szzs['volume']/(0.1+szzs['volume'].rolling(20).mean())) 139 | szzs['v40']=(10*szzs['volume']/(0.1+szzs['volume'].rolling(40).mean())) 140 | szzs['v80']=(10*szzs['volume']/(0.1+szzs['volume'].rolling(80).mean())) 141 | 142 | data['zsv3_9']=(10*szzs['volume'].rolling(3).mean()/(0.1+szzs['volume'].rolling(9).mean())) # 大盘3日交易量较9日均交易量偏移幅度 143 | data['zsv5_20']=(10*szzs['volume'].rolling(5).mean()/(0.1+szzs['volume'].rolling(20).mean())) 144 | data['zsv9_50']=(10*szzs['volume'].rolling(9).mean()/(0.1+szzs['volume'].rolling(50).mean())) 145 | 146 | data['zsv5_d']=0.6366*np.arctan(0.2*szzs['v5'].diff()) # 交易量较交易量均线的偏置幅度变化,衡量交易量的变动情况 147 | data['zsv10_d']=0.6366*np.arctan(0.1*szzs['v10'].diff()) # arctan()用于归一化,把任何取值范围数据压缩到0-1 148 | data['zsv20_d']=0.6366*np.arctan(0.2*szzs['v20'].diff()) # 为何用0.6366?????? 149 | data['zsv40_d']=0.6366*np.arctan(0.2*szzs['v40'].diff()) 150 | data['zsv80_d']=0.6366*np.arctan(0.2*szzs['v80'].diff()) 151 | 152 | data['zsv3_9_d']=0.6366*np.arctan(2*data['zsv3_9'].diff()) 153 | data['zsv5_20_d']=0.6366*np.arctan(2*data['zsv5_20'].diff()) 154 | data['zsv9_50_d']=0.6366*np.arctan(2*data['zsv9_50'].diff()) 155 | 156 | data['zsv3_9']=0.6366*np.arctan(0.2*data['zsv3_9']) 157 | data['zsv5_20']=0.6366*np.arctan(0.2*data['zsv5_20']) 158 | data['zsv9_50']=0.6366*np.arctan(0.2*data['zsv9_50']) 159 | data['zsv5']=0.6366*np.arctan(0.2*szzs['v5']) 160 | data['zsv10']=0.6366*np.arctan(0.2*szzs['v10']) 161 | data['zsv20']=0.6366*np.arctan(0.2*szzs['v20']) 162 | data['zsv40']=0.6366*np.arctan(0.2*szzs['v40']) 163 | data['zsv80']=0.6366*np.arctan(0.2*szzs['v80']) 164 | 165 | # 大盘收盘价macd 166 | szzs['dif'], szzs['dea'],szzs['hist'] = talib.MACD(szzs['close'].astype(float).values, fastperiod=12, slowperiod=26, signalperiod=9) 167 | data['zsdif']=cut_to1(0.01*szzs['dif']) # macd的dif线,上下限100截取 168 | data['zsdea']=cut_to1(0.01*szzs['dea']) 169 | 170 | data['zshist_d']=cut_to1(0.1*szzs['hist'].diff()) # macd红绿柱的差分 171 | data['zshist']=cut_to1(0.02*szzs['hist']) 172 | 173 | 174 | # 提取标签值 175 | for i in [2,4,7,10]:, 176 | data['result']=data['close'].shift(-i*r)/data['close']-1 # r=1,个股未来2日涨幅(收盘价算),4日后涨幅,7日后涨幅,10日后涨幅 177 | # data['result2zs']=data['result']-szzs['close'].shift(-i*r)/szzs['close'] 178 | data['resultmax']=data['close'].rolling(i*r).max().shift(-i*r)/data['close']-1 # 个股未来(2,4,7,10日)最高涨幅(收盘价算) 179 | data['resultmin']=data['close'].rolling(i*r).min().shift(-i*r)/data['close']-1 # 个股未来(2,4,7,10日)最大跌幅 180 | data['resultrel']=data['resultmax']+data['resultmin'] # 个股未来(2,4,7,10日)振幅 181 | remax=data['close'].rolling(i*r).max().shift(-i*r) # 个股未来(2,4,7,10日)最高价 182 | remin=data['close'].rolling(i*r).min().shift(-i*r) # 个股未来(2,4,7,10日)最低价 183 | reavg=remax-remin # 个股未来(2,4,7,10日)最高最低价差 184 | 185 | if i>2: 186 | # 每种标签值,对应不同的买入信号 187 | # 最高最低价均分5份or3份,收盘价低于最低价到1/5的值的权重为4,而1/5到1/3的值是2,中间是0,2/3到5/4的值是-2,4/5到1的值是-4 188 | buysignal=2*(data['close']<(remin+reavg/5))+2*(data['close']<(remin+reavg/3))-2*(data['close']>(remax-reavg/3))-2*(data['close']>(remax-reavg/5)) 189 | # 进一步约束买入信号,振幅要大于3%。然后如果振幅大于5%,且收盘价还在高低价差下方五分之一内,则buysignal所有权重再加1 190 | # 最前面加4,因为权重最小值就是4,相当于把权重全部转为正数 191 | data['resultbuy'+str(i)]=4+(reavg/data['close']>0.03)*(buysignal)+1*(reavg/data['close']>0.05)*(data['close']<(remin+reavg/5)) 192 | # data[(data['resultmax']-data['resultrel']/4)<0].loc[:,'buyorsale'+str(i)]=-1 193 | # 获取result的1,1/2,1/3...1/9分位值 194 | bins=get_quantiles(data['result'].dropna(),10) # data["result"]之前是依据shift获取,因此有null值 195 | data['resultclass'+str(i)]=pd.cut(data['result'], bins, right=False,labels=False) # 新建结果类别列,以历史涨幅走势来分类别 196 | # bins=get_quantiles(data['resultmin'].dropna(),10) 197 | # data['resultmin'+i]=pd.cut(data['resultmin'], bins, right=False,labels=False) 198 | # bins=get_quantiles(data['resultmax'].dropna(),10) 199 | # data['resultmax'+i]=pd.cut(data['resultmax'], bins, right=False,labels=False) 200 | bins=get_quantiles(data['resultrel'].dropna(),10) 201 | data['resultrelclass'+str(i)]=pd.cut(data['resultrel'], bins, right=False,labels=False) # 新建结果类别列,以历振幅走势来分类别 202 | 203 | if isfeature==0: 204 | ###这是不用feature的操作 205 | start=0 206 | data=data[start:].drop(['ma5','ma10','ma20','result','resultmax','resultmin','resultrel','peTTM','pbMRQ','psTTM', 207 | 'pcfNcfTTM','p_change','price_change'],axis=1) 208 | 209 | 210 | ###下面是用features的操作 211 | elif isfeature==1: 212 | start=120 213 | data=newfeature.getStockCharacter(data).astype('float16') 214 | # data=data[start:].drop(['ma5','ma10','ma20','v_ma5','v_ma10','v_ma20','result','p_change','price_change'],axis=1) 215 | data=data[start:].drop(['peTTM','pbMRQ','psTTM','pcfNcfTTM','result','resultmax','resultmin','resultrel'],axis=1) 216 | # data.drop(['pctChg'],axis=1,inplace=True) 217 | return data 218 | 219 | import os, tarfile 220 | #一次性打包整个根目录。空子目录会被打包。 221 | #如果只打包不压缩,将"w:gz"参数改为"w:"或"w"即可。 222 | def make_targz(output_filename, source_dir): 223 | with tarfile.open(output_filename, "w:gz") as tar: 224 | tar.add(source_dir, arcname=os.path.basename(source_dir)) 225 | #逐个添加文件打包,未打包空子目录。可过滤文件。 226 | #如果只打包不压缩,将"w:gz"参数改为"w:"或"w"即可。 227 | def make_targz_one_by_one(output_filename, source_dir): 228 | tar = tarfile.open(output_filename,"w:gz") 229 | for root,dir,files in os.walk(source_dir): 230 | for file in files: 231 | pathfile = os.path.join(root, file) 232 | tar.add(pathfile) 233 | tar.close() 234 | 235 | 236 | bs.login() 237 | 238 | 239 | 240 | path='/www/stocks/' 241 | path='/Users/hongyuouyang/python/finance/stockdata/' 242 | days=5 243 | r=1 244 | sequence_length=10 245 | stocks=ts.get_stock_basics().sort_index() 246 | stocks.to_csv(path+'stocks.csv') 247 | stocks=stocks.index.values 248 | 249 | # szzs=ts.get_hist_data('sh').sort_values('date') 250 | szzs=getbaostock('sh.000001','2016-01-01', today, 'D',1) 251 | j=0 252 | for symbol in stocks[:]: # symbol代表6位股票代码 253 | if not(os.path.exists(path+symbol)): 254 | 255 | # data=ts.get_hist_data(symbol) 256 | 257 | 258 | #拼合数据生成bcolz文件 259 | data=getbaostock(precode(symbol),'2016-01-01', today, 'D',0) # 返回该股票2016年至今的日K数据,df格式,包含十多项指标 260 | if data is None: 261 | print(symbol,'no data') 262 | else: 263 | if len(data) > 300: 264 | print(j,symbol,data.shape) 265 | j += 1 266 | data=data.sort_values('date') # 升序排列,日期从2016-现在排序 267 | datanew=saveData(path,symbol,data,szzs,days,10,r).astype('float16') 268 | if j==1: 269 | datanew.head(1).to_csv(path+'data.csv') 270 | 271 | datanew.to_csv(path+symbol+'.csv') # 保存每一只股票的数据到各自的csv文件(包含各种指标及特征) 272 | 273 | 274 | # make_targz('/www/wwwroot/fina.ouyanghome.com/public/stockdata.tar.gz', path) 275 | # print('data done') 276 | # bs.logout() 277 | 278 | #存磁盘 -------------------------------------------------------------------------------- /newfeature.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf8 -*- 2 | import pandas as pd 3 | import talib 4 | # import ta 5 | import numpy as np 6 | 7 | from scipy.stats import rankdata 8 | import scipy as sp 9 | 10 | from sklearn import preprocessing 11 | abs_scaler = preprocessing.MaxAbsScaler() 12 | import copy 13 | 14 | 15 | def sigmoid(X,useStatus): 16 | if useStatus: 17 | return 1.0 / (1 + np.exp((0.001*X))); 18 | else: 19 | return (X) 20 | 21 | 22 | # TSRANK 函数 23 | def func_rank(na): 24 | return rankdata(na)[-1]/rankdata(na).max() 25 | 26 | 27 | # DECAYLINEAR函数 28 | def func_decaylinear(na): 29 | n = len(na) 30 | decay_weights = np.arange(1,n+1,1) 31 | decay_weights = decay_weights / decay_weights.sum() 32 | 33 | return (na * decay_weights).sum() 34 | 35 | 36 | # HIGHDAY 函数 37 | def func_highday(na): 38 | return len(na) - na.argmax() 39 | 40 | 41 | # LOWDAY 函数 42 | def func_lowday(na): 43 | return len(na) - na.argmin() 44 | 45 | 46 | def cut_to1(alpha,minx=-1,maxx=1): 47 | alpha=alpha.copy() 48 | alpha[alpha>maxx]=maxx 49 | alpha[alphadf['open']) 105 | return df['sunup'] 106 | 107 | 108 | def upratio(df,days): 109 | df['sunup']=sunup(df) 110 | upratio=df['sunup'].rolling(days).sum()/days 111 | return upratio 112 | 113 | 114 | def trans_features(stockk): 115 | """该函数主要用于继续新增各种个股的特征,增加了各种常用技术指标入EMA,布林线等""" 116 | # stockk就是融合了各种特征列,标签列的df格式的data数据 117 | # stockk[['open','close','low','high']]=stockk[['open','close','low','high']]/stockk['close'].iloc[-1] 118 | 119 | # 特征工程,继续增加新特征 120 | stockk['preclose']=stockk['close'].shift() 121 | stockk['volume']=stockk['volume']/1000000 # 个股交易量数据缩放 122 | stockk['amount']=stockk['amount']/1000000 123 | stockk['pctChg']=cut_to1(8*stockk['close'].diff()/stockk['close'].shift()) # 当日涨幅 124 | # stockk['pctChg2']=(1+stockk['pctChg']).rolling(2).cumprod()-1 125 | stockk['pctChg2']=cut_to1(5*(stockk['close']/stockk['close'].shift(2))-5) # 过去2日涨幅 126 | stockk['pctChg4']=cut_to1(4*(stockk['close']/stockk['close'].shift(5))-4) 127 | stockk['pctChg8']=cut_to1(2*(stockk['close']/stockk['close'].shift(8))-2) 128 | stockk['pctChg15']=cut_to1(2*(stockk['close']/stockk['close'].shift(15))-2) 129 | stockk['pctChg30']=cut_to1(2*(stockk['close']/stockk['close'].shift(15))-2) 130 | stockk['avg_price']=stockk['amount']/(0.01+stockk['volume']) # 平均成交价,成交额/交易量 131 | 132 | stockk['sma5']=stockk['close'].rolling(5).mean() # 个股前5日均价 133 | stockk['sma10']=stockk['close'].rolling(10).mean() 134 | stockk['sma20']=stockk['close'].rolling(20).mean() 135 | stockk['sma40']=stockk['close'].rolling(40).mean() 136 | stockk['sma80']=stockk['close'].rolling(80).mean() 137 | 138 | stockk['max20']=stockk['high'].rolling(20).max().shift() # 个股前20日最高价(不含当日) 139 | stockk['max60']=stockk['high'].rolling(60).max().shift() 140 | stockk['max120']=stockk['high'].rolling(120).max().shift() 141 | 142 | stockk['min20']=stockk['low'].rolling(20).min().shift() # 个股前20日最低价(不含当日) 143 | stockk['min60']=stockk['low'].rolling(60).min().shift() 144 | stockk['min120']=stockk['low'].rolling(120).min().shift() 145 | 146 | stockk['20_min']=cut_to1(1*stockk['close']/stockk['min20']-0.9)### (个股20日内最大涨幅 + 10%),涨幅超110%,则截断。----10%有何用?????? 147 | stockk['60_min']=cut_to1(1*stockk['close']/stockk['min60']-0.9)### 148 | stockk['120_min']=cut_to1(1*stockk['close']/stockk['min120']-0.9)### 149 | 150 | stockk['20_max']=cut_to1(2*stockk['close']/stockk['max20']-2)### 2*(个股20日内最大跌幅), 跌幅超50%,则截断。 151 | stockk['60_max']=cut_to1(2*stockk['close']/stockk['max60']-2)### (即便昨天是max20,今天最多涨10%,不会截断) 152 | stockk['120_max']=cut_to1(2*stockk['close']/stockk['max120']-2)### 153 | 154 | stockk['5_d']=cut_to1(20*stockk['sma5'].diff()/stockk['sma5'].shift()) # 个股5日均线涨幅,±5%截断 155 | stockk['10_d']=cut_to1(40*stockk['sma10'].diff()/stockk['sma10'].shift()) 156 | stockk['20_d']=cut_to1(60*stockk['sma20'].diff()/stockk['sma20'].shift()) 157 | stockk['40_d']=cut_to1(80*stockk['sma40'].diff()/stockk['sma40'].shift()) 158 | stockk['80_d']=cut_to1(100*stockk['sma80'].diff()/stockk['sma80'].shift()) 159 | 160 | stockk['r5']=cut_to1(6*stockk['close']/stockk['sma5']-6) # 个股收盘价较5日均线偏移幅度(±16.6%截断) 161 | stockk['r10']=cut_to1(4*stockk['close']/stockk['sma10']-4) 162 | stockk['r20']=cut_to1(4*stockk['close']/stockk['sma20']-4) 163 | stockk['r40']=cut_to1(3*stockk['close']/stockk['sma40']-3) 164 | stockk['r80']=cut_to1(2*stockk['close']/stockk['sma80']-2) 165 | 166 | stockk['r5_20']=(3*stockk['sma5']/stockk['sma20']-3) # 个股5日均线较20日均线偏移幅度(下面语句会进行±33.3%截断) 167 | stockk['r10_40']=(2*stockk['sma10']/stockk['sma40']-2) 168 | stockk['r20_80']=(2*stockk['sma20']/stockk['sma80']-2) 169 | stockk['r5_40']=(2*stockk['sma5']/stockk['sma40']-2) 170 | 171 | stockk['r5_20_d']=cut_to1(10*stockk['r5_20'].diff()) # 5日20日均线偏移幅度变动量(±10%截断)----不太可能一天变动10%吧! 172 | stockk['r10_40_d']=cut_to1(20*stockk['r10_40'].diff()) 173 | stockk['r20_80_d']=cut_to1(20*stockk['r20_80'].diff()) 174 | 175 | stockk['r5_20']=cut_to1(stockk['r5_20']) # ±33.3%截断 176 | stockk['r10_40']=cut_to1(stockk['r10_40']) 177 | stockk['r20_80']=cut_to1(stockk['r20_80']) 178 | stockk['r5_40']=cut_to1(stockk['r5_40']) 179 | 180 | 181 | stockk['day_price'] = 0.5*(stockk['open']+stockk['close'])/stockk['volume'] # (开盘价-收盘价)的平均值除以交易量 182 | 183 | stockk['v5']=(10*stockk['volume']/(0.1+stockk['volume'].rolling(5).mean())) # 交易量/5日交易量均值,0.1是避免出现0交易量,导致报错 184 | stockk['v10']=(10*stockk['volume']/(0.1+stockk['volume'].rolling(10).mean())) 185 | stockk['v20']=(10*stockk['volume']/(0.1+stockk['volume'].rolling(20).mean())) 186 | stockk['v40']=(10*stockk['volume']/(0.1+stockk['volume'].rolling(40).mean())) 187 | stockk['v80']=(10*stockk['volume']/(0.1+stockk['volume'].rolling(80).mean())) 188 | 189 | stockk['v3_9']=(10*stockk['volume'].rolling(3).mean()/(0.1+stockk['volume'].rolling(9).mean())) # 交易量3日均/交易量9日均 190 | stockk['v5_20']=(10*stockk['volume'].rolling(5).mean()/(0.1+stockk['volume'].rolling(20).mean())) 191 | stockk['v9_50']=(10*stockk['volume'].rolling(9).mean()/(0.1+stockk['volume'].rolling(50).mean())) 192 | 193 | stockk['v5_d']=0.6366*np.arctan(0.1*stockk['v5'].diff()) # 用arctan()进行数据归一化,交易量过大,用0.1压一压,避难arctan()饱和 194 | stockk['v10_d']=0.6366*np.arctan(0.1*stockk['v10'].diff()) 195 | stockk['v20_d']=0.6366*np.arctan(0.1*stockk['v20'].diff()) 196 | stockk['v40_d']=0.6366*np.arctan(0.1*stockk['v40'].diff()) 197 | stockk['v80_d']=0.6366*np.arctan(0.1*stockk['v80'].diff()) 198 | 199 | stockk['v3_9_d']=0.6366*np.arctan(1*stockk['v3_9'].diff()) 200 | stockk['v5_20_d']=0.6366*np.arctan(1*stockk['v5_20'].diff()) 201 | stockk['v9_50_d']=0.6366*np.arctan(1*stockk['v9_50'].diff()) 202 | 203 | stockk['v3_9']=0.6366*np.arctan(0.1*stockk['v3_9']) 204 | stockk['v5_20']=0.6366*np.arctan(0.1*stockk['v5_20']) 205 | stockk['v9_50']=0.6366*np.arctan(0.1*stockk['v9_50']) 206 | 207 | stockk['v5']=0.6366*np.arctan(0.1*stockk['v5']) 208 | stockk['v10']=0.6366*np.arctan(0.1*stockk['v10']) 209 | stockk['v20']=0.6366*np.arctan(0.1*stockk['v20']) 210 | stockk['v40']=0.6366*np.arctan(0.1*stockk['v40']) 211 | stockk['v80']=0.6366*np.arctan(0.1*stockk['v80']) 212 | 213 | # 个股macd(12,26,9) 214 | stockk['dif'], stockk['dea'],stockk['hist'] = talib.MACD(stockk['close'].astype(float).values, fastperiod=12, slowperiod=26, signalperiod=9) 215 | stockk['dif']=cut_to1(0.7*stockk['dif']) # 个股dif截断怎么用1.42吗,超过1.42的dif就没了??? 216 | stockk['dea']=cut_to1(0.7*stockk['dea']) 217 | stockk['hist']=(1*stockk['hist']) 218 | 219 | stockk['hist_d']=cut_to1(4*stockk['hist'].diff()) 220 | stockk['hist']=cut_to1(stockk['hist']) 221 | 222 | 223 | #计算几个指标相对前收盘的涨幅 224 | stockk['highratio']=cut_to1(10*(stockk['high'])/stockk['close'].shift()-10.2) # 当日最高涨幅(为何设10.2???) 225 | stockk['lowratio']=cut_to1(10*(stockk['low'])/stockk['close'].shift()-9.8) 226 | stockk['openratio']=cut_to1(20*(stockk['open'])/stockk['close'].shift()-20) # 当日开盘涨幅(±5%截断,不合适吧,开盘涨停的没了???) 227 | 228 | #talib均线指标 229 | stockk['tema']=0.6366*np.arctan(0.1*talib.TEMA(stockk['close'],timeperiod=30)**0.5) # 三重移动平均线 230 | 231 | stockk['trima']=0.6366*np.arctan(0.1*talib.TRIMA(stockk['close'],timeperiod=30)**0.5) # 三角移动平均线 232 | 233 | stockk['wma']=0.6366*np.arctan(0.1*talib.WMA(stockk['close'],timeperiod=30)**0.5) # 加权移动平均线 234 | 235 | stockk['t3']=0.6366*np.arctan(0.1*talib.T3(stockk['close'],timeperiod=5, vfactor=0)**0.5) # 超短线使用的三重移动平均线 236 | 237 | #talib量价指标 238 | stockk['natr']=cut_to1(-0.2+0.1*talib.NATR(stockk['high'],stockk['low'],stockk['close'],timeperiod=14)) 239 | stockk['adline'] = 0.6366*np.arctan(0.005*talib.AD(stockk['high'],stockk['low'],stockk['close'],stockk['volume'])-0.5) 240 | stockk['adosc'] = 0.6366*np.arctan(0.1*talib.ADOSC(stockk['high'],stockk['low'],stockk['close'],stockk['volume'], fastperiod=3, slowperiod=10)) 241 | stockk['obv'] =0.6366*np.arctan(0.001*talib.OBV(stockk['close'],stockk['volume'])) 242 | 243 | ##静态指标 244 | stockk['beta'] = 0.6366*np.arctan(talib.BETA(stockk['high'],stockk['low'], timeperiod=5)) 245 | stockk['correl'] = cut_to1(-3*talib.CORREL(stockk['high'],stockk['low'], timeperiod=30)+3) 246 | stockk['linearreg'] = 0.6366*np.arctan(0.1*talib.LINEARREG(stockk['close'], timeperiod=14)-1) 247 | stockk['lineangle'] = 0.6366*np.arctan(0.1*talib.LINEARREG_ANGLE(stockk['close'], timeperiod=14)) 248 | # stockk['lineslope'] =0.1*talib.LINEARREG_SLOPE(stockk['close'], timeperiod=14) 249 | stockk['var'] = 0.6366*np.arctan(30*talib.VAR(stockk['close'], timeperiod=5,nbdev=1)) 250 | stockk['TSF'] = 0.6366*np.arctan(2*talib.TSF(stockk['close'], timeperiod=14)) 251 | stockk['lineintercept'] = 0.6366*np.arctan(0.05*talib.LINEARREG_INTERCEPT(stockk['close'], timeperiod=14)) 252 | stockk['stddev'] =cut_to1((talib.STDDEV(stockk['close'], timeperiod=5,nbdev=1))**0.25-1) 253 | 254 | ###动量指标 255 | stockk['sar'] = 0.6366*np.arctan(0.1*talib.SAR(stockk['high'], stockk['low'], acceleration=0, maximum=0)) 256 | stockk['adx'] = cut_to1(0.015*talib.ADX(stockk['high'],stockk['low'],stockk['close'], timeperiod=14)) 257 | stockk['adxr'] = cut_to1(0.015*talib.ADXR(stockk['high'],stockk['low'],stockk['close'],timeperiod=14)) 258 | stockk['apo'] = cut_to1(0.5*talib.APO(stockk['close'], fastperiod=12, slowperiod=26, matype=0)) 259 | stockk['ardown'], stockk['arup']= talib.AROON(stockk['high'],stockk['low'],timeperiod=14) 260 | stockk['ardown']=0.02*stockk['ardown']-1 261 | stockk['arup']=0.02*stockk['arup']-1 262 | stockk['arosc'] = 0.01*talib.AROONOSC(stockk['high'],stockk['low'],timeperiod=14) 263 | stockk['bop'] = talib.BOP(stockk['open'],stockk['high'],stockk['low'],stockk['close']) 264 | stockk['cci'] = 0.004*talib.CCI(stockk['high'],stockk['low'],stockk['close'],timeperiod=14) 265 | stockk['cci_d']=0.637*np.arctan(1*stockk['cci'].diff()/(0.1+stockk['cci'].shift())) 266 | 267 | return stockk 268 | 269 | 270 | def getStockCharacter(stock_data): 271 | # stockk=getK(stock_data) 272 | stockk=trans_features(stock_data) 273 | 274 | stockk=stockk.drop(['max20','max60','max120','min20','min60', 275 | 'min120','sma5','sma10','sma20','sma40','sma80', 276 | "volume",'preclose','amount','avg_price','day_price'],axis=1) 277 | #,'HO','OL','uppwer','downpwer' 278 | 279 | return stockk -------------------------------------------------------------------------------- /保存K线数据到数据库.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## 保存数据到mysql数据库,包含全部个股数据" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": { 13 | "ExecuteTime": { 14 | "end_time": "2019-08-08T11:36:30.955410Z", 15 | "start_time": "2019-08-08T11:36:30.952804Z" 16 | } 17 | }, 18 | "source": [ 19 | "### 基础引用初始化" 20 | ] 21 | }, 22 | { 23 | "cell_type": "code", 24 | "execution_count": 2, 25 | "metadata": { 26 | "ExecuteTime": { 27 | "end_time": "2019-10-20T07:15:14.676285Z", 28 | "start_time": "2019-10-20T07:15:14.195976Z" 29 | } 30 | }, 31 | "outputs": [], 32 | "source": [ 33 | "#常规引用\n", 34 | "import time\n", 35 | "import tushare as ts\n", 36 | "import pandas as pd\n", 37 | "import numpy as np\n", 38 | "import baostock as bs\n", 39 | "\n", 40 | "today=time.strftime('%Y-%m-%d',time.localtime(time.time()))\n" 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": 10, 46 | "metadata": { 47 | "ExecuteTime": { 48 | "end_time": "2019-10-20T07:15:15.947809Z", 49 | "start_time": "2019-10-20T07:15:15.855557Z" 50 | } 51 | }, 52 | "outputs": [], 53 | "source": [ 54 | "# from sqlalchemy import create_engine\n", 55 | "\n", 56 | "# #获取股票代码清\n", 57 | "# engine = create_engine(\"mysql+pymysql://{}:{}@{}/{}?charset={}\".format('root', 'qqq375701956', '127.0.0.1:3306', 'finance','utf8'))\n", 58 | "# conn = engine.connect()#创建连接\n" 59 | ] 60 | }, 61 | { 62 | "cell_type": "markdown", 63 | "metadata": {}, 64 | "source": [ 65 | "### baostock接口调用函数\n", 66 | "适用于多天数据为更新,所花时间较长\n", 67 | "\n" 68 | ] 69 | }, 70 | { 71 | "cell_type": "markdown", 72 | "metadata": {}, 73 | "source": [ 74 | "#### 获取股票列表" 75 | ] 76 | }, 77 | { 78 | "cell_type": "code", 79 | "execution_count": 11, 80 | "metadata": { 81 | "ExecuteTime": { 82 | "end_time": "2019-10-20T07:15:19.786504Z", 83 | "start_time": "2019-10-20T07:15:19.272555Z" 84 | }, 85 | "scrolled": true 86 | }, 87 | "outputs": [ 88 | { 89 | "data": { 90 | "text/html": [ 91 | "
\n", 92 | "\n", 105 | "\n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \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 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | "
nameindustryareapeoutstandingtotalstotalAssetsliquidAssetsfixedAssetsreserved...bvpspbtimeToMarketundpperundprevprofitgprnprholders
code
000001平安银行银行深圳9.61194.06194.0637076.830.00105.87808.16...13.821.13199104031152.935.9418.8015.470.0022.94299958.0
000002万 科A全国地产深圳12.5597.15113.0216387.6313581.85124.12119.31...14.801.8219910129981.548.6827.2130.4335.998.15290546.0
\n", 207 | "

2 rows × 22 columns

\n", 208 | "
" 209 | ], 210 | "text/plain": [ 211 | " name industry area pe outstanding totals totalAssets \\\n", 212 | "code \n", 213 | "000001 平安银行 银行 深圳 9.61 194.06 194.06 37076.83 \n", 214 | "000002 万 科A 全国地产 深圳 12.55 97.15 113.02 16387.63 \n", 215 | "\n", 216 | " liquidAssets fixedAssets reserved ... bvps pb timeToMarket \\\n", 217 | "code ... \n", 218 | "000001 0.00 105.87 808.16 ... 13.82 1.13 19910403 \n", 219 | "000002 13581.85 124.12 119.31 ... 14.80 1.82 19910129 \n", 220 | "\n", 221 | " undp perundp rev profit gpr npr holders \n", 222 | "code \n", 223 | "000001 1152.93 5.94 18.80 15.47 0.00 22.94 299958.0 \n", 224 | "000002 981.54 8.68 27.21 30.43 35.99 8.15 290546.0 \n", 225 | "\n", 226 | "[2 rows x 22 columns]" 227 | ] 228 | }, 229 | "execution_count": 11, 230 | "metadata": {}, 231 | "output_type": "execute_result" 232 | } 233 | ], 234 | "source": [ 235 | "\n", 236 | "stocks=ts.get_stock_basics().sort_index()\n", 237 | "stocks.head(2)" 238 | ] 239 | }, 240 | { 241 | "cell_type": "code", 242 | "execution_count": 12, 243 | "metadata": { 244 | "ExecuteTime": { 245 | "end_time": "2019-10-20T07:15:23.392378Z", 246 | "start_time": "2019-10-20T07:15:23.383645Z" 247 | } 248 | }, 249 | "outputs": [ 250 | { 251 | "name": "stdout", 252 | "output_type": "stream", 253 | "text": [ 254 | "(3747, 22)\n", 255 | "(3683, 22)\n" 256 | ] 257 | } 258 | ], 259 | "source": [ 260 | "print(stocks.shape)\n", 261 | "\n", 262 | "stocks=stocks[stocks.index.str[:3]!='688'] # 剔除科创板股票(688开头)\n", 263 | "print(stocks.shape)\n", 264 | "# stocks.index.str[0:1]" 265 | ] 266 | }, 267 | { 268 | "cell_type": "markdown", 269 | "metadata": {}, 270 | "source": [ 271 | "#### 调用接口函数" 272 | ] 273 | }, 274 | { 275 | "cell_type": "code", 276 | "execution_count": 22, 277 | "metadata": { 278 | "ExecuteTime": { 279 | "end_time": "2019-09-21T01:01:16.424265Z", 280 | "start_time": "2019-09-21T01:01:16.414424Z" 281 | }, 282 | "code_folding": [] 283 | }, 284 | "outputs": [], 285 | "source": [ 286 | "#调用接口函数\n", 287 | "def addcode(c): #在代码后载入sz,sh\n", 288 | " return c+'.sh' if c[0:1]=='6' else c+'.sz' \n", 289 | "def precode(c): #在代码后载入sz,sh\n", 290 | " return 'sh.'+c if c[0:1]=='6' else 'sz.'+c \n", 291 | "\n", 292 | "def getBaostock(pcode,start_date,end_date,datatype):\n", 293 | "# print(code)\n", 294 | " rs = bs.query_history_k_data_plus(pcode,\n", 295 | " \"date,code,close,open,low,high,preclose,volume,amount,turn,pctChg,peTTM,pbMRQ,psTTM,pcfNcfTTM,isST\", #preclose,turn,\n", 296 | " start_date=start_date, end_date=end_date,\n", 297 | " frequency=datatype, adjustflag=\"3\")#复权类型选择123\n", 298 | " #### 打印结果集 ####\n", 299 | " data_list = []\n", 300 | " while (rs.error_code == '0') & rs.next():\n", 301 | " # 获取一条记录,将记录合并在一起\n", 302 | " data_list.append(rs.get_row_data())\n", 303 | " df=pd.DataFrame(data_list, columns=rs.fields)\n", 304 | " df.close=pd.to_numeric(pd.to_numeric(df.close, downcast='float')*100,downcast='integer') # 收盘价*100转整型数\n", 305 | " df.open=pd.to_numeric(pd.to_numeric(df.open, downcast='float')*100,downcast='integer')\n", 306 | " df.low=pd.to_numeric(pd.to_numeric(df.low, downcast='float')*100,downcast='integer')\n", 307 | " df.high=pd.to_numeric(pd.to_numeric(df.high, downcast='float')*100,downcast='integer')\n", 308 | " df.preclose=pd.to_numeric(pd.to_numeric(df.preclose, downcast='float')*100,downcast='integer')\n", 309 | " df.turn=pd.to_numeric(df.turn, downcast='float')\n", 310 | " df['flowmkt']=0.001*df.close*df.volume/df.turn\n", 311 | " df['pctChg']=100*df.close/df.preclose-100\n", 312 | " df['ep']=100/pd.to_numeric(df.peTTM, downcast='float')\n", 313 | " df['eb']=100/pd.to_numeric(df.pbMRQ, downcast='float')\n", 314 | " df.amount=pd.to_numeric(df.amount, downcast='float')/10000\n", 315 | " df.volume=pd.to_numeric(df.volume,downcast='float')/10000\n", 316 | " df.fillna(method = 'ffill',inplace=True)\n", 317 | " df.dropna(inplace=True)\n", 318 | " return df" 319 | ] 320 | }, 321 | { 322 | "cell_type": "markdown", 323 | "metadata": {}, 324 | "source": [ 325 | "#### 依次添加baostock获取的数据到mysql\n" 326 | ] 327 | }, 328 | { 329 | "cell_type": "code", 330 | "execution_count": 23, 331 | "metadata": { 332 | "ExecuteTime": { 333 | "start_time": "2019-09-21T00:59:29.946Z" 334 | } 335 | }, 336 | "outputs": [], 337 | "source": [ 338 | "# def getStocksData(codes,start_date,issql=0):\n", 339 | "# dfdata=pd.DataFrame()\n", 340 | "# for code in codes:\n", 341 | "# # try:\n", 342 | "# df=getBaostock(precode(code),start_date,today,'d')\n", 343 | "# if issql==1:\n", 344 | "# if df.shape[0]>0 :\n", 345 | "# df['code']=code\n", 346 | "# df.to_sql(name='k'+code[0:4], con=conn, if_exists='append', index=False)\n", 347 | "\n", 348 | "# else:\n", 349 | "# print(code+' empty data')\n", 350 | "# else:\n", 351 | "# df=pd.DataFrame()\n", 352 | "# dfdata.append(df)\n", 353 | "# # except:\n", 354 | "# # print(code,'error')\n", 355 | " \n", 356 | "# import threading\n", 357 | "\n", 358 | "# start_time=time.time()\n", 359 | "# threads=[]\n", 360 | "# codes=stocks.index[:]\n", 361 | "# m=20\n", 362 | "# start_date='2010-01-01'\n", 363 | "# for i in range(1):\n", 364 | "# lg = bs.login()\n", 365 | "\n", 366 | "# threads.append(threading.Thread(target=getStocksData,args=(codes[i*m:i*m+m],start_date,1,)))\n", 367 | "# threads[i].start()\n", 368 | "# bs.logout()\n", 369 | "\n", 370 | "# thread2.join()\n", 371 | "\n", 372 | "# for i in range(4):\n", 373 | "# threads[i].join()\n", 374 | "# getStocksData(codes,issql=0)" 375 | ] 376 | }, 377 | { 378 | "cell_type": "code", 379 | "execution_count": 24, 380 | "metadata": { 381 | "ExecuteTime": { 382 | "end_time": "2019-09-21T01:07:57.225329Z", 383 | "start_time": "2019-09-21T01:07:55.458802Z" 384 | }, 385 | "code_folding": [] 386 | }, 387 | "outputs": [ 388 | { 389 | "name": "stdout", 390 | "output_type": "stream", 391 | "text": [ 392 | "login success!\n", 393 | "login respond msg:success\n", 394 | "0 2371.000000\n", 395 | "1 2330.000000\n", 396 | "2 2290.000000\n", 397 | "3 2265.000000\n", 398 | "4 2260.000000\n", 399 | " ... \n", 400 | "2399 1645.000122\n", 401 | "2400 1641.000000\n", 402 | "2401 1585.000000\n", 403 | "2402 1586.000000\n", 404 | "2403 1559.000000\n", 405 | "Name: close, Length: 2404, dtype: float32\n" 406 | ] 407 | }, 408 | { 409 | "ename": "TypeError", 410 | "evalue": "can't multiply sequence by non-int of type 'float'", 411 | "output_type": "error", 412 | "traceback": [ 413 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", 414 | "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", 415 | "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\ops\\__init__.py\u001b[0m in \u001b[0;36mna_op\u001b[1;34m(x, y)\u001b[0m\n\u001b[0;32m 967\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 968\u001b[1;33m \u001b[0mresult\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mexpressions\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mop\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstr_rep\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0meval_kwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 969\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 416 | "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\computation\\expressions.py\u001b[0m in \u001b[0;36mevaluate\u001b[1;34m(op, op_str, a, b, use_numexpr, **eval_kwargs)\u001b[0m\n\u001b[0;32m 220\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0muse_numexpr\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 221\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0m_evaluate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mop\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mop_str\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mb\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0meval_kwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 222\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0m_evaluate_standard\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mop\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mop_str\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mb\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 417 | "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\computation\\expressions.py\u001b[0m in \u001b[0;36m_evaluate_numexpr\u001b[1;34m(op, op_str, a, b, truediv, reversed, **eval_kwargs)\u001b[0m\n\u001b[0;32m 126\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mresult\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 127\u001b[1;33m \u001b[0mresult\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m_evaluate_standard\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mop\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mop_str\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mb\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 128\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", 418 | "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\computation\\expressions.py\u001b[0m in \u001b[0;36m_evaluate_standard\u001b[1;34m(op, op_str, a, b, **eval_kwargs)\u001b[0m\n\u001b[0;32m 69\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0merrstate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mall\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m\"ignore\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 70\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mop\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mb\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 71\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", 419 | "\u001b[1;31mTypeError\u001b[0m: can't multiply sequence by non-int of type 'float'", 420 | "\nDuring handling of the above exception, another exception occurred:\n", 421 | "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", 422 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 12\u001b[0m \u001b[1;31m# print(i,'of',len(stocks),code)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 13\u001b[0m \u001b[1;31m# try:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 14\u001b[1;33m \u001b[0mdf\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mgetBaostock\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprecode\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcode\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mstart_date\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mtoday\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'd'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 15\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 16\u001b[0m \u001b[0mdf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcode\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mcode\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 423 | "\u001b[1;32m\u001b[0m in \u001b[0;36mgetBaostock\u001b[1;34m(pcode, start_date, end_date, datatype)\u001b[0m\n\u001b[0;32m 24\u001b[0m \u001b[0mdf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpreclose\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mto_numeric\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mto_numeric\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpreclose\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdowncast\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'float'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m*\u001b[0m\u001b[1;36m100\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mdowncast\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'integer'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 25\u001b[0m \u001b[0mdf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mturn\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mto_numeric\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mturn\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdowncast\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'float'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 26\u001b[1;33m \u001b[0mdf\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'flowmkt'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m0.001\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mdf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mclose\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mdf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvolume\u001b[0m\u001b[1;33m/\u001b[0m\u001b[0mdf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mturn\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 27\u001b[0m \u001b[0mdf\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'pctChg'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m100\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mdf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mclose\u001b[0m\u001b[1;33m/\u001b[0m\u001b[0mdf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpreclose\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m100\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 28\u001b[0m \u001b[0mdf\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'ep'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m100\u001b[0m\u001b[1;33m/\u001b[0m\u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mto_numeric\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpeTTM\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdowncast\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'float'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 424 | "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\ops\\__init__.py\u001b[0m in \u001b[0;36mwrapper\u001b[1;34m(left, right)\u001b[0m\n\u001b[0;32m 1046\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1047\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0merrstate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mall\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m\"ignore\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1048\u001b[1;33m \u001b[0mresult\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mna_op\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlvalues\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrvalues\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1049\u001b[0m return construct_result(\n\u001b[0;32m 1050\u001b[0m \u001b[0mleft\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mresult\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mindex\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mleft\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mname\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mres_name\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mNone\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 425 | "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\ops\\__init__.py\u001b[0m in \u001b[0;36mna_op\u001b[1;34m(x, y)\u001b[0m\n\u001b[0;32m 968\u001b[0m \u001b[0mresult\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mexpressions\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mop\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstr_rep\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0meval_kwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 969\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 970\u001b[1;33m \u001b[0mresult\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mmasked_arith_op\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mop\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 971\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 972\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mmissing\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdispatch_fill_zeros\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mop\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mresult\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 426 | "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\ops\\__init__.py\u001b[0m in \u001b[0;36mmasked_arith_op\u001b[1;34m(x, y, op)\u001b[0m\n\u001b[0;32m 445\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mmask\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0many\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 446\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0merrstate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mall\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m\"ignore\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 447\u001b[1;33m \u001b[0mresult\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mmask\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mop\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mxrav\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mmask\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcom\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalues_from_object\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0myrav\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mmask\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 448\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 449\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 427 | "\u001b[1;31mTypeError\u001b[0m: can't multiply sequence by non-int of type 'float'" 428 | ] 429 | } 430 | ], 431 | "source": [ 432 | "### 登陆系统 ####\n", 433 | "lg = bs.login()\n", 434 | "# 显示登陆返回信息\n", 435 | "start_date='2010-01-01'\n", 436 | "print('login respond msg:'+lg.error_msg)\n", 437 | "i=0\n", 438 | "symbols=stocks.index[:2]\n", 439 | "# symbols=['']\n", 440 | "for code in symbols:\n", 441 | " i+=1\n", 442 | "# if i%100==0:\n", 443 | "# print(i,'of',len(stocks),code)\n", 444 | "# try:\n", 445 | " df=getBaostock(precode(code),start_date,today,'d')\n", 446 | " print(df)\n", 447 | " df.code=code\n", 448 | " print(df)\n", 449 | "\n", 450 | " if df.shape[0]>0:\n", 451 | " df.to_sql(name='k'+code[0:4], con=conn, if_exists='append', index=False)\n", 452 | " # df.to_csv(code+'.csv')\n", 453 | " # mcodes.append(code)\n", 454 | " else:\n", 455 | " print(code+' empty data')\n", 456 | "# except:\n", 457 | "# print(code,'error')\n", 458 | "bs.logout()\n", 459 | "df.head()" 460 | ] 461 | }, 462 | { 463 | "cell_type": "markdown", 464 | "metadata": {}, 465 | "source": [ 466 | "### 获取tushare当日全部数据到mysql\n", 467 | "适用于当日数据更新,所花时间较短" 468 | ] 469 | }, 470 | { 471 | "cell_type": "code", 472 | "execution_count": null, 473 | "metadata": { 474 | "ExecuteTime": { 475 | "end_time": "2019-08-11T13:52:47.508085Z", 476 | "start_time": "2019-08-11T13:52:11.078734Z" 477 | } 478 | }, 479 | "outputs": [], 480 | "source": [ 481 | "kdata=ts.get_today_all()\n", 482 | "jdata=kdata[['code','trade','open','settlement','low','high','turnoverratio','volume','amount']]\n", 483 | "jdata.columns=['code','close','open','preclose','low','high','turn','volume','amount'] # 列名不一样,重新设置一下\n", 484 | "jdata['date']=today\n", 485 | "# jdata.to_csv(today+'.csv')\n" 486 | ] 487 | }, 488 | { 489 | "cell_type": "code", 490 | "execution_count": null, 491 | "metadata": { 492 | "ExecuteTime": { 493 | "end_time": "2019-08-11T13:53:05.263038Z", 494 | "start_time": "2019-08-11T13:53:05.168443Z" 495 | }, 496 | "scrolled": true 497 | }, 498 | "outputs": [], 499 | "source": [ 500 | "# jdata=kdata[['code','trade','open','settlement','low','high','turnoverratio','volume','amount']]\n", 501 | "# jdata.columns=['code','close','open','preclose','low','high','turn','volume','amount']\n", 502 | "# jdata['date']=today\n", 503 | "# jdata['date']='2019-08-09'\n", 504 | "jdata.head()\n" 505 | ] 506 | }, 507 | { 508 | "cell_type": "code", 509 | "execution_count": null, 510 | "metadata": { 511 | "ExecuteTime": { 512 | "end_time": "2019-08-11T13:53:38.222560Z", 513 | "start_time": "2019-08-11T13:53:16.487770Z" 514 | } 515 | }, 516 | "outputs": [], 517 | "source": [ 518 | "for i in range(jdata.shape[0]):\n", 519 | " if i%500==1:\n", 520 | " print(i , 'of',jdata.shape[0],jdata.code[i])\n", 521 | "# print(jdata.code[i])\n", 522 | " jdata.iloc[i:i+1].to_sql(name='k'+jdata.code[i][0:4], con=conn, if_exists='append', index=False)" 523 | ] 524 | }, 525 | { 526 | "cell_type": "markdown", 527 | "metadata": {}, 528 | "source": [ 529 | "## 保存各类指数数据到数据库" 530 | ] 531 | }, 532 | { 533 | "cell_type": "code", 534 | "execution_count": null, 535 | "metadata": { 536 | "ExecuteTime": { 537 | "end_time": "2019-08-18T07:24:20.376007Z", 538 | "start_time": "2019-08-18T07:24:20.371426Z" 539 | }, 540 | "code_folding": [] 541 | }, 542 | "outputs": [], 543 | "source": [ 544 | "##调用接口函数\n", 545 | "### 登陆系统 ####\n", 546 | "def get_index(codes,start_date):\n", 547 | " lg = bs.login()\n", 548 | " for code in codes:\n", 549 | " # 显示登陆返回信息\n", 550 | " df=getBaostock(code,start_date,today)\n", 551 | " df.code=code\n", 552 | "\n", 553 | " if df.shape[0]>0:\n", 554 | " df.to_sql(name='k'+code[:4].replace('.',''), con=conn, if_exists='append', index=False)\n", 555 | " else:\n", 556 | " print(code+' empty data')\n", 557 | " bs.logout()\n", 558 | " print('save to mysql ok')\n", 559 | "\n" 560 | ] 561 | }, 562 | { 563 | "cell_type": "code", 564 | "execution_count": null, 565 | "metadata": { 566 | "ExecuteTime": { 567 | "end_time": "2019-08-08T12:32:46.455232Z", 568 | "start_time": "2019-08-08T12:32:46.382107Z" 569 | }, 570 | "code_folding": [] 571 | }, 572 | "outputs": [], 573 | "source": [ 574 | "# aindxname=pd.read_csv(u'/Users/hongyuouyang/python/finance/indexname.csv')\n", 575 | "# aindxname.to_sql(name='indexname', con=conn, if_exists='append', index=False)\n" 576 | ] 577 | }, 578 | { 579 | "cell_type": "code", 580 | "execution_count": null, 581 | "metadata": { 582 | "ExecuteTime": { 583 | "end_time": "2019-08-18T07:24:43.031708Z", 584 | "start_time": "2019-08-18T07:24:22.837224Z" 585 | } 586 | }, 587 | "outputs": [], 588 | "source": [ 589 | "start_date='2019-01-01'\n", 590 | "\n", 591 | "aindxname=pd.read_sql('select * from indexname',con=conn)\n", 592 | "get_index(aindxname.code.values,start_date)" 593 | ] 594 | } 595 | ], 596 | "metadata": { 597 | "hide_input": false, 598 | "kernelspec": { 599 | "display_name": "Python 3", 600 | "language": "python", 601 | "name": "python3" 602 | }, 603 | "language_info": { 604 | "codemirror_mode": { 605 | "name": "ipython", 606 | "version": 3 607 | }, 608 | "file_extension": ".py", 609 | "mimetype": "text/x-python", 610 | "name": "python", 611 | "nbconvert_exporter": "python", 612 | "pygments_lexer": "ipython3", 613 | "version": "3.7.4" 614 | }, 615 | "latex_envs": { 616 | "LaTeX_envs_menu_present": true, 617 | "autoclose": false, 618 | "autocomplete": true, 619 | "bibliofile": "biblio.bib", 620 | "cite_by": "apalike", 621 | "current_citInitial": 1, 622 | "eqLabelWithNumbers": true, 623 | "eqNumInitial": 1, 624 | "hotkeys": { 625 | "equation": "Ctrl-E", 626 | "itemize": "Ctrl-I" 627 | }, 628 | "labels_anchors": false, 629 | "latex_user_defs": false, 630 | "report_style_numbering": false, 631 | "user_envs_cfg": false 632 | }, 633 | "toc": { 634 | "base_numbering": 1, 635 | "nav_menu": {}, 636 | "number_sections": true, 637 | "sideBar": true, 638 | "skip_h1_title": false, 639 | "title_cell": "Table of Contents", 640 | "title_sidebar": "Contents", 641 | "toc_cell": false, 642 | "toc_position": {}, 643 | "toc_section_display": true, 644 | "toc_window_display": false 645 | }, 646 | "varInspector": { 647 | "cols": { 648 | "lenName": 16, 649 | "lenType": 16, 650 | "lenVar": 40 651 | }, 652 | "kernels_config": { 653 | "python": { 654 | "delete_cmd_postfix": "", 655 | "delete_cmd_prefix": "del ", 656 | "library": "var_list.py", 657 | "varRefreshCmd": "print(var_dic_list())" 658 | }, 659 | "r": { 660 | "delete_cmd_postfix": ") ", 661 | "delete_cmd_prefix": "rm(", 662 | "library": "var_list.r", 663 | "varRefreshCmd": "cat(var_dic_list()) " 664 | } 665 | }, 666 | "types_to_exclude": [ 667 | "module", 668 | "function", 669 | "builtin_function_or_method", 670 | "instance", 671 | "_Feature" 672 | ], 673 | "window_display": false 674 | } 675 | }, 676 | "nbformat": 4, 677 | "nbformat_minor": 2 678 | } 679 | --------------------------------------------------------------------------------