def test(): pl = publish.Publish() base_boll_up = get_boll_up_base() base_boll_lower = get_boll_lower_base() def get_data(): code = jx.HCGD df = tdx.getFive(code) return df key = myredis.gen_keyname(__file__, Recognize_boll.test) df = myredis.createRedisVal(key, get_data).get() df = stock.TDX_BOLL_df(df) for i in range(60, len(df)): df_cur = df[:i] c = Recognize_boll(base_boll_up, df_cur) c2 = Recognize_boll(base_boll_lower, df_cur) b = c._calc_beta_up() b2 = c._calc_beta_lower() #if c2.is_matched(): #print(b2) if abs(c.sign()) > 0 or abs(c2.sign()) > 0: df_cur = df_cur[['c', 'boll_up', 'boll_mid', 'boll_lower']] df_cur.index = range(len(df_cur)) df_cur.plot() pl.show()
def _getFunctionArgs(fname, line, fn_name): """分析文件文本获取参数表达式""" key = key_prefix + agl.MD5(fname + str(line) + fn_name) val = myredis.createRedisVal(key, []) if len(val.get()) > 0: return val.get() f = open(fname, 'r') s = f.readlines() f.close() line -= 1 while line >= 0: if s[line].find(fn_name) >= 0: break line -= 1 #print line s = s[line:] #过滤出表达式 full_s = '' for s_l in s: cur_line_s = s_l.strip() if cur_line_s[0] == '#': continue full_s += cur_line_s if cur_line_s.find(')') >= 0: break full_s = full_s.replace(fn_name, '') full_s = full_s.replace('(', '') full_s = full_s.replace(')', '') if full_s[-1] == ',': full_s = full_s[:-1] #print full_s args = full_s.split(',') #print args val.set(args) return args
def get_data(code): """ return: df ['o', 'c', 'h', 'l', 'upper', 'middle', 'lower']""" #df = load_data(code) #myredis.delkey(myredis.gen_keyname(__file__, get_data)) df = myredis.createRedisVal(myredis.gen_keyname(__file__, get_data), lambda: load_data(code)).get() size = len(df) if size > g_scope_len: index = gen_random_int(0, size - g_scope_len) df = load_data_at_point(df, index, length=g_scope_len) return df
def get_boll_up_base(): """获取一个用来作为标准的曲线 return : np.ndarray """ code = jx.HCGD华灿光电 t = '2018-12-3 10:30:00' t = '2018-11-30 10:00:00' key = myredis.gen_keyname(__file__, get_boll_up_base) df = myredis.createRedisVal( key, lambda: stock.getFiveHisdatDf(code, method='tdx')).get() upper, middle, lower = stock.TDX_BOLL(df['c'].values) df['upper'] = upper df = df[t:] df = df[df.index[20]:] df = df[:df.index[29]] #ui.DrawTs(pl, df['upper'].values) #pl.show() return df['upper'].values
def getData(): def get(): from autoxd.warp_pytdx import getFive from autoxd.pinyin import stock_pinyin3 as jx code = jx.HWWH df = getFive(code) df = stock.TDX_BOLL_df(df) return df def getLocal(): import pandas as pd fname = '../datas/002304.csv' df = pd.read_csv(fname) df.index = pd.DatetimeIndex( df[df.columns[0]]) df = stock.TDX_BOLL_df(df) return df key = myredis.gen_keyname(__file__, getData) #myredis.delkey(key) return myredis.createRedisVal(key, getLocal).get()
def test_recog_history_boll(): from pypublish import publish pl = publish.Publish(explicit=True) code = jx.ZCKJ.b def get_local_codes(): data_path = 'cnn_boll/datasources/' return np.array([str(f).split('.')[0] for f in os.listdir(data_path)]) from sklearn.utils import shuffle key = myredis.gen_keyname(__file__, test_recog_history_boll) codes = myredis.createRedisVal(key, get_local_codes).get() code = shuffle(codes)[0] #ui.DrawTs(pl, x) #x = get_boll_up_base() x = get_boll_lower_base() p = 0.75 #report = ['init', pl.get_CurImgFname()] report = recog_history_boll(pl, x, p, code) pl.RePublish(report)
def Run(self): """ """ #self._log('Strategy_Boll_Pre') #以下为交易测试 code = self.data.get_code() #当前策略处理的股票 self.code = code if not self.is_backtesting and not self.AllowCode(code): return df_hisdat = self.data.get_hisdat(code) #日k线 df_five_hisdat = self.data.get_hisdat(code, dtype='5min') #5分钟k线 df_fenshi = self.data.get_fenshi(code) #日分时 if len(df_fenshi) == 0: self.data.log(code + u"未取到分时数据") return account = self._getAccount() #获取交易账户 price = float(df_fenshi.tail(1)['p']) #当前股价 closes = df_hisdat['c'] yestoday_close = closes[-2] #昨日收盘价 zhangfu = stock.ZhangFu(price, yestoday_close) self._log( 'price=%.2f %s %s' % (price, str(df_fenshi.index[-1]), str(df_five_hisdat.iloc[-1]))) account_mgr = ac.AccountMgr(account, price, code) trade_num = ac.ShouShu(account_mgr.init_money() * self.trade_num_use_money_percent / price) trade_num = max(100, trade_num) # 信号计算 four = stock.FOUR(closes) four = four[-1] upper, middle, lower = stock.TDX_BOLL(df_five_hisdat['c']) highs, lows, closes = df_five_hisdat['h'], df_five_hisdat[ 'l'], df_five_hisdat['c'] adx = stock.TDX_ADX(highs, lows, closes) self._log('boll : %.2f,%.2f,%.2f' % (upper[-1], middle[-1], lower[-1])) boll_w = abs(upper[-1] - lower[-1]) / middle[-1] * 100 #50个周期内最高值 is_high = abs(price - max(df_five_hisdat[-1000:]['h'])) / price < 0.005 boll_poss = [ upper[-1], (upper[-1] - middle[-1]) / 2 + middle[-1], middle[-1], (middle[-1] - lower[-1]) / 2 + lower[-1], lower[-1], ] self._log('boll_poss: %.2f, %.2f boll_w=%.2f adx=%.2f' % (boll_poss[0], boll_poss[1], boll_w, adx[-1])) #上一个成交的价位 pre_price = account_mgr.last_chengjiao_price() pre_pre_price = account_mgr.last_chengjiao_price(index=-2) sell_count = account_mgr.queryTradeCount(1) buy_count = account_mgr.queryTradeCount(0) #买入均价 adx = adx[-1] boll_up_ratio = 0.02 #信号判断 num = 0 if so.assemble( price > boll_poss[1], price > pre_price * (1 + self.trade_ratio), #price > boll_poss[2], #price > self.max_buy_price*(1+self.trade_ratio), #boll_w > 3.5, #adx > 60, #sell_count < 2, #pr.horizontal(df_five_hisdat), 0, ): num = -trade_num self.trade_status = self.enum.boll_up_mid #if self.order(1, code, price, num): #self._log(agl.utf8_to_ascii('一档卖出%s, %.2f, %d'%(code, price, num))) if so.assemble( price > boll_poss[0], price > pre_price * (1 + self.trade_ratio), #price > self.max_buy_price*(1+self.trade_ratio), #boll_w > 3, adx > 60, is_high, #four > self.trade_four[1], #sell_count < 2, #self.trade_status == self.enum.nothing, #0, ): num = -trade_num * 3 self.trade_status = self.enum.boll_up #if self.order(1, code, price, num): #self._log(agl.utf8_to_ascii('二档卖出%s, %.2f, %d'%(code, price, num))) if so.assemble( price < boll_poss[-2] * (1 + boll_up_ratio), price < pre_price * (1 - self.trade_ratio), #price < boll_poss[2], #price < self.min_sell_price*(1-0.03), #boll_w > 3.5, #adx>60, #buy_count < 2, #pr.horizontal(df_five_hisdat), 0, ): num = trade_num self.trade_status = self.enum.boll_down_mid #if boll_w > 6: #num *= self.trade_num_ratio #if self.order(0, code, price, num): #self._log(agl.utf8_to_ascii('一档买入%s, %.2f, %d'%(code, price, num))) if so.assemble( price < boll_poss[-1], price < pre_price * (1 - self.trade_ratio), #price < self.min_sell_price*(1-0.03), #boll_w > 3, #buy_count < 2, #self.trade_status == self.enum.nothing, #adx>70, #four < self.trade_four[0], #0, ): num = trade_num * 3 #num = account_mgr.last_chengjiao_num() self.trade_status = self.enum.boll_down #if self.order(0, code, price, num): #self._log(agl.utf8_to_ascii('二档买入%s, %.2f, %d'%(code, price, num))) #成本区间 if so.assemble( price < pre_price * (1 - 0.05), four < -0.1, self.trade_status == self.enum.boll_up, 0, ): num = trade_num * self.trade_num_ratio self.trade_status = self.enum.nothing if so.assemble( price > pre_price * (1 + 0.05), four > 0.1, self.trade_status == self.enum.boll_down, 0, ): num = -trade_num * self.trade_num_ratio self.trade_status = self.enum.nothing #zz顶抛出后回补 if so.assemble( price < pre_price * (1 - 0.02), #sell_count >= 2, self.trade_status == self.enum.zz_up, 0, ): #上次zz卖出的数量 num = account_mgr.last_chengjiao_num() self.trade_status = self.enum.zz_hui_bu if so.assemble( price > pre_price * (1 + 0.02), #sell_count >= 2, self.trade_status == self.enum.zz_down, 0, ): #上次zz卖出的数量 num = account_mgr.last_chengjiao_num() self.trade_status = self.enum.zz_hui_bu #计算分时zz zz_sign = 0 closes = df_five_hisdat['c'][-200:].values zz = stock.ZigZag(closes) if len(zz) > 2: zz_result = stock.analyzeZZ(zz) zz_line_ratio = zz_result[1] / zz_result[0] #线段比率 #扑捉大涨回头的信号 if abs(zz_result[0]) > 0.05 and abs(zz_line_ratio) > 0.05 and abs( zz_line_ratio) < 0.2 and abs(zz_result[0]) > 0.04: zz_sign = agl.where(zz_result[1] > 0, 1, -1) if num != 0: bSell = agl.where(num > 0, 0, 1) num = abs(num) #if bSell: #num = self._compensate(num, bSell, code) #基本上每天的振幅都在1个点以上 if abs(stock.ZhangFu(price, yestoday_close)) > 0.01: self.order(bSell, code, price, num) zz_pre_price = myredis.createRedisVal('policy_basesign_zz_pre_price', price) if so.assemble( zz_sign != 0, 0, ): #print self.price, getZZPrePrice(self.price),abs(self.price-getZZPrePrice(self.price))/self.price num = trade_num * 12 bSell = agl.where(zz_sign > 0, 0, 1) num = self._compensate(num, bSell, code) bCanOrder = False if so.assemble( bSell, price > zz_pre_price.get() * (1 + 0.03), #price > pre_price*(1+self.trade_ratio), ): bCanOrder = True self.trade_status = self.enum.zz_up if so.assemble( (not bSell), price < zz_pre_price.get() * (1 - 0.03), #price < pre_price*(1-self.trade_ratio) ): bCanOrder = True self.trade_status = self.enum.zz_down if bCanOrder: self._getAccount().Order(bSell, code, price, num) zz_pre_price.set(price) #信号发生时语音播报, 并通知界面回显 if not self.is_backtesting and (price > boll_poss[1] or price < boll_poss[-2]): codename = stock.GetCodeName(code) s = '%s, %.2f' % (codename, price) self.data.show(codename) #通知界面显示 self.data.speak2(s) #语音播报 #tick report if self.is_backtesting and self.is_tick_report: self._getAccount().TickReport(df_five_hisdat, 'win') return