1. 說(shuō)明
股票數(shù)據(jù)無(wú)需每次都從網(wǎng)上下載,像日線級(jí)別的歷史數(shù)據(jù)會(huì)常常用到,使用多線程下載一般也需要幾個(gè)小時(shí),最好存儲(chǔ)到本地,除了已有的特征值,還有清洗后的數(shù)據(jù),和計(jì)算出的新特征值,以及需要與其它程序共享數(shù)據(jù)。相對(duì)于數(shù)據(jù)文件,使用數(shù)據(jù)庫(kù)更合適。
本文介紹pandas(數(shù)據(jù)結(jié)構(gòu)支持)通過(guò)sqlalchemy與數(shù)據(jù)庫(kù)連接,存儲(chǔ)tushare下載的日線數(shù)據(jù),用一套代碼操作不同數(shù)據(jù)庫(kù)(Mysql/sqlite)。
2. 安裝數(shù)據(jù)庫(kù)
1) Sqlalchemy工具
$ pip install sqlalchemy
2) Mysql數(shù)據(jù)庫(kù)
$ sudo apt-get install mysql-server
$ sudo apt-get install mysql-client
$ mysql -u root –p
mysql> create database stock # 建立名為stock的數(shù)據(jù)庫(kù),之后程序中會(huì)用到
mysql> show databases; # 顯示已有的數(shù)據(jù)庫(kù)
3) Sqlite數(shù)據(jù)庫(kù)
$ sudo apt install sqlite3
$ sqlite stock.db # stock.db是數(shù)據(jù)庫(kù)文件,將在運(yùn)行示例程序時(shí)生成
sqlite > .tables # 查看數(shù)據(jù)表
sqlite > select * from s002230; # 遍歷表s002230中的數(shù)據(jù)
(也可使用圖形界面工具sqliteman查看數(shù)據(jù)庫(kù))
3. 程序
# -*- coding: utf-8 -*-
import tushare as ts
from sqlalchemy import create_engine
import pandas as pd
#ADDR = 'mysql://root:1234@localhost:3306/stock?charset=utf8' # 使用mysql,用戶(hù)名root,密碼1234,庫(kù)名為stock,端口3306為mysql默認(rèn)端口
ADDR = 'sqlite:///stock.db' # 使用sqlite,當(dāng)前目錄的stock.db作為數(shù)據(jù)庫(kù)文件
engine = create_engine(ADDR)
stocklist = ['002230','601318']
def save(code):
print "save code:",code
try:
df = ts.get_h_data(code, start='1990-01-01', retry_count = 5)
df = df.sort_index(ascending=True)
name = 's'+code
df.to_sql(name, engine, if_exists='fail')
except:
print code, " save failed"
for i in range(0, len(stocklist)):
save(stocklist[i])
4. 其它
1) 運(yùn)行SQL語(yǔ)句
sqlalchemy也支持直接運(yùn)行SQL語(yǔ)句,形如:
result = engine.execute(‘select * from stock’)
使用sqlalchemy后,除了方便與pandas中的數(shù)據(jù)對(duì)接以外,也基本屏蔽了不同數(shù)據(jù)庫(kù)之間的差異,換庫(kù)時(shí)無(wú)需大量調(diào)整代碼,十分方便。
2) 多線程下載
歷史日線數(shù)據(jù)量較大,可使用python中的multiprocessing.dummy.Pool多線程下載。
3) 從數(shù)據(jù)庫(kù)中讀出數(shù)據(jù)
和to_sql相對(duì)的是read_sql,它可以從數(shù)據(jù)庫(kù)中讀出數(shù)據(jù),并轉(zhuǎn)換成DataFrame的格式。具體使用形如:
stocklist = pd.read_sql('table1',engine) # 其中stocklist是DataFrame格式數(shù)據(jù),pd是import pandas as pd,table1是庫(kù)名,engine同上例一樣,指向數(shù)據(jù)庫(kù)。