def get_stgyLatest(minute_pnl,minute_hist,pky=['evening_star','morning_star','bearish_MACD','MACD'],debugTF=False): from _alan_calc import chk_sign from _alan_date import delta2dates from lsi_minute import generate_comment_ohlc qstr="sig==1 & lsc!='combo' & name in {}".format(pky) temp_pnl = minute_pnl.query(qstr).sort_values(['pbdate'],ascending=[False]).iloc[:1] if temp_pnl.shape[0]<1: return {} stgyName, stgyDate = temp_pnl[['name','pbdate']].iloc[0] temp_hist = minute_hist.query("pbdate>={}".format(stgyDate)).sort_values(['pbdate'], ascending=False) if 'MACD' in stgyName: temp_hist['curr_trend'] = temp_hist['signal_value_macd'] else: temp_hist['curr_trend'] = temp_hist['dxma5'] if len(temp_hist)>1: curr_deriv = chk_sign(temp_hist['curr_trend'].iloc[1],temp_hist['curr_trend'].iloc[0]) else: curr_deriv = -1 if temp_hist.shape[0]>0: dstgy = temp_hist[['pbdate','price','ticker','curr_trend']].iloc[0].to_dict() else: dstgy = {} dstgy.update(curr_deriv=curr_deriv) dstgy['curr_date'] = dstgy.pop('pbdate') if debugTF is True: print >> sys.stderr, dstgy dstgy.update(temp_pnl.iloc[0].to_dict()) e,s = minute_hist['epochs'][[-1,0]].values dstgy['pnl_prd'] = delta2dates(e,s,fq='HOUR') #return pd.Series(dstgy) return dstgy
def getdb_ohlc_daily(ticker, startYmd, endYmd, sector, label, pgDB): """ get info from ohlc_hist and ohlc_pnl for ohlc strategy info """ sq1 = "SELECT * FROM ohlc_latest_macd WHERE ticker = {0!r} order by pbdate DESC" sq2 = "SELECT * FROM ohlc_ls_signal WHERE ticker = {0!r} order by pbdate DESC" #sq1="SELECT ticker,pbdate,price,ma5,ma20,price-ma5 as ma5trend,signal_value_macd,signal_buysell_macd FROM ohlc_hist WHERE ticker = {0!r} and pbdate >= (SELECT max(pbdate) FROM ohlc_hist WHERE ticker = {0!r} and signal_buysell_macd <> 0 ) order by pbdate DESC" #sq2="select distinct * from ohlc_pnl where ticker={0!r} and sig=1 and lsc<>'combo' and name similar to '%%(star|harami|MACD)' order by name,lsc,pbdate DESC" g1 = pd.read_sql(sq1.format(ticker), pgDB) g2 = pd.read_sql(sq2.format(ticker), pgDB).loc[:, [ "ticker", "name", "pbdate", "price", "lsc", "amount", "cum_amounts", "sig", "tsig", "ttr_hold", "trr" ]] pnl_prd = delta2dates(endYmd, startYmd, fq="M") pbdate = endYmd try: m1 = g2.loc[~g2['name'].str.contains("MACD")].reset_index( drop=True).sort_values(by=['pbdate'], ascending=False).iloc[0] m1['curr_trend'] = m1['curr_deriv'] = 0 if len(g1) > 0: m1['curr_trend'] = g1['ma5trend'][0] if len(g1) > 1: m1['curr_deriv'] = 1 if abs(g1['ma5trend'][0]) >= abs( g1['ma5trend'][1]) else -1 m1['curr_date'] = pbdate m1['pnl_prd'] = pnl_prd m1['sector'] = sector m1['label'] = label except: m1 = None try: m2 = g2.loc[g2['name'].str.contains("MACD")].reset_index( drop=True).sort_values(by=['pbdate'], ascending=False).iloc[0] m2['curr_trend'] = m2['curr_deriv'] = 0 if len(g1) > 0: m2['curr_trend'] = g1['signal_value_macd'][0] if len(g1) > 1: m2['curr_deriv'] = 1 if abs(g1['signal_value_macd'][0]) >= abs( g1['signal_value_macd'][1]) else -1 m2['curr_date'] = pbdate m2['pnl_prd'] = pnl_prd m2['sector'] = sector m2['label'] = label except: m2 = None return (pbdate, m1, m2)
def generate_comment_pppscf(f, dotSign='.', prcn=0, usdSign='$ ', udfLst=None, lang="en", ts=None): """ stock past performance comment """ if ts is None: ts = assign_ts_pppscf(lang=lang) fp = f.iloc[-1].to_dict() for ky, va in fp.items(): exec("{}=va".format(ky)) unitStr = fq2unit_str(freq, lang) past_udf = udfStr(act_chg_zscore, udf=None, zs=0.0001, lang=lang) past_difday = difday past_act_chg_pct = roundPct(act_chg, n=0, pct=100, dotSign=dotSign, lang=lang) past_range = str( delta2dates(int(f.iloc[-1]['pbdate']), int(f.iloc[0]['pbdate']), fq='M')) + ("-month" if lang == "en" else "月") fp = f.query("sig_act_chg==1").iloc[0].to_dict() for ky, va in fp.items(): exec("{}=va".format(ky)) latest_startYM = ymd2md(xdate, ymd='%Y-%m-%d', ym="%B %Y", lang=lang) latest_endYM = ymd2md(pdate, ymd='%Y-%m-%d', ym="%B %Y", lang=lang) latest_udf = udfStr(act_chg_zscore, udf=None, zs=0.0001, lang=lang) latest_act_chg_pct = roundPct(act_chg, n=0, pct=100, dotSign=dotSign, lang=lang) dux = locals() ret = jj_fmt(ts, dux) global gData gData = dux.copy() del gData['fp'] return ret
def generate_daily_comment(f, ts=None, dotSign='.', prcn=0, usdSign='$', udfLst=None, lang="en"): """ stock ohlc strategy comment for each strategy essential f keys: ticker,name,price,trr,tsig,pbdate,curr_date,lsc,curr_trend,curr_deriv """ if ts is None: return '' try: enhanceClause = f['enhanceClause'] except: enhanceClause = "" if 'enhanceName' in f: # For "enhance" case ONLY enhanceName = pattern_cn(f['enhanceName'], lang=lang) ynCode = f['ynCode'] else: enhanceName = None ynCode = 1 xnDay = delta2dates(f['curr_date'], f['pbdate']) # to calc days of previous stragety bsFlg = True if f['lsc'] == "long" else False currFlg = True if f['curr_trend'] * f[ 'amount'] >= 0 else False # check if current situation still persists currChg = True if f[ 'curr_deriv'] >= 0 else False # if situation persists, is it enhancing or diminishing pastAdv = "" trrAdv = "" trrAddClause = "" if lang == "cn": currDateWd = ymd2md(str(f['curr_date']), lang=lang) buySellVerb = "買入" if bsFlg else "賣出" prepositionWd = rdWord("另外|同時|不但如此") if ynCode == 1 else rdWord( "然而|但是|不過|可是") pastTrendWd = "跌" if bsFlg else "漲" # reverse of long/short for beforeward harami/star signal comingLookoutWd = rdWord("看漲|看多") if bsFlg else rdWord("看跌|看空") comingTrendWd = rdWord("上昇|看多|向上提升") if bsFlg else rdWord("下降|看空|下滑") continueTrendWd = rdWord( "還在持續中並未改變|依然持續|仍在持續中") if currFlg else rdWord("並沒有持續|並未持續") if currFlg is True: upWd = rdWord("增强|升高|上升|向上提升") dnWd = rdWord("減弱|下降|滑落|下滑") continueStatusClause = ",還在" + upWd if currChg else ",但已逐漸" + dnWd else: continueStatusClause = "" if xnDay < 1: pastDayWd = "昨日" elif xnDay < 2: pastDayWd = "前一天".format(xnDay) else: pastDayWd = "{}天前".format(xnDay) pastAdv = "曾經" monthWd = "{}個月".format(f['pnl_prd']) negWd = "而" if f['trr'] > -0.005 else rdWord("只是|但是|可惜|可是") trrAdv = "" if f['trr'] > -0.005 else rdWord("只是|但是|可惜|可是") trrAddClause = "" if f['trr'] > -0.005 else rdWord(",並非有效策略|,策略有待商榷") else: prepositionWd = rdWord( "In the mean time|In addition") if ynCode == 1 else rdWord( "However|Yet|Nevertheless") currDateWd = ymd2md(f['curr_date'], lang=lang) buySellVerb = "buy" if bsFlg else "sell" pastTrendWd = "downtrend" if bsFlg else "uptrend" # reverse of long/short for beforeward harami/star signal comingTrendWd = "uptrend" if bsFlg else "downtrend" continueTrendWd = "still persists" if currFlg else "starts to reverse" continueStatusClause = "continues to increase" if currChg else "starts to reduce" if xnDay < 1: pastDayWd = "just" elif xnDay < 2: pastDayWd = "yesterday".format(xnDay) else: pastDayWd = "{} days ago".format(xnDay) monthWd = "{}-month".format(f['pnl_prd']) negWd = "" if f['trr'] > -0.005 else "however" label = f['label'] if 'label' in f else '' ticker = f['ticker'] if label is None or str(label) == '': label = ticker price = roundUSD(f['price'], 1) strategyName = f['name'] strategyName = pattern_cn(strategyName, lang=lang) countWd = f['tsig'] trrPct = roundPct(f['trr'], 0, pct=1) if trrPct == '0%' or trrPct == '-0%': trrPct = "持平而已" if lang == "cn" else "flat" pricingComm = "" dux = locals() ret = jj_fmt(ts, dux) #ret=ts.format(**dux) return (ret)
def recordHiLo(dx, endDT=None, ticker='', colx='pchg', colLst=['close', 'pchg'], debugTF=False, mthLst=[]): ''' find hi/lo out of a range past months: 'mthLst':[-1,-3,-6,-12,-36,-60,-120] based on time series DataFrame 'dx' that contains column 'colx' with DatetimeIndex return dict object with keys: fqWd, name, tags, days, months, years, endDT, mnxTF, hilo, startDT and 'colLst' ''' if endDT is None: endDT = dx.index[-1] # next_date() if len(mthLst) < 1: mthLst = [-1, -3, -6, -12, -36, -60, -120] pbdate = int(endDT.strftime('%Y%m%d')) kyLst = [ "fqWd", "name", "tags", "days", "months", "years", "endDT", "hilo", "startDT" ] if debugTF: sys.stderr.write("{}\n".format(dx)) da = db = {} jobj = dict(ticker=ticker, pbdate=pbdate, YTD={}) for months in mthLst: #for months in [-6,-12,-36,-60,-120]: mnxTF, hilo, idxmnx, startDT, startAT = is_record_hl(dx, colx=colx, months=months) ndays = (endDT - startAT).days nmonths = delta2dates(endDT, startAT, fq='M', rounding=1) nyears = int(nmonths / 12) # only integer year startYmd = int(startAT.strftime('%Y%m%d')) if delta2dates( startAT, startDT) > 5: # STOP if act-delta-months less than months break name = "{}_MoSinceStart".format(nmonths) else: #name = "{}_Mo2Date".format(-months) name = "YrToDate" if nyears > 0 else "LastMoToDate" if (mnxTF is True): colVa = dx.loc[idxmnx, colx] hlWd = '最高' if hilo == 'HIGH' else '最低' if colVa >= 0 else '最差' colWd = '價格' if colx in ['price', 'close', 'value'] else '變化' if nyears < 1: tags = "{} month {} {}".format(-months, colx, hilo) fqWd = "{} 個月以來 {} {}".format(-months, hlWd, colWd) else: tags = "{} year {} {}".format(nyears, colx, hilo) fqWd = "{} 年以來 {} {}".format(nyears, hlWd, colWd) vaLst = [ fqWd, name, tags, ndays, nmonths, nyears, pbdate, hilo, startYmd ] db = dict(zip(kyLst, vaLst)) db.update(dx.loc[idxmnx, colLst].to_dict()) jobj.update(YTD=db) if delta2dates( startAT, startDT ) > 5: #- No longer used since longer delta months is not applicable sys.stderr.write("===Act:{}, Start:{}, Months:{}\n".format( startAT, startDT, months)) break return jobj