コード例 #1
0
def checkStockVolumn(begin, end, step, startDate, endDate):
    counter = 0
    result = []
    start = 0
    curTotal = end - begin
    engine = DBUtils.db_connection()
    while begin <= end:
        if (begin <= Utils.MAXSZ):
            szSpecial = Utils.change_sz_code(begin)
            start = szSpecial
        else:
            start = str(begin)
        currentRs = DBUtils.db_read_k_history_inc(start, engine, startDate,
                                                  endDate)
        tmpResult = DataAnalysis.check_by_vols(start, currentRs)
        if tmpResult is not None:
            result.append(tmpResult)
        begin = begin + step
        counter = counter + 1
        if (counter % 100 == 0):
            Utils.print_progess(counter, curTotal)
    print(result)
    result_frame = pandas.DataFrame(result)

    filename = SAVE_FILE_PATH + 'from ' + startDate + 'to ' + endDate
    if os.path.exists(filename):
        result_frame.to_csv(filename, mode='a', header='None')
    else:
        result_frame.to_csv(filename)
    return result
コード例 #2
0
def do_save_basics_pre(share_code, time_to_market):
    engine = DBUtils.db_connection()
    cur_date = Utils.get_current_date()
    change_time = time_to_market
    while change_time < cur_date:
        next_year = Utils.get_next_year(change_time)
        logger.debug('prepare to save next time range data....change_time=' +
                     str(change_time) + 'next_year=' + str(next_year))
        DBUtils.save_stock_h_data(engine, share_code, change_time, next_year)
        change_time = Utils.get_next_day(Utils.get_next_year(change_time))
コード例 #3
0
def get_boll_result(rs):
    day = Utils.BOLL_DAY
    k = 2
    # print("rs=============")
    # print(rs)
    '''计算前day天的平均值'''
    tmp_ma = rs[u'close'].rolling(window=day).mean().tail(1).iloc[0]
    ma = round(tmp_ma, 2)
    # print('ma========'+str(ma))
    '''标准差'''
    # print("tmp_md============")
    # print(np.array(rs[u'close'].rolling(window=day).std()))
    tmp_md = rs[u'close'].rolling(window=day).std().tail(1).iloc[0]
    md = round(tmp_md, 2)
    # print('md========'+str(md))
    '''计算前day-1天的平均值'''
    # tmp_mb = np.array(rs[u'close'].rolling(day - 1).mean().tail(2).head(1)).tolist()
    # print('tmp_mb=============')
    # print(rs[u'close'].rolling(window=day - 1).mean())
    to_cal_mb = np.array(rs[u'close']).tolist()
    # tmp_mb = rs[u'close'].rolling(window=day - 1).mean().tail(1).iloc[0]
    tmp_mb = Utils.cal_std_dev(to_cal_mb)
    mb = round(tmp_mb, 2)
    # print('mb========='+str(mb))
    # print("mb,k,md======="+str(mb)+' '+str(k)+' '+str(md))
    up = round(mb + k * md, 2)
    # print(up)
    dn = round(mb - k * md, 2)
    # print(dn)
    print("up,ma,dn======" + str(up) + ' ' + str(ma) + ' ' + str(dn))
    return up, ma, dn
コード例 #4
0
def save_data(begin, end, step, start_date, end_date):
    counter = 0
    cur_total = end - begin
    print("start db connection")
    engine = db_connection()
    print("end db connection")
    while begin <= end:
        if begin <= Utils.MAXSZ:
            sz_special = Utils.change_sz_code(begin)
            start = sz_special
        else:
            start = str(begin)
        db_save(engine, start, start_date, end_date, 'k_his_data')
        begin = begin + step
        counter = counter + 1
        if counter % 100 == 0:
            Utils.print_progess(counter, cur_total)
コード例 #5
0
    def sell_share(self, share_numbers, share_price):
        if self.is_enough_shares() is True:
            return

        self.ware_house += share_numbers * share_price
        self.share_value -= share_numbers * share_price
        self.share_numbers -= share_numbers
        self.counter = self.counter - 1
        self.last_kick = 'sell'
        self.last_kick_day = Utils.get_current_date()
コード例 #6
0
 def __init__(self, ware_house, share_code):
     self.ware_house = ware_house
     self.share_code = share_code
     self.share_value = 0
     self.share_price = 0
     self.share_numbers = 0
     self.counter = 0
     self.last_kick = 'buy/sell'
     self.last_kick_day = Utils.get_current_date()
     '''logger配置'''
     logging.config.fileConfig('logging.conf')
     self.logger = logging.getLogger(__name__)
コード例 #7
0
def get_stock_basics():
    basics = pd.DataFrame(ts.get_stock_basics())
    '''更改timeToMarket格式为2018-01-01'''
    time_to_market_list = list(basics[u'timeToMarket'])
    begin = 0
    end = len(time_to_market_list)
    to_replace_list = []
    while begin < end:
        orign_date = str(time_to_market_list[begin])
        # old_date=time_to_market_list[begin]
        logger.debug("old_date:::::::" + str(orign_date))
        begin = begin + 1
        if orign_date == '0':
            to_replace_list.append('0')
            continue
        convert_date = Utils.change_date_format(orign_date)
        to_replace_list.append(convert_date)
    basics['timeToMarketNew'] = to_replace_list

    return basics
コード例 #8
0
    def buy_share(self, buy_value, share_price):
        is_have = self.is_enough_money(buy_value)
        '''检查持仓货币是否足够,如果不足够提示退出'''
        if is_have is not True:
            print("Error!!!, There is not enough money to buy shares")
            return False
        if self.last_kick == 'buy':
            trigger = (self.share_price - share_price) / self.share_price
            if trigger < 0.05:
                self.logger.info('Not to trigger to buy')
                return False
        # price_trigger=round(self.share_price*0.91,2)
        # if share_price > price_trigger and self.share_value!=0:
        #     print("Error!!! Not have to trigger the 0.91 line!")
        #     return False
        '''购买股票,向下取整'''
        cur_share_numbers = (buy_value // (share_price * 100)) * 100
        self.counter = self.counter + 1
        self.ware_house -= cur_share_numbers * share_price
        self.last_kick = 'buy'
        self.last_kick_day = Utils.get_current_date()
        '''
           计算持仓成本
           STEP1:计算持仓股票当前市值 当前价格*持有数量
           STEP2:本次购买市值  当前价格*本次购买数量
           STEP3:计算平均成本  (持仓市值+本次购买市值)/持有数量
        '''
        # tmp_price=(self.share_value + cur_share_numbers * share_price) / (self.share_numbers + cur_share_numbers)

        self.share_value += cur_share_numbers * share_price
        pre_buy_value = self.share_price * self.share_numbers
        self.share_numbers += cur_share_numbers
        self.share_price = round(
            (pre_buy_value + cur_share_numbers * share_price) /
            self.share_numbers, 2)
        # self.share_price = round(self.share_value / self.share_numbers, 2)

        return cur_share_numbers
コード例 #9
0
def market_simulate(ware_house, share_code, start_date, end_date):
    result = []
    mm = MoneyMaker.MoneyMaker(ware_house, share_code)
    engine = DBUtils.db_connection()
    fronter_date = Utils.get_front_day(start_date, 60)
    print('fronter_date=' + fronter_date)
    rs = DBUtils.db_read_k_history_des(share_code, engine, fronter_date,
                                       end_date)
    trade_cal = DBUtils.read_trad_cal(engine)
    # print("rs:::::::::::::::::::::::::")
    # print(rs)
    cur_date = start_date
    '''买入日期,如果前一天买入,第二天触发买入条件则不买入'''
    # sell_day = Utils.get_current_date()
    '''卖出日期,如果前一天卖出,第二天触发卖出条件则不卖出'''
    # buy_day = Utils.get_current_date()
    while cur_date <= end_date:
        is_today_open = trade_cal.loc[trade_cal[u'calendarDate'] ==
                                      cur_date].iloc[0, 2]
        # is_yesterday_open=np.array(trade_cal.loc[trade_cal[u'calendarDate']==Utils.get_front_day(cur_date,1)][u'isOpen']).tolist()[0]
        logger.debug('begin:::::::::::::' + str(cur_date))
        '''获取当前日期前的集合'''
        temp_rs = rs.loc[(rs[u'date'] < cur_date)]
        # print("temp_rs====================")
        # print(temp_rs)
        '''从当前日期前的集合获取排序前20个的集合'''
        days = Utils.BOLL_DAY
        filter_rs = temp_rs.iloc[0:days]
        # print("filter_rs==================")
        # print(filter_rs)
        (up, mi, dn) = get_boll_result(filter_rs)
        '''看当天日期,如果为休市状态,则跳到下一日'''
        if is_today_open == Utils.CLOSE_SALE:
            cur_date = Utils.get_next_day(cur_date)
            continue

        tmp_today = rs.loc[(rs[u'date'] == cur_date)]
        yest_tmp = Utils.get_front_day(cur_date, 1)
        # is_yesterday_open = \
        #     np.array(trade_cal.loc[trade_cal[u'calendarDate'] == yest_tmp][u'isOpen']).tolist()[
        #         0]
        is_yesterday_open = trade_cal.loc[trade_cal[u'calendarDate'] ==
                                          yest_tmp].iloc[0, 2]
        '''如果前一个交易日不开市,一直往前找到最近一个交易日'''
        while is_yesterday_open != Utils.OPEN_SALE:
            yest_tmp = Utils.get_front_day(yest_tmp, 1)
            is_yesterday_open = trade_cal.loc[trade_cal[u'calendarDate'] ==
                                              yest_tmp].iloc[0, 2]

        tmp_yesterday = rs.loc[(rs[u'date'] == yest_tmp)]
        # today_info = np.array(tmp_today[u'close']).tolist()[0]
        # today_info = tmp_today.iloc[0,3]
        close_price = round(tmp_today.iloc[0, 3], 4)
        # yesterday_info = np.array(tmp_yesterday[u'close']).tolist()[0]
        close_yesterday = round(tmp_yesterday.iloc[0, 3], 4)
        # close_yesterday = round(yesterday_info, 4)

        logger.debug('close_yesterday::::::::::::' + str(close_yesterday))
        logger.debug('close_price::::::::::::' + str(close_price))
        logger.debug("MainProcess:::::up,mi,dn======" + str(up) + ' ' +
                     str(mi) + ' ' + str(dn))
        logger.debug(close_price)
        # print(temp_date)
        is_up_or_down = check_k_trend(close_yesterday, close_price)
        if is_up_or_down == Utils.TREND_DOWN:
            '''现根据当天close价格刷新市值'''
            mm.refresh_market_price(close_price)
            # cur_today=Utils.get_current_frontday(1)
            if 0 <= close_price - mi < 0.1:
                ware_house = mm.mm_buy_policy()
                buy_result = mm.buy_share(ware_house, close_price)
                # buy_day = Utils.get_current_date()
                if buy_result:
                    logger.info("buy=========date:" + cur_date + "price:" +
                                str(close_price) + "buy stock:" +
                                str(ware_house))
                    logger.info("mm value:" + mm.print_moneymaker())
            if 0 <= close_price - dn < 0.1:
                ware_house = mm.mm_buy_policy()
                buy_result = mm.buy_share(ware_house, close_price)
                if buy_result:
                    logger.info("buy=========date:" + cur_date + "price:" +
                                str(close_price) + "buy stock:" +
                                str(ware_house))
                    logger.info("mm value:" + mm.print_moneymaker())
        elif is_up_or_down == Utils.TREND_UP:
            """清仓时删除趋势判断"""
            if up - close_price <= 0.1 or close_price > up:
                sell_numbers = mm.mm_sell_policy()
                '''现根据当前价位刷新市值'''
                mm.refresh_market_price(close_price)
                mm.sell_share(sell_numbers, close_price)
                logger.info("sell=========date:" + cur_date + "price:" +
                            str(close_price) + "sell stock:" +
                            str(sell_numbers))
                logger.info("mm value:" + mm.print_moneymaker())
            if mi - close_price <= 0.1 or close_price > mi:
                sell_numbers = mm.mm_sell_policy()
                mm.refresh_market_price(close_price)
                mm.sell_share(sell_numbers, close_price)
                logger.info("sell=========date:" + cur_date + "price:" +
                            str(close_price) + "sell stock:" +
                            str(sell_numbers))
                logger.info("mm value:" + mm.print_moneymaker())

        mm.refresh_market_price(close_price)
        result.append(mm.share_value + mm.ware_house)
        cur_date = Utils.get_next_day(cur_date)
        logger.debug('end:::::::' + str(cur_date))
    logger.debug("total result+" + str(result))
    return result
コード例 #10
0
def get_current_boll(share_code, start_date):
    return get_boll(share_code, start_date, Utils.get_current_date())
コード例 #11
0
def save_index_data(begin_date):
    save_index_data_end_date(begin_date, Utils.get_current_date())
コード例 #12
0
def save_data_current_day(begin, end, step):
    save_data_from_now_on(begin, end, step, Utils.get_current_date())
コード例 #13
0
def save_data_from_now_on(begin, end, step, start_date):
    save_data(begin, end, step, start_date, Utils.get_current_date())
コード例 #14
0
def db_read(code, start_date, engine):
    rs = db_read_k_history(code, engine, start_date, Utils.get_current_date(), 'asc')
    return rs
コード例 #15
0
def do_save_basics_batch():
    engine = DBUtils.db_connection()
    basic_info_rs = DBUtils.get_stock_basics(engine)
    logger.info('get basic info total::::' + str(basic_info_rs.count()))
    share_code_list = list(basic_info_rs[u'code'])
    # time_to_market_list=list(basic_info_rs[u'timeToMarketNew'])
    counter = 0
    end = len(share_code_list)
    while counter <= end:
        threads = []
        '''第一个线程'''
        share_code = share_code_list[counter]
        time_to_market = Utils.get_pre_year(Utils.get_current_date())
        # time_to_market=time_to_market_list[counter]
        logger.debug("prepare to run:::::share_code=" + str(share_code) +
                     "time_to_market=" + str(time_to_market))
        # t1=threading.Thread(target=do_save_basics_pre, args=(share_code,time_to_market))
        do_save_basics_pre(share_code, time_to_market)
        # threads.append(t1)

        # counter=counter+1
        # if counter > end:
        #     logger.info("out of end!!! end="+end+'counter='+counter)
        # else:
        #     '''第二个线程'''
        #     share_code = share_code_list[counter]
        #     time_to_market = time_to_market_list[counter]
        #     t2=threading.Thread(target=do_save_basics_pre, args=(share_code,time_to_market))
        #     threads.append(t2)
        #
        # counter = counter + 1
        # if counter > end:
        #     logger.info("out of end!!! end=" + end + 'counter=' + counter)
        #     break
        # else:
        #     '''第三个线程'''
        #     share_code = share_code_list[counter]
        #     time_to_market = time_to_market_list[counter]
        #     t3 = threading.Thread(target=do_save_basics_pre, args=(share_code, time_to_market))
        #     threads.append(t3)
        #
        # counter = counter + 1
        # if counter > end:
        #     logger.info("out of end!!! end=" + end + 'counter=' + counter)
        #     break
        # else:
        #     '''第5个线程'''
        #     share_code = share_code_list[counter]
        #     time_to_market = time_to_market_list[counter]
        #     t5 = threading.Thread(target=do_save_basics_pre, args=(share_code, time_to_market))
        #     threads.append(t5)
        #
        #
        # counter = counter + 1
        # if counter > end:
        #     logger.info("out of end!!! end=" + end + 'counter=' + counter)
        #     break
        # else:
        #     '''第6个线程'''
        #     share_code = share_code_list[counter]
        #     time_to_market = time_to_market_list[counter]
        #     t6 = threading.Thread(target=do_save_basics_pre, args=(share_code, time_to_market))
        #     threads.append(t6)
        #
        counter = counter + 1
コード例 #16
0
def static_change(share_code, start_date, finish_date):
    stock_change = DataAnalysis.static_single_wave(share_code, start_date,
                                                   end_date)
    market_pro = Utils.check_market(share_code)
    market_change = DataAnalysis.static_a_wave(market_pro, start_date,
                                               finish_date)