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
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))
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
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)
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()
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__)
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
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
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
def get_current_boll(share_code, start_date): return get_boll(share_code, start_date, Utils.get_current_date())
def save_index_data(begin_date): save_index_data_end_date(begin_date, Utils.get_current_date())
def save_data_current_day(begin, end, step): save_data_from_now_on(begin, end, step, Utils.get_current_date())
def save_data_from_now_on(begin, end, step, start_date): save_data(begin, end, step, start_date, Utils.get_current_date())
def db_read(code, start_date, engine): rs = db_read_k_history(code, engine, start_date, Utils.get_current_date(), 'asc') return rs
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
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)