构建分析用历史库(tushare+163)

构建分析用历史库(tushare+163),备份一下。

# -*- coding: utf-8 -*-
"""
Created on Sat May  9 20:40:25 2020

@author: xwga

1功能:构建分析用历史库,所有股票的日k线,包含上市(L)、退市(D)和停盘(P)的股票。
2信息来源:163
3程序架构:
main()
  pop_stock('D')
     codes=get_codelist()
     for(codes):
        df = get_daily(code)
        insert_sql(code,df,'stock_daily')

4.小问题:
  pd.to_sql小缺点,不能重复,重复不好区分 
  好在构建一次也就不到一个小时,如果是做分析用,过个几天,重新删除后新建一个也可以
  有个参数转换,可能会有些小问题,比如T00018,好像没获取到

"""

import tushare as ts
import pandas as pd  
from datetime import datetime
from time import sleep


#设置token
pro = ts.pro_api('输入你的token')

from sqlalchemy import create_engine
engine = create_engine('sqlite:///stock163.db')
def insert_sql(code,data,db_name,if_exists='append'):
    #使用try...except..continue避免出现错误,运行崩溃
    try:
        data.to_sql(db_name,engine,index=False,if_exists=if_exists)
        print(code,'写入数据库成功')
    except:
        print('写入数据库error')
        pass


def get_163code(code):
    if code[0]=='6':
        str1='0'+code[0:6]
    else:
        str1='1'+code[0:6]
    return str1
    

def get_daily(code,start='19900101',end=''):
    '''
    专门用于个股,自动转换了代码
    沪市前面加0,
    深市前面加1,
    比如0000001,是上证指数,1000001是中国平安
    '''
    code163=get_163code(code)
    url_mod="http://quotes.money.163.com/service/chddata.html?code=%s&start=%s&end=%s"
    url=url_mod%(code163,start,end)
    df=pd.read_csv(url, encoding = 'gb2312')
    return df


def get_codelist(st):
    codes = pro.stock_basic(list_status=st).ts_code.values
    #print(codes)
    return codes

def pop_stock(st):
    stock_lists=get_codelist(st)
    #print(len(stock_lists))
    
    i=0    
    for code in stock_lists:   
        df = get_daily(code)
        insert_sql(code,df,'stock_daily')
        i=i+1
        if i%10==0:
            print(i,code)
            #sleep(0.1)         #暂停秒数,要是ip被限制,下次把这个时间搞大一点
    print("ok")
    
def main():
    t_start=datetime.now()
    pop_stock('P')      #停盘的股票
    pop_stock('D')      #退市的股票,大概100多个#
    #pop_stock('L')     #正常上市交易的股票,一般大概3000多个
    t_end=datetime.now()
    print("耗时:",(t_end-t_start))

    
if __name__ =='__main__':
    main()




#以下测试或者备用
def get_index(code,start='19900101',end=''):
    '''
    专门用于指数,代码需要自己组合,一般也就上证指数等几个,辛苦一下吧。
    沪市前面加0,
    深市前面加1,
    比如0000001,是上证指数,1000001是中国平安
    '''
    url_mod="http://quotes.money.163.com/service/chddata.html?code=%s&start=%s&end=%s"
    url=url_mod%(code,start,end)
    df=pd.read_csv(url, encoding = 'gb2312')
    return df

def read_stock():
    df=pd.read_sql('stock_daily',engine)
    print(df)
    return df

def test1():
    df=get_daily('000001')     # 平安银行
    print(df)

def test2():
    df=get_index('000001')     # 获取上证指数   
    print(df)



 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值