Python使用TuShare将股票数据保存到Oracle数据

TuShare是个获取股票数据的模块包,我们进行分析,需要将股票数据保存到本地,避免每次都从网上获取,由于本机装有ORCALE,以ORACLE为例介绍如何保存股票数据到本地。

一、大致思路:我们先获取沪深的所有股票信息,保存到数据库中,主要使用的是dataframe的to_sql函数。

to_sql(self, name, con, flavor='sqlite', schema=None, if_exists='fail',
               index=True, index_label=None, chunksize=None, dtype=None):

if_exists参数值有三个,fail:如果表存在返回,append:在表后面追加数据;replace:把表替换掉

二、具体实现:

1、股票价格明细表

create table IQ_STOCK
(
  op_time      VARCHAR2(10),
  open         FLOAT,
  high         FLOAT,
  close        FLOAT,
  low          FLOAT,
  volume       FLOAT,
  price_change FLOAT,
  p_change     FLOAT,
  ma5          FLOAT,
  ma10         FLOAT,
  ma20         FLOAT,
  v_ma5        FLOAT,
  v_ma10       FLOAT,
  v_ma20       FLOAT,
  turnover     FLOAT,
  stockid      VARCHAR2(10),
  ktype        VARCHAR2(1)
)

2、股票基本信息表

create table IQ_STOCK_BASE
(
  code               VARCHAR2(10),
  name               VARCHAR2(100),
  industry           VARCHAR2(100),
  area               VARCHAR2(100),
  pe                 FLOAT,
  outstanding        FLOAT,
  totals             FLOAT,
  "totalAssets"      FLOAT,
  "liquidAssets"     FLOAT,
  "fixedAssets"      FLOAT,
  reserved           FLOAT,
  "reservedPerShare" FLOAT,
  esp                FLOAT,
  bvps               FLOAT,
  pb                 FLOAT,
  "timeToMarket"     NUMBER(19),
  undp               FLOAT,
  perundp            FLOAT,
  rev                FLOAT,
  profit             FLOAT,
  gpr                FLOAT,
  npr                FLOAT,
  holders            NUMBER(19)
)

3、先获取股票的基本信息:

def Get_Stock_List():
    ##取得股票基本信息
    df = ts.get_stock_basics()
    #股票数据保存
    engine = create_engine('oracle+cx_oracle://user:password@localhost/orcl')
    cnx = engine.connect()   
    ##先清空
    strSql = 'truncate table iq_stock_base'
    cnx.execute(strSql)
    df.to_sql('iq_stock_base', cnx,if_exists='append',chunksize=500)   
    cnx.close()
    return df

4、更新近30天的K线数据,此处更新的是周K线

def Update_StockData():
    ##开始日期 format:YYYY-MM-DD 为空时取到API所提供的最早日期数据
    p_start=time.strftime('%Y-%m-%d',time.localtime(time.time()-24*60*60*30))
    p_ktype='W'
    #股票数据保存
    engine = create_engine('oracle+cx_oracle://user:password@localhost/orcl')
    cnx = engine.connect() 
   
    #取出股票基本数据
    result=pd.read_sql('select * from iq_stock_base',cnx)
    for row in result['code']:
        try:
            ##避免重复先删除
            strSql = 'delete from iq_stock where stockid=\'{}\' and ktype=\'{}\' and op_time>=\'{}\''.format(row,p_ktype,p_start)
            cnx.execute(strSql)
            df=ts.get_hist_data(code=row,start=p_start,ktype=p_ktype)

            ##索引列是oracle保留关键字,必须改名
            df.index.names = ['op_time']
            df['STOCKID']= row
            df['ktype']= p_ktype
            df.to_sql('iq_stock', cnx,if_exists='append') 
            print('code:{}'.format(row)) 
        except:
            print('Exception',":",row)
       
    cnx.close()

posted @ 2016-12-30 14:19  Tony(iHqq)  阅读(3505)  评论(0编辑  收藏  举报