财力雄厚的投资者,可以选择收费的商业数据库,比如万得,恒生聚源等。优点是数据全,更新及时,缺点就是贵。当然,这个时代对于普通投资者已经相当友好,可以免费或者以较低的价格获得质量不错的数据。
这里推荐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
第二步,把场内基金日线、场外基金的净值数据,同步到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
搞定,后面可以用于投资分析。
(公众号: 七年实现财富自由(ailabx),用数字说基金,用基金做投资组合,践行财富自由之路)