在为金融数据发愁?现在建立自己的金融数据库,只需要2步

财力雄厚的投资者,可以选择收费的商业数据库,比如万得,恒生聚源等。优点是数据全,更新及时,缺点就是贵。当然,这个时代对于普通投资者已经相当友好,可以免费或者以较低的价格获得质量不错的数据。

这里推荐tushare的专业版,可以通过积分方式调取数据,具体大家去网站上看。

今天主要带大家把股票、基金(场内、场外)、可转债、指数的基本信息入到mongo库里。

这里选择mongo库的一个原因,它不需要schema,所以可以存储结构不一样的数据。上述几种类型的证券,基础信息的字段并不完全相同。

#从ts导入数据
import tushare as ts
from common.mongo_utils import get_db

def build_basic_from_ts():
    pro = ts.pro_api('your token')
    db = get_db()
    #股票信息
    df = pro.stock_basic(exchange='', list_status='L')
    df['_id'] = df['ts_code']
    df['basic_type'] = 'stock'
    try:
        db['basic'].insert_many(df.to_dict(orient='records'), ordered=False)
    except:
        pass

    #场内基金
    df = pro.fund_basic(market='E')
    df['_id'] = df['ts_code']
    df['basic_type'] = 'fund_e'
    try:
        db['basic'].insert_many(df.to_dict(orient='records'), ordered=False)
    except:
        pass

    #场外基金
    df = pro.fund_basic(market='O', status='L', offset=0)
    df_more = pro.fund_basic(market='O', status='L', offset=9999)
    df = df.append(df_more)
    df['_id'] = df['ts_code']
    df['basic_type'] = 'fund_o'
    try:
        db['basic'].insert_many(df.to_dict(orient='records'), ordered=False)
    except:
        pass

    #可转债
    df = pro.cb_basic()
    df['_id'] = df['ts_code']
    df['basic_type'] = 'cb'
    try:
        db['basic'].insert_many(df.to_dict(orient='records'), ordered=False)
    except:
        pass

    #指数
    for cat in ['MSCI', 'CSI', 'SSE', 'SZSE', 'CICC', 'SW', 'OTH']:
        df = pro.index_basic(market=cat)
        df['_id'] = df['ts_code']
        df['basic_type'] = 'index'
        try:
            db['basic'].insert_many(df.to_dict(orient='records'), ordered=False)
        except:
            pass

在为金融数据发愁?现在建立自己的金融数据库,只需要2步_第1张图片

第二步,把场内基金日线、场外基金的净值数据,同步到mongo。

#当单证券导入日线
def build_daily(code):
    #取daily表里已有的日期
    db = get_db()
    item = db['basic'].find_one({'_id': code})
    basic_type = item['basic_type']

    daily = list(db['daily'].find({'ts_code': code}).sort('trade_date', pymongo.DESCENDING).limit(1))
    if daily:
        start_date = daily[0]['trade_date']
    else:
        #basic_type=fund_o,fund_e
        date_col = 'found_date'
        if basic_type == 'stock':
            date_col = 'listdate'
        start_date = item[date_col]

    date = datetime.strptime(start_date,'%Y%m%d')
    date = date - timedelta(days=3)
    start_date = date.strftime('%Y%m%d')

    if basic_type == 'fund_o':
        df = pro.fund_nav(ts_code=code, start_date=start_date)
        df['trade_date'] = df['end_date']
    elif basic_type == 'fund_e':
        start_year = int(start_date[:4])
        years = range(start_year, datetime.now().year + 1)
        for y in years:
            df = pro.fund_daily(ts_code=code, start_date=str(y) + '0101', end_date=str(y) + '1231')
            df['_id'] = df['ts_code'] + '_' + df['trade_date']
            df_adj = pro.fund_adj(ts_code=code, start_date=str(y) + '0101', end_date=str(y) + '1231')
            df_all = pd.concat([df, df_adj], axis=1)
            try:
                db['daily'].insert_many(df_all.to_dict(orient='records'), ordered=False)
            except:
                pass
            return
    elif basic_type == 'stock':
        df = pro.daily(ts_code=code, start_date=start_date)

    df['_id'] = df['ts_code'] + '_' + df['trade_date']
    try:
        db['daily'].insert_many(df.to_dict(orient='records'), ordered=False)
    except:
        pass

在为金融数据发愁?现在建立自己的金融数据库,只需要2步_第2张图片

搞定,后面可以用于投资分析。

(公众号: 七年实现财富自由(ailabx),用数字说基金,用基金做投资组合,践行财富自由之路)

你可能感兴趣的:(建立自己的算法交易事业)