def VWAP_sta(qx): ''' vwap 成交量加權平均價策略分析函數 Args: qx (zwQuantX): zwQuantX數據包 預設參數範例: qx.staVars=[5,0.01,'2014-01-01',''] ''' stknum = 0 xtim, xcod = qx.xtim, qx.stkCode # vwap = zwx.stkGetPrice(qx, 'vwap') if vwap > 0: dprice = zwx.stkGetVars(qx, 'close') kvwap = qx.staVars[1] xnum = zwx.xusrStkNum(qx, xcod) dcash = qx.qxUsr['cash'] dval = xnum * dprice #---- if (dprice > vwap * (1 + kvwap)) and (dval < (dcash * qx.stkKCash)): stknum = 100 if (dprice < vwap * (1 - kvwap)) and (dval > 0): stknum = -100 # if stknum != 0: #print(xtim,stknum,'xd',xcod,dprice,dcash) pass return stknum
def VWAP_sta(qx): ''' vwap 成交量加权平均价策略分析函数 Args: qx (zwQuantX): zwQuantX数据包 默认参数示例: qx.staVars=[5,0.01,'2014-01-01',''] ''' stknum=0; xtim,xcod=qx.xtim,qx.stkCode # vwap=zwx.stkGetPrice(qx,'vwap') if vwap>0: dprice=zwx.stkGetVars(qx,'close') kvwap=qx.staVars[1]; xnum=zwx.xusrStkNum(qx,xcod); dcash=qx.qxUsr['cash']; dval = xnum * dprice; #---- if (dprice>vwap*(1+kvwap))and(dval<(dcash*qx.stkKCash)): stknum=100; if (dprice<vwap*(1-kvwap))and(dval>0): stknum=-100; # if stknum!=0: #print(xtim,stknum,'xd',xcod,dprice,dcash) pass; return stknum
def zwBackTest(qx): ''' zwQuant,回溯测试主程序 【输入】 qx (zwQuantx): zwQuantx数据包 【输出】 无 ''' # 增加数据源波动率参数 zwx.stkLibSetDVix() # 计算回溯时间周期,也可以在此,根据nday调整回溯周期长度 # 或者在 qt_init数据初始化时,通过qx.qxTimSet(xtim0,xtim9),设置回溯周期长度 nday = qx.periodNDay if qx.debugMod > 0: xcod = zw.stkLibCode[0] print(zw.stkLib[xcod].tail()) print('nday', nday) # nday=3; fss = 'tmp\\' + qx.prjName + '_' + xcod + '.csv' zw.stkLib[xcod].to_csv(fss) # -------------- # 按时间循环,进行回溯测试 for tc in range(nday): tim5 = qx.DTxtim0 + dt.timedelta(days=tc) xtim = tim5.strftime('%Y-%m-%d') # print('tc',tc,xtim) # 每个测试时间点,开始时,清除qx相关参数 qx.qxTim0SetVar(xtim) # qx.prQxUsr();#qx.xtim=xtim; xpriceFlag = False # 有效交易标志Flag # 按设定的股票代码列表,循环进行回溯测试 for xcod in zw.stkLibCode: qx.stkCode = xcod # print('xcod',xcod) # xdatWrk是当前xcod,=stkLib[xcod] # xbarWrk是当前时间点的stkLib[xcod] # 注意,已经包括了,qt_init里面的扩充数据列 qx.xbarWrk, qx.xdatWrk = zwx.xbarGet8TimExt(xcod, qx.xtim) # print(xcod,'xbar\n',qx.xbarWrk) if not qx.xbarWrk[qx.priceWrk].empty: # -----dvix 波动率检查 dvix = zwx.stkGetVars(qx, 'dvix') # dvixFlag=False; dvixFlag = zwt.xinEQ(dvix, qx.dvix_k0, qx.dvix_k9) or (dvix == 0) or (np.isnan(dvix)) if dvixFlag: xpriceFlag = True # 调用回溯子程序,如果是有效交易,设置成功交易标志xtrdFlag zwBackTest100(qx) else: print('@dvix', xcod, xtim, dvix) pass # 如果所有股票代码列表循环完毕,成功交易标志为真 # 在当前测试时间点终止,设置有关交易参数 if xpriceFlag: qx.wrkNDay += 1 qx.qxTim9SetVar(qx.xtim)
def zwBackTest(qx): ''' zwQuant,回溯测试主程序 【输入】 qx (zwQuantx): zwQuantx数据包 【输出】 无 ''' # 增加数据源波动率参数 # 就是增加一列dvix数据 zwx.stkLibSetDVix() # 计算回溯时间周期,也可以在此,根据nday调整回溯周期长度 # 或者在 qt_init数据初始化时,通过qx.qxTimSet(xtim0,xtim9),设置回溯周期长度 nday = qx.periodNDay if qx.debugMod > 0: xcod = zw.stkLibCode[0] print(zw.stkLib[xcod].tail()) print('nday', nday) fss = 'tmp\\' + qx.prjName + '_' + xcod + '.csv' zw.stkLib[xcod].to_csv(fss) # -------------- # 按时间循环,进行回溯测试 for tc in range(nday): tim5 = qx.DTxtim0 + dt.timedelta(days=tc) if hasattr(qx,'timFun'): qx.timFun(qx,tim5) # 运行绑定的关于某个时间点的主函数 xtim = tim5.strftime('%Y-%m-%d') # print('tc',tc,xtim) # 每个测试时间点,开始时,清除qx相关参数 qx.qxTim0SetVar(xtim) # qx.prQxUsr() #qx.xtim=xtim xpriceFlag = False # 有效交易标志Flag # 按设定的股票代码列表,循环进行回溯测试 for xcod in zw.stkLibCode: qx.stkCode = xcod # print('xcod',xcod) # xdatWrk是当前xcod,=stkLib[xcod] # xbarWrk是当前时间点的stkLib[xcod] # 注意,已经包括了,qt_init里面的扩充数据列 qx.xbarWrk, qx.xdatWrk = zwx.xbarGet8TimExt(xcod, qx.xtim) # print(xcod,'xbar\n',qx.xbarWrk) if not qx.xbarWrk[qx.priceWrk].empty: # -----dvix 波动率检查 dvix = zwx.stkGetVars(qx, 'dvix') # dvixFlag=False dvixFlag = zwt.xinEQ(dvix, qx.dvix_k0, qx.dvix_k9) or (dvix == 0) or (np.isnan(dvix)) if dvixFlag: xpriceFlag = True # 调用回溯子程序,如果是有效交易,设置成功交易标志xtrdFlag zwBackTest100(qx) else: print('@dvix', xcod, xtim, dvix) pass # 如果所有股票代码列表循环完毕,成功交易标志为真 # 在当前测试时间点终止,设置有关交易参数 if xpriceFlag: qx.wrkNDay += 1 qx.qxTim9SetVar(qx.xtim) # print('') qx.update_usr_qxLib(qx,qx.qxLib)
def zwBackTest(qx): ''' zwQuant,回溯測試主程式 【輸入】 qx (zwQuantx): zwQuantx封包 【輸出】 無 ''' # 增加資料來源波動率參數 # 就是增加一列dvix資料 zwx.stkLibSetDVix() # 計算回溯時間週期,也可以在此,根據nday調整回溯週期長度 # 或者在 qt_init資料初始化時,通過qx.qxTimSet(xtim0,xtim9),設定回溯週期長度 nday = qx.periodNDay if qx.debugMod > 0: xcod = zw.stkLibCode[0] print(zw.stkLib[xcod].tail()) print('nday', nday) fss = 'tmp\\' + qx.prjName + '_' + xcod + '.csv' zw.stkLib[xcod].to_csv(fss) # -------------- # 按時間迴圈,進行回溯測試 for tc in range(nday): tim5 = qx.DTxtim0 + dt.timedelta(days=tc) if hasattr(qx,'timFun'): qx.timFun(qx,tim5) # 運行綁定的關於某個時間點的主函數 xtim = tim5.strftime('%Y-%m-%d') # print('tc',tc,xtim) # 每個測試時間點,開始時,清除qx相關參數 qx.qxTim0SetVar(xtim) # qx.prQxUsr() #qx.xtim=xtim xpriceFlag = False # 有效交易標誌Flag # 按設定的股票代碼列表,迴圈進行回溯測試 for xcod in zw.stkLibCode: qx.stkCode = xcod # print('xcod',xcod) # xdatWrk是當前xcod,=stkLib[xcod] # xbarWrk是當前時間點的stkLib[xcod] # 注意,已經包括了,qt_init裡面的擴充資料列 qx.xbarWrk, qx.xdatWrk = zwx.xbarGet8TimExt(xcod, qx.xtim) # print(xcod,'xbar\n',qx.xbarWrk) if not qx.xbarWrk[qx.priceWrk].empty: # -----dvix 波動率檢查 dvix = zwx.stkGetVars(qx, 'dvix') # dvixFlag=False dvixFlag = zwt.xinEQ(dvix, qx.dvix_k0, qx.dvix_k9) or (dvix == 0) or (np.isnan(dvix)) if dvixFlag: xpriceFlag = True # 調用回溯副程式,如果是有效交易,設定成功交易標誌xtrdFlag zwBackTest100(qx) else: print('@dvix', xcod, xtim, dvix) pass # 如果所有股票代碼清單迴圈完畢,成功交易標誌為真 # 在當前測試時間點終止,設定有關交易參數 if xpriceFlag: qx.wrkNDay += 1 qx.qxTim9SetVar(qx.xtim) # print('') qx.update_usr_qxLib(qx,qx.qxLib)
def BBANDS_sta(qx): ''' 布林帶策略分析函數 Args: qx (zwQuantX): zwQuantX數據包 預設參數範例: qx.staVars=[40,'2014-01-01',''] ''' stknum = 0 xtim, xcod = qx.xtim, qx.stkCode dup = zwx.stkGetVars(qx, 'boll_up') dlow = zwx.stkGetVars(qx, 'boll_low') #print(xtim,stknum,'xd',xcod,dup,dlow) if dup > 0: dprice = zwx.stkGetPrice(qx, 'dprice') kprice = zwx.stkGetPrice(qx, 'kprice') dnum = zwx.xusrStkNum(qx, xcod) dcash = qx.qxUsr['cash'] #print(xtim,stknum,dnum,'xd',dcash,dprice,'b,%.2f,%.2f' %(dlow,dup)) if (dnum == 0) and (dprice < dlow): stknum = int(dcash / dprice * qx.stkKCash) dsum = stknum * kprice if qx.debugMod > 0: print( xtim, stknum, dnum, '++,%.2f,%.2f,%.2f,$,%.2f,%.2f' % (dprice, dlow, dup, kprice, dsum)) elif (dnum > 0) and (dprice > dup): stknum = -1 dsum = dnum * kprice if qx.debugMod > 0: print( xtim, stknum, dnum, '--,%.2f,%.2f,%.2f,$,%.2f,%.2f' % (dprice, dlow, dup, kprice, dsum)) # if stknum != 0: #print(xtim,stknum,'xd',xcod,dprice,dcash) pass return stknum
def BBANDS_sta(qx): ''' 布林带策略分析函数 Args: qx (zwQuantX): zwQuantX数据包 默认参数示例: qx.staVars=[40,'2014-01-01',''] ''' stknum=0; xtim,xcod=qx.xtim,qx.stkCode dup=zwx.stkGetVars(qx,'boll_up') dlow=zwx.stkGetVars(qx,'boll_low') #print(xtim,stknum,'xd',xcod,dup,dlow) if dup>0: dprice=zwx.stkGetPrice(qx,'dprice') kprice=zwx.stkGetPrice(qx,'kprice') dnum=zwx.xusrStkNum(qx,xcod) dcash=qx.qxUsr['cash']; #print(xtim,stknum,dnum,'xd',dcash,dprice,'b,%.2f,%.2f' %(dlow,dup)) if (dnum==0)and(dprice<dlow): stknum = int(dcash /dprice*qx.stkKCash);dsum=stknum*kprice if qx.debugMod>0: print(xtim,stknum,dnum,'++,%.2f,%.2f,%.2f,$,%.2f,%.2f' %(dprice,dlow,dup,kprice,dsum)) elif (dnum>0)and(dprice>dup): stknum = -1;dsum=dnum*kprice if qx.debugMod>0: print(xtim,stknum,dnum,'--,%.2f,%.2f,%.2f,$,%.2f,%.2f' %(dprice,dlow,dup,kprice,dsum)) # if stknum!=0: #print(xtim,stknum,'xd',xcod,dprice,dcash) pass; return stknum
def tur10(qx): ''' 策略说明 Args: qx (zwQuantX): zwQuantX数据包 ''' stknum=0; xtim,xcod=qx.xtim,qx.stkCode; dprice=zwx.stkGetVars(qx,'dprice') xnum=zwx.xusrStkNum(qx,xcod); # ksma='ma_%d' %qx.staVars[1] dsma=qx.xbarWrk[ksma][0] # if (dprice>dsma)and(xnum==0): stknum=10; print('buy',xtim,dprice,dsma,xnum); if (dprice<=dsma)and(xnum>0): stknum=-1; print('sell',xtim,dprice,dsma,xnum); # return stknum