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
Exemple #2
0
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)
Exemple #3
0
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
Exemple #4
0
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)
Exemple #5
0
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