您的位置 首页 配资技巧

配资平台 关于利用Tushare构建自己的股票数据库

关于使用Tushare构建自己的股票数据库

1.安装MongoDB数据库

2.抢占股票市场数据

3.建立股票池并观察性能

安装MongoDB数据库

作为非关系数据库,MongoDB非常适合存储我们的股票数据,因为在适当的时候,我们的数据采用键值对形式股票行情导入数据库,并且格式并不完全一致。您可以访问MongoDB官方网站下载下载URL。安装完成后,您可以下载名为MongoDBCompass的可视化操作软件​​。我们可以对像Navicat这样的数据进行操作。这是我存储的一些相关数据。

在这里插入图片描述

获取股票个市场数据

在这种情况下,我们首先需要连接到相关数据库并导入tushare包,

from pymongo import MongoClient
DB_CONN = MongoClient('mongodb://localhost:27017')['quant']

连接1.后,我们可以使用接口pro.trade_cal()存储交易日期。在获取交易日期之后,我们需要每天通过pro.daily()接口获取股票市场数据。

def crawl_stock_trade_days(self, start_date = None, end_date = None):
    exchanges = ['SSE', 'SZSE']
    update_requests = []
    for exchange in exchanges:
        df_trade_days = pro.trade_cal(exchange = exchange, start_date = start_date, end_date = end_date)
        # print(df_trade_days)
        for index in df_trade_days.index:
            doc = dict(df_trade_days.loc[index])
            doc['is_open'] = int(doc['is_open'])
            # print(type(doc['is_open']))
            update_requests.append(
                UpdateOne({'exchange': exchange, 'cal_date': doc['cal_date']},
                          {'$set': doc},
                          upsert= True))
            # print(update_requests)
        if len(update_requests) > 0:
            update_result = self.db['trade_cal'].bulk_write(update_requests, ordered= False)
            print('保存了股票的交易数据, 交易所:%s, 插入:%4d, 更新: %4d'
              %(exchange, update_result.upserted_count, update_result.modified_count), flush= True)

2.当然股票行情导入数据库,我们也可以根据股票抓取数据,但是这时,我们需要使用函数pro.basic(),此接口可以返回股票的所有代码,您可以遍历股票代码以获取相关功能。

def crawl_stock(self, autype = None, start_date = None, end_date = None):
        df_stock = pro.stock_basic()
        codes = list(df_stock.ts_code)[list(df_stock.ts_code).index('000501.SZ'):]
        # print(codes)
        update_requests = []
        for code in codes:
            df_daily = ts.pro_bar(ts_code = code, adj= autype, start_date = start_date, end_date = end_date)
            for index in df_daily.index:
                doc = dict(df_daily.loc[index])
                doc['index'] = False
                update_requests.append(
                    UpdateOne({'ts_code':code,'trade_date': doc['trade_date'], 'index': False},
                        {'$set': doc},
                        upsert= True ))
            if len(update_requests) > 0:
                collections = 'daily' if autype == None else 'daily_' + autype
                update_result = self.db[collections].bulk_write(update_requests, ordered=False)
                print('保存了股票的日行情数据,autype:%s,index:%s, 插入:%4d, 更新:%4d '
                      % (autype,code, update_result.upserted_count, update_result.modified_count), flush=True)
            time.sleep(2)

3.关于指数,我们可以使用以下函数捕获上证综合指数,沪深300配资公司,沪深500等。

def crawl_index(self, start_date = None, end_date = None):
   codes = ['000001.SH', '000300.SH', '399001.SZ', '388005.SZ','399006.SZ' ]
   # codes = ['000001.SH']
   update_requests = []
   for code in codes:
       # print(code)
       df_daily = pro.index_daily(ts_code = code, start_date = start_date, end_date = end_date)
       for index in df_daily.index:
           doc = dict(df_daily.loc[index])
           doc['index'] = True
           # print(doc)
           update_requests.append(
               UpdateOne({'ts_code':code,'trade_date': doc['trade_date'], 'index': True},
                   {'$set': doc},
                   upsert= True ))
       if len(update_requests) > 0:
           update_result = self.db['daily'].bulk_write(update_requests, ordered= False)
           print('保存了指数的日行情数据,index:%s, 插入:%4d, 更新:%4d '
                 % (code, update_result.upserted_count, update_result.modified_count), flush= True)

建立股票池

存储股票数据后,我们可以尝试构建股票池并使用本地数据观察股票池的性能。在此之前配资炒股,我们需要编写一些接口来调用这些数据。

我们尝试根据pro.daily_basic接口的pe_ttm数据构建一个低PE 股票池。代码如下

def stock_pool(start_date, end_date):
    adjust_date_codes_dict = {}
    
    #获取指定日期所有交易日
    all_dates = get_trade_days(start_date = start_date, end_date = end_date)
    
    #上一期的股票代码
    last_phase_codes = []
    #调整日期是7天
    adjust_interval = 7
    #所有的调整日
    all_adjust_dates = []
    
    for _index in range(0, len(all_dates), adjust_interval):
        adjust_date = all_dates[_index]
        all_adjust_dates.append(adjust_date)
        
#         print('调整日期: %s' % adjust_date, flush=True)
        
        df = pro.daily_basic(trade_date = adjust_date)
        df = df.sort_values('pe_ttm')
        codes = [code for code in df.ts_code[:100]]
        
        # 本期股票列表 
        this_phase_codes = []
        
        #查询出
        if len(last_phase_codes) > 0:
            suspension_cursor = db.daily.find( {'ts_code': {'$in': last_phase_codes}, 'trade_date': adjust_date, 'is_trading': False}, projection={'ts_code': True})
            
            suspension_codes = [x['ts_code'] for x in suspension_cursor]
            
            # 保留股票池中正在停牌的股票 
            this_phase_codes = suspension_codes
#             print('上期停牌', flush=True) 
#             print(this_phase_codes, flush=True)
            
        # 用新的股票将剩余位置补齐 
        this_phase_codes += codes[0: 100 - len(this_phase_codes)] 
        # 将本次股票设为下次运行的时的上次股票池 
        last_phase_codes = this_phase_codes
        # 建立该调整日和股票列表的对应关系 
        adjust_date_codes_dict[adjust_date] = this_phase_codes
#         print('最终出票', flush=True) 
#         print(this_phase_codes, flush=True)
#     print(all_adjust_dates)
    # 返回结果 
    return all_adjust_dates, adjust_date_codes_dict
def find_out_stocks(last_phase_codes, this_phase_codes): 
    
    out_stocks = []
    for code in last_phase_codes:
        if code not in this_phase_codes: 
            out_stocks.append(code)
            
    return out_stocks
def evaluate_stock_pool(start_date = start_date, end_date = end_date):
    adjust_dates, codes_dict = stock_pool(start_date = start_date, end_date = end_date)
    
    df_profit = pd.DataFrame(columns=['profit','hs300'])
    df_profit.loc[adjust_dates[0]] = {'profit': 0, 'hs300': 0}
    hs300_begin_value = db.daily.find_one({'ts_code': '000300.SH', 'index': True, 'trade_date': adjust_dates[0]})['close']
    
    # 通过净值计算累计收益 
    net_value = 1
    for _index in range(1, len(adjust_dates) - 1):
        last_adjust_date = adjust_dates[_index - 1] 
        current_adjust_date = adjust_dates[_index]
        # 获取上一期的股票池 
        codes = codes_dict[last_adjust_date]
        
        # 构建股票代码和后复权买入价格的股票 
        code_buy_close_dict = dict() 
        buy_daily_cursor = db.daily.find( {'ts_code': {'$in': codes}, 'trade_date': last_adjust_date}, projection={'close': True, 'ts_code': True, 'adj_factor':True}) 
        for buy_daily in buy_daily_cursor:
            code = buy_daily['ts_code']
            code_buy_close_dict[code] = buy_daily['close'] * buy_daily['adj_factor']
            
        # 获取到期的股价
        sell_daily_cursor = db.daily.find( {'ts_code': {'$in': codes}, 'trade_date': current_adjust_date}, projection={'close': True, 'ts_code': True, 'adj_factor':True})
        
        # 计算单期收益
        profit_sum = 0 
        count = 0 
        for sell_daily in sell_daily_cursor: 
            code = sell_daily['ts_code']
            if code in code_buy_close_dict: 
                buy_close = code_buy_close_dict[code] 
                sell_close = sell_daily['close'] * sell_daily['adj_factor']
                profit_sum += (sell_close - buy_close) / buy_close
                count += 1
                
        if count > 0: 
            profit = round(profit_sum / count, 4)
            
            hs300_close = db.daily.find_one({'ts_code': '000300.SH', 'index': True, 'trade_date': current_adjust_date})['close']
            
            # 计算净值和累积收益
            net_value = net_value * (1 + profit) 
            df_profit.loc[current_adjust_date] = { 
                'profit': round((net_value - 1) , 4), 'hs300': round((hs300_close - hs300_begin_value)  / hs300_begin_value, 4)}
            
    # 绘制曲线 
    df_profit.plot(title='Stock Pool Evaluation Result', kind='line', figsize = (12,8)) 
    # 显示图像 
    plt.show()

在这里插入图片描述

我们发现所选池股票的性能优于基准测试。

通过本地数据库进行相关研究,可以确保程序的速度,并且不易受到网络不稳定的影响。稍后,我们将继续通过本地数据库进行相关研究。

关于作者: 股票配资

热门文章

发表评论

邮箱地址不会被公开。 必填项已用*标注