欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-13 17:54:59
...

构建分析用历史库(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)



 

 

相关标签: 01大数据