def lwr(shigh,slow,sclose,n=9,m=3): lowv = tmin(slow,n) highv = tmax(shigh,n) rsv = (highv-sclose)*100 / (highv-lowv) lwr1 = sma(rsv,m,1) lwr2 = sma(lwr1,m,1) return lwr1,lwr2
def lwr(shigh, slow, sclose, n=9, m=3): lowv = tmin(slow, n) highv = tmax(shigh, n) rsv = (highv - sclose) * 100 / (highv - lowv) lwr1 = sma(rsv, m, 1) lwr2 = sma(lwr1, m, 1) return lwr1, lwr2
def skdj(shigh,slow,sclose,n=9,m=3): lowv = tmin(slow,n) highv = tmax(shigh,n) rsv = cexpma((sclose-lowv)*100/(highv-lowv),m) k = cexpma(rsv,m) d = ma(k,m) return k,d
def follow_seller(stock,buy_signal,xstop=25,ret=50,**kwargs): ''' 如果价格小于最近5日高点5%,则卖出 xstop为根据买入价的止损 ret为从高点向下的回退值 ''' t = stock.transaction #从顶下落处理,前5天的收盘/开盘的高者和今天的开盘的高者 回落ret之后 #hhret = gmax(rollx(tmax(gmax(t[OPEN],t[CLOSE]),5),1),t[OPEN])* (1000-ret)/1000 hhret = gmax(rollx(tmax(t[HIGH],5),1),t[OPEN])* (1000-ret)/1000 #hhret = rollx(tmax(t[HIGH],5),1) * (1000-ret)/1000 sdl = t[LOW] < hhret #止损处理2.5% stop_price = extend2next(rollx(stock.buyprice,1) * (1000-xstop)/1000) stopl = t[LOW] < stop_price cut_price = gmin(gmax(hhret,stop_price),t[HIGH]) #首先,止损线和退回线高者先被触及,同时,穿越时可能跳低,所以找与t[HIGH]的低点 cut_signal = gor(sdl,stopl) cut_signal = select([t[VOLUME]>0],[cut_signal]) #默认为0,即未交易的日子卖出信号不能发出,否则会合并到下一交易日 bs = gand(buy_signal,cut_signal) rbs = rollx(bs) sell_signal = select([bs],[0],default=cut_signal) + rbs #如果当日冲销,则后推一日,但如果前一日也是当日,则信号被屏蔽 stock.sellprice = select([cut_signal],[cut_price],default=t[OPEN]) #止损和退回用cut_price, 当日卖出信号平移用开盘价,停牌平移用开盘价 return cut_signal
def skdj(shigh, slow, sclose, n=9, m=3): lowv = tmin(slow, n) highv = tmax(shigh, n) rsv = cexpma((sclose - lowv) * 100 / (highv - lowv), m) k = cexpma(rsv, m) d = ma(k, m) return k, d
def wms(tclose,thigh,tlow,length): ''' 威廉指标 可单独使用,同时也被kdj用到 ''' assert len(tclose) == len(thigh) and len(tclose) == len(tlow) lmax = tmax(thigh,length) lmin = tmin(tlow,length) rev = np.zeros_like(tclose) for i in xrange(len(tclose)): cmax,cmin = lmax[i],lmin[i] rev[i] = BASE if cmax==cmin else (tclose[i]-cmin) * BASE/(cmax-cmin) return rev
def wms(tclose, thigh, tlow, length): ''' 威廉指标 可单独使用,同时也被kdj用到 ''' assert len(tclose) == len(thigh) and len(tclose) == len(tlow) lmax = tmax(thigh, length) lmin = tmin(tlow, length) rev = np.zeros_like(tclose) for i in xrange(len(tclose)): cmax, cmin = lmax[i], lmin[i] rev[i] = BASE if cmax == cmin else (tclose[i] - cmin) * BASE / (cmax - cmin) return rev
def mm_ratio(sclose,shigh,slow,satr,covered=1): ''' 计算标准化的最大有利变动(MFE)/最大不利变动(MAE) 即以当日为基准,计算covered内AMFE=(最大值-当日值)/atr和(当日值-最小值)/atr 用于优势率e_ratio的计算: 所有信号的CMFE之和/所有信号的CMAE之和 (信号次数被约掉) 应当用这种方式,而不是单独计算CMFE/CMAE然后求平均 比如一次是2/1,另一次是1/2,如果单独求比例然后平均,则e_ratio=(2+0.5)/2=1.25 而先求平均再除,则是 (2+1)/(1+2) = 1 显然后者是正常情形 这是一个future函数, 正因为有左移的原因,所以最后covered的数据是失准的,需要处理掉,失灭为准 ''' m_max = rollx(tmax(sclose,covered),-covered) #未来数据左移 m_min = rollx(tmin(sclose,covered),-covered) #未来数据左移 #print m_min,tmin(sclose,covered) amfe = (m_max - sclose) * BASE / satr #可能出现m_max[i] < sclose[i]的情况,如当日之后的covered内sclose一直下行 amae = (sclose - m_min) * BASE / satr #可能出现m_min[i] > sclose[i]的情况,如当日之后的covered内sclose一直上行 amfe[-covered:] = amae[-covered:] = 0 #print amfe.tolist(),amae.tolist() return amfe,amae
def fupf(stock): ''' 本次上叉比上次上叉的位置高,同时价格也高 ''' t = stock.transaction linelog('%s:%s' % (fupf.__name__,stock.code)) pdiff,pdea = cmacd(stock.hour) upcross2 = gand(cross(pdea,pdiff)>0,strend(pdiff)>0) dsub = rsub(pdea,upcross2) #csub = rsub(stock.hour,upcross2) #ssub = rsub(rollx(strend(pdea)),upcross2) #上叉前一天的strend(pdea) vz = tmax(np.abs(pdiff),60) / 5 #pdiff不能超过0线太高 hsignal = gand(dsub>0,pdiff<vz) xatr = stock.atr * BASE / t[CLOSE] mxatr = ma(xatr,13) xr = gand(xatr<50,xatr<mxatr)#,strend(xatr-mxatr)<0) nd = bnot(gand(stock.ma1<stock.ma2,stock.ma2<stock.ma3)) rt = gand(stock.ref.t3) vma_s = ma(t[VOLUME],13) vma_l = ma(t[VOLUME],30) vfilter = vma_s < vma_l * 3/4 gr = gand(stock.g20<3000,stock.g20>stock.g60,stock.g60>stock.g120) signal = gand(hour2day(hsignal),strend(stock.diff)>0,xr,rt,nd,vfilter,gr) return signal
def fupf(stock): ''' 本次上叉比上次上叉的位置高,同时价格也高 ''' t = stock.transaction linelog('%s:%s' % (fupf.__name__, stock.code)) pdiff, pdea = cmacd(stock.hour) upcross2 = gand(cross(pdea, pdiff) > 0, strend(pdiff) > 0) dsub = rsub(pdea, upcross2) #csub = rsub(stock.hour,upcross2) #ssub = rsub(rollx(strend(pdea)),upcross2) #上叉前一天的strend(pdea) vz = tmax(np.abs(pdiff), 60) / 5 #pdiff不能超过0线太高 hsignal = gand(dsub > 0, pdiff < vz) xatr = stock.atr * BASE / t[CLOSE] mxatr = ma(xatr, 13) xr = gand(xatr < 50, xatr < mxatr) #,strend(xatr-mxatr)<0) nd = bnot(gand(stock.ma1 < stock.ma2, stock.ma2 < stock.ma3)) rt = gand(stock.ref.t3) vma_s = ma(t[VOLUME], 13) vma_l = ma(t[VOLUME], 30) vfilter = vma_s < vma_l * 3 / 4 gr = gand(stock.g20 < 3000, stock.g20 > stock.g60, stock.g60 > stock.g120) signal = gand(hour2day(hsignal), strend(stock.diff) > 0, xr, rt, nd, vfilter, gr) return signal
def mm_ratio(sclose, shigh, slow, satr, covered=1): ''' 计算标准化的最大有利变动(MFE)/最大不利变动(MAE) 即以当日为基准,计算covered内AMFE=(最大值-当日值)/atr和(当日值-最小值)/atr 用于优势率e_ratio的计算: 所有信号的CMFE之和/所有信号的CMAE之和 (信号次数被约掉) 应当用这种方式,而不是单独计算CMFE/CMAE然后求平均 比如一次是2/1,另一次是1/2,如果单独求比例然后平均,则e_ratio=(2+0.5)/2=1.25 而先求平均再除,则是 (2+1)/(1+2) = 1 显然后者是正常情形 这是一个future函数, 正因为有左移的原因,所以最后covered的数据是失准的,需要处理掉,失灭为准 ''' m_max = rollx(tmax(sclose, covered), -covered) #未来数据左移 m_min = rollx(tmin(sclose, covered), -covered) #未来数据左移 #print m_min,tmin(sclose,covered) amfe = ( m_max - sclose ) * BASE / satr #可能出现m_max[i] < sclose[i]的情况,如当日之后的covered内sclose一直下行 amae = ( sclose - m_min ) * BASE / satr #可能出现m_min[i] > sclose[i]的情况,如当日之后的covered内sclose一直上行 amfe[-covered:] = amae[-covered:] = 0 #print amfe.tolist(),amae.tolist() return amfe, amae
def follow_seller(stock, buy_signal, xstop=25, ret=50, **kwargs): ''' 如果价格小于最近5日高点5%,则卖出 xstop为根据买入价的止损 ret为从高点向下的回退值 ''' t = stock.transaction #从顶下落处理,前5天的收盘/开盘的高者和今天的开盘的高者 回落ret之后 #hhret = gmax(rollx(tmax(gmax(t[OPEN],t[CLOSE]),5),1),t[OPEN])* (1000-ret)/1000 hhret = gmax(rollx(tmax(t[HIGH], 5), 1), t[OPEN]) * (1000 - ret) / 1000 #hhret = rollx(tmax(t[HIGH],5),1) * (1000-ret)/1000 sdl = t[LOW] < hhret #止损处理2.5% stop_price = extend2next(rollx(stock.buyprice, 1) * (1000 - xstop) / 1000) stopl = t[LOW] < stop_price cut_price = gmin(gmax(hhret, stop_price), t[HIGH]) #首先,止损线和退回线高者先被触及,同时,穿越时可能跳低,所以找与t[HIGH]的低点 cut_signal = gor(sdl, stopl) cut_signal = select([t[VOLUME] > 0], [cut_signal]) #默认为0,即未交易的日子卖出信号不能发出,否则会合并到下一交易日 bs = gand(buy_signal, cut_signal) rbs = rollx(bs) sell_signal = select( [bs], [0], default=cut_signal) + rbs #如果当日冲销,则后推一日,但如果前一日也是当日,则信号被屏蔽 stock.sellprice = select([cut_signal], [cut_price], default=t[OPEN]) #止损和退回用cut_price, 当日卖出信号平移用开盘价,停牌平移用开盘价 return cut_signal
def up_seller(stock, buy_signal, xstop=25, ret=50, **kwargs): ''' 如果买入日为阴线,则开盘卖出 如果价格小于最近5日高点5%,则卖出 xstop为根据买入价的止损 ret为从高点向下的回退值 ''' t = stock.transaction #阴线处理 sol = rollx(gand(buy_signal, t[CLOSE] < t[OPEN]), 1) #从顶下落处理,前5天的收盘/开盘的高者和今天的开盘的高者 回落ret之后 #hhret = gmax(rollx(tmax(gmax(t[OPEN],t[CLOSE]),5),1),t[OPEN])* (1000-ret)/1000 hhret = gmax(rollx(tmax(t[HIGH], 5), 1), t[OPEN]) * (1000 - ret) / 1000 sdl = t[LOW] < hhret #止损处理2.5% stop_price = extend2next(rollx(stock.buyprice, 1) * (1000 - xstop) / 1000) #要求buyprice只有在buyer日才有数据,否则extend2next无意义 stopl = t[LOW] < stop_price cut_price = gmin(gmax(hhret, stop_price), t[HIGH]) #首先,止损线和退回线高者先被触及,同时,穿越时可能跳低,所以找与t[HIGH]的低点 cut_signal = gor(sdl, stopl) cut_signal = select([t[VOLUME] > 0], [cut_signal]) #默认为0,即未交易的日子卖出信号不能发出,否则会合并到下一交易日 ssignal = gor(sol, cut_signal) stock.sellprice = select([cut_signal], [cut_price], default=t[OPEN]) #止损和退回用cut_price, 阴线出局和停牌平移都用开盘价 return ssignal
def up_seller(stock,buy_signal,xstop=25,ret=50,**kwargs): ''' 如果买入日为阴线,则开盘卖出 如果价格小于最近5日高点5%,则卖出 xstop为根据买入价的止损 ret为从高点向下的回退值 ''' t = stock.transaction #阴线处理 sol = rollx(gand(buy_signal,t[CLOSE] < t[OPEN]),1) #从顶下落处理,前5天的收盘/开盘的高者和今天的开盘的高者 回落ret之后 #hhret = gmax(rollx(tmax(gmax(t[OPEN],t[CLOSE]),5),1),t[OPEN])* (1000-ret)/1000 hhret = gmax(rollx(tmax(t[HIGH],5),1),t[OPEN])* (1000-ret)/1000 sdl = t[LOW] < hhret #止损处理2.5% stop_price = extend2next(rollx(stock.buyprice,1) * (1000-xstop)/1000) #要求buyprice只有在buyer日才有数据,否则extend2next无意义 stopl = t[LOW] < stop_price cut_price = gmin(gmax(hhret,stop_price),t[HIGH]) #首先,止损线和退回线高者先被触及,同时,穿越时可能跳低,所以找与t[HIGH]的低点 cut_signal = gor(sdl,stopl) cut_signal = select([t[VOLUME]>0],[cut_signal]) #默认为0,即未交易的日子卖出信号不能发出,否则会合并到下一交易日 ssignal = gor(sol,cut_signal) stock.sellprice = select([cut_signal],[cut_price],default=t[OPEN]) #止损和退回用cut_price, 阴线出局和停牌平移都用开盘价 return ssignal