def TWNFutureLocal(vYear,vItem): def movedash(vstr='',vkind = 'float'): try: a = float(vstr) if vkind == 'float': return float(a) elif vkind == 'int': return int(a) except ValueError: return 0 dealArr = [] settledatearr=[] settleDTroute = os.path.join(os.getcwd(),vYear + 'setttledate.csv') dataroute = os.path.join(os.getcwd(),vYear + '_fut.csv') with open(settleDTroute) as csvsedtfile: reader = csv.DictReader(csvsedtfile) for row in reader: settledatearr.append(str2date(row['date'])) with open(dataroute) as csvfile: reader = csv.DictReader(csvfile) for row in reader: if row['契約'] == vItem: try: dDeal = DateDeal(TradeDate = str2date(row['交易日期'],'%Y/%m/%d'), OpenPrice = movedash(row['開盤價']), HighPrice = movedash(row['最高價']), LowPrice = movedash(row['最低價']), ClosePrice = movedash(row['收盤價']), DealAmt = movedash(row['成交量']), ) except ValueError: print 'please check contract ' + row['契約'] + ' ' + date2str(str2date(row['交易日期'])) sys.exit() ''' 判斷是否為近一月契約 ''' ContDate = row['到期月份(週別)'] #FutTradeDate = dDeal.TradeDate if ContDate == vYear + '01' and (datetime.datetime(int(vYear),1,1)<=dDeal.TradeDate <= settledatearr[0]): dealArr.append(dDeal) if ContDate == vYear + '02' and (settledatearr[0] < dDeal.TradeDate <= settledatearr[1]): dealArr.append(dDeal) if ContDate == vYear + '03' and (settledatearr[1] < dDeal.TradeDate <= settledatearr[2]): dealArr.append(dDeal) if ContDate == vYear + '04' and (settledatearr[2] < dDeal.TradeDate <= settledatearr[3]): dealArr.append(dDeal) if ContDate == vYear + '05' and (settledatearr[3] < dDeal.TradeDate <= settledatearr[4]): dealArr.append(dDeal) if ContDate == vYear + '06' and (settledatearr[4] < dDeal.TradeDate <= settledatearr[5]): dealArr.append(dDeal) if ContDate == vYear + '07' and (settledatearr[5] < dDeal.TradeDate <= settledatearr[6]): dealArr.append(dDeal) if ContDate == vYear + '08' and (settledatearr[6] < dDeal.TradeDate <= settledatearr[7]): dealArr.append(dDeal) if ContDate == vYear + '09' and (settledatearr[7] < dDeal.TradeDate <= settledatearr[8]): dealArr.append(dDeal) if ContDate == vYear + '10' and (settledatearr[8] < dDeal.TradeDate <= settledatearr[9]): dealArr.append(dDeal) if ContDate == vYear + '11' and (settledatearr[9] < dDeal.TradeDate <= settledatearr[10]): dealArr.append(dDeal) if ContDate == vYear + '12' and (settledatearr[10] < dDeal.TradeDate <= settledatearr[11]): dealArr.append(dDeal) return dealArr
def DIProcess(vTarget): import csv import datetime import strategy1 from strategy1 import IndexCal import math from BaseFunction import date2str, floatrou, str2date, txtpercent from ClsContract import Account from ClsContract import Contract from ClsContract import DateDeal from strategy1 import durationMax from strategy1 import IndexCal from DataPipe import TWNStockTIOMO, YahooFinance from figure_plot_output import Acct_mkt_compare, Acct_mkt_candle from ClsGenReport import CalCAGR, CalSharpInd, CalDD, BackwardTest dealArr = YahooFinance(vTarget=vTarget) #dealArr = TWNStockTIOMO(vTarget=vTarget,vbegin = '201101',vend = '201512') Cind = IndexCal(dealArr) ''' 用DI+ > DI-做多,DI- <DI+做空,用prebadK停損 ''' RecDateArr = [] RecAmtArr = [] RecContArr = [] ClosePriceArr = [] CloseConArr = [] RsiArr = [] maArr = [] lenw = 17 i = 0 preDIp = -1 preDIm = -1 newDIp = -1 newDIm = -1 PostAmt = 1 Acct1 = Account(initAmt=400000.) RsiArr = Cind.RsiCal(lenw) maArr = Cind.moving_average(Cind.ClosePriceArr, 40) upCriteria = 70 downCriteria = 30 #因為不會有負值,用-1當作初始值 for deal in dealArr: Acct1.BuildArr.append(None) Acct1.EvenArr.append(None) ind = Cind.dateArr.index(deal.TradeDate) preMA = maArr[ind - 1] nowMA = maArr[ind] for cont in Acct1.UnConList: cont.OverDate(deal) if cont.TradeWay > 0: rTrend = 'UP' else: rTrend = 'DOWN' if cont.StopLoss_FixPer(N=0.05): cont.CloseContract(deal) Acct1.AcctCloseCon() Acct1.totalAmt = Acct1.totalAmt + floatrou( ((cont.EvenPrice * cont.Position * 0.003) + (cont.EvenPrice * cont.Position * 0.001425 * 0.6))) CloseConArr.append({ 'InitDate': cont.InitDate, 'EndDate': cont.EndDate, 'DealAmt': cont.Position, 'OpenPrice': cont.BuildPrice, 'ClosePrice': cont.EvenPrice, 'Stop Loss': 'Yes' }) print 'Init Date: ' + date2str(cont.InitDate) + ' Init Price:' + str(cont.BuildPrice) +' stop price:' + str(cont.EvenPrice) +\ ' exit at:' + date2str(deal.TradeDate) + ' TredeWay:' + str(cont.TradeWay) + ' stoploss:Y' if cont.TradeWay > 0: if Cind.RsiStop(vDeal=deal, vTrend=rTrend, Criteria=upCriteria, vRsiArr=RsiArr, vwindow=lenw): cont.CloseContract(deal) Acct1.AcctCloseCon() Acct1.totalAmt = Acct1.totalAmt + floatrou( ((cont.EvenPrice * cont.Position * 0.003) + (cont.EvenPrice * cont.Position * 0.001425 * 0.6))) CloseConArr.append({ 'InitDate': cont.InitDate, 'EndDate': cont.EndDate, 'DealAmt': cont.Position, 'OpenPrice': cont.BuildPrice, 'ClosePrice': cont.EvenPrice, 'Stop Loss': 'Yes' }) print 'Init Date: ' + date2str(cont.InitDate) + ' Init Price:' + str(cont.BuildPrice) +' stop price:' + str(cont.EvenPrice) +\ ' exit at:' + date2str(deal.TradeDate) + ' TredeWay:' + str(cont.TradeWay)+ ' stoploss:N' else: if Cind.RsiStop(vDeal=deal, vTrend=rTrend, Criteria=downCriteria, vRsiArr=RsiArr, vwindow=lenw): cont.CloseContract(deal) Acct1.AcctCloseCon() Acct1.totalAmt = Acct1.totalAmt + floatrou( ((cont.EvenPrice * cont.Position * 0.003) + (cont.EvenPrice * cont.Position * 0.001425 * 0.6))) CloseConArr.append({ 'InitDate': cont.InitDate, 'EndDate': cont.EndDate, 'DealAmt': cont.Position, 'OpenPrice': cont.BuildPrice, 'ClosePrice': cont.EvenPrice, 'Stop Loss': 'Yes' }) print 'Init Date: ' + date2str(cont.InitDate) + ' Init Price:' + str(cont.BuildPrice) +' stop price:' + str(cont.EvenPrice) +\ ' exit at:' + date2str(deal.TradeDate) + ' TredeWay:' + str(cont.TradeWay)+ ' stoploss:N' RecDateArr.append(deal.TradeDate) RecAmtArr.append(Acct1.totalAmt) ClosePriceArr.append(deal.ClosePrice) if i <= lenw: i += 1 continue else: if newDIp == -1 and newDIm == -1: newDIp, newDIm = Cind.DICal(vDeal=deal) continue else: preDIp = newDIp preDIm = newDIm newDIp, newDIm = Cind.DICal(vDeal=deal) if (preDIp - preDIm) * (newDIp - newDIm) < 0: if nowMA < preMA: if (preDIp - preDIm) > 0: #continue #做空 cont1 = Contract(ContName=date2str(deal.TradeDate), Position=PostAmt * 1000, vDateDeal=deal, TradeWay=-1) Acct1.AddContr(cont1) #print 'preDIp:' + str(preDIp) + ' preDIm:' + str(preDIm) +' newDIp:' + str(newDIp)+ ' newDIm:' + str(newDIm) else: if preMA < nowMA: #做多 #continue cont1 = Contract(ContName=date2str(deal.TradeDate), Position=PostAmt * 1000, vDateDeal=deal, TradeWay=1) Acct1.AddContr(cont1) #print 'preDIp:' + str(preDIp) + ' preDIm:' + str(preDIm) +' newDIp:' + str(newDIp)+ ' newDIm:' + str(newDIm) #Acct_mkt_compare(RecDateArr,RecAmtArr,ClosePriceArr) Acct_mkt_candle(dealArr, RecAmtArr, Acct1.BuildArr) rCalDDAmt, rCalDD = CalDD(RecAmtArr) printtxt = [] printtxt.append('CARG:' + txtpercent(CalCAGR(RecAmtArr))) printtxt.append('Sharp Index:' + txtpercent(CalSharpInd(RecAmtArr))) printtxt.append('Max DD duration:' + str(rCalDD)) printtxt.append('Max DD Amount:' + txtpercent(rCalDDAmt)) printtxt.append('Target:' + vTarget) BackwardTest("test.png", printtxt)
def DIProcess(vTarget): import csv import datetime import strategy1 from strategy1 import IndexCal import math from BaseFunction import date2str,floatrou,str2date,txtpercent from ClsContract import Account from ClsContract import Contract from ClsContract import DateDeal from strategy1 import durationMax from strategy1 import IndexCal from DataPipe import TWNStockTIOMO,YahooFinance from figure_plot_output import Acct_mkt_compare,Acct_mkt_candle from ClsGenReport import CalCAGR,CalSharpInd,CalDD,BackwardTest dealArr = YahooFinance(vTarget=vTarget) #dealArr = TWNStockTIOMO(vTarget=vTarget,vbegin = '201101',vend = '201512') Cind = IndexCal(dealArr) ''' 用DI+ > DI-做多,DI- <DI+做空,用prebadK停損 ''' RecDateArr=[] RecAmtArr=[] RecContArr=[] ClosePriceArr = [] CloseConArr = [] RsiArr = [] maArr = [] lenw = 17 i = 0 preDIp = -1 preDIm = -1 newDIp = -1 newDIm = -1 PostAmt = 1 Acct1 = Account(initAmt = 400000.) RsiArr = Cind.RsiCal(lenw) maArr = Cind.moving_average(Cind.ClosePriceArr,40) upCriteria = 70 downCriteria = 30 #因為不會有負值,用-1當作初始值 for deal in dealArr: Acct1.BuildArr.append(None) Acct1.EvenArr.append(None) ind = Cind.dateArr.index(deal.TradeDate) preMA = maArr[ind-1] nowMA = maArr[ind] for cont in Acct1.UnConList: cont.OverDate(deal) if cont.TradeWay > 0: rTrend = 'UP' else: rTrend = 'DOWN' if cont.StopLoss_FixPer(N = 0.05): cont.CloseContract(deal) Acct1.AcctCloseCon() Acct1.totalAmt = Acct1.totalAmt + floatrou(((cont.EvenPrice * cont.Position * 0.003) + (cont.EvenPrice * cont.Position * 0.001425 * 0.6))) CloseConArr.append({'InitDate':cont.InitDate,'EndDate':cont.EndDate,'DealAmt':cont.Position,'OpenPrice':cont.BuildPrice,'ClosePrice':cont.EvenPrice,'Stop Loss':'Yes'}) print 'Init Date: ' + date2str(cont.InitDate) + ' Init Price:' + str(cont.BuildPrice) +' stop price:' + str(cont.EvenPrice) +\ ' exit at:' + date2str(deal.TradeDate) + ' TredeWay:' + str(cont.TradeWay) + ' stoploss:Y' if cont.TradeWay > 0: if Cind.RsiStop(vDeal = deal,vTrend = rTrend,Criteria = upCriteria,vRsiArr = RsiArr,vwindow=lenw): cont.CloseContract(deal) Acct1.AcctCloseCon() Acct1.totalAmt = Acct1.totalAmt + floatrou(((cont.EvenPrice * cont.Position * 0.003) + (cont.EvenPrice * cont.Position * 0.001425 * 0.6))) CloseConArr.append({'InitDate':cont.InitDate,'EndDate':cont.EndDate,'DealAmt':cont.Position,'OpenPrice':cont.BuildPrice,'ClosePrice':cont.EvenPrice,'Stop Loss':'Yes'}) print 'Init Date: ' + date2str(cont.InitDate) + ' Init Price:' + str(cont.BuildPrice) +' stop price:' + str(cont.EvenPrice) +\ ' exit at:' + date2str(deal.TradeDate) + ' TredeWay:' + str(cont.TradeWay)+ ' stoploss:N' else: if Cind.RsiStop(vDeal = deal,vTrend = rTrend,Criteria = downCriteria,vRsiArr = RsiArr,vwindow=lenw): cont.CloseContract(deal) Acct1.AcctCloseCon() Acct1.totalAmt = Acct1.totalAmt + floatrou(((cont.EvenPrice * cont.Position * 0.003) + (cont.EvenPrice * cont.Position * 0.001425 * 0.6))) CloseConArr.append({'InitDate':cont.InitDate,'EndDate':cont.EndDate,'DealAmt':cont.Position,'OpenPrice':cont.BuildPrice,'ClosePrice':cont.EvenPrice,'Stop Loss':'Yes'}) print 'Init Date: ' + date2str(cont.InitDate) + ' Init Price:' + str(cont.BuildPrice) +' stop price:' + str(cont.EvenPrice) +\ ' exit at:' + date2str(deal.TradeDate) + ' TredeWay:' + str(cont.TradeWay)+ ' stoploss:N' RecDateArr.append(deal.TradeDate) RecAmtArr.append(Acct1.totalAmt) ClosePriceArr.append(deal.ClosePrice) if i <= lenw: i += 1 continue else: if newDIp == -1 and newDIm == -1: newDIp,newDIm = Cind.DICal(vDeal = deal) continue else: preDIp = newDIp preDIm = newDIm newDIp,newDIm = Cind.DICal(vDeal = deal) if (preDIp - preDIm)* (newDIp - newDIm)<0: if nowMA < preMA: if (preDIp - preDIm) > 0: #continue #做空 cont1 = Contract(ContName=date2str(deal.TradeDate),Position = PostAmt*1000,vDateDeal = deal,TradeWay=-1) Acct1.AddContr(cont1) #print 'preDIp:' + str(preDIp) + ' preDIm:' + str(preDIm) +' newDIp:' + str(newDIp)+ ' newDIm:' + str(newDIm) else: if preMA < nowMA: #做多 #continue cont1 = Contract(ContName=date2str(deal.TradeDate),Position = PostAmt*1000,vDateDeal = deal,TradeWay=1) Acct1.AddContr(cont1) #print 'preDIp:' + str(preDIp) + ' preDIm:' + str(preDIm) +' newDIp:' + str(newDIp)+ ' newDIm:' + str(newDIm) #Acct_mkt_compare(RecDateArr,RecAmtArr,ClosePriceArr) Acct_mkt_candle(dealArr,RecAmtArr,Acct1.BuildArr) rCalDDAmt,rCalDD = CalDD(RecAmtArr) printtxt = [] printtxt.append('CARG:' + txtpercent(CalCAGR(RecAmtArr))) printtxt.append('Sharp Index:' + txtpercent(CalSharpInd(RecAmtArr))) printtxt.append('Max DD duration:' + str(rCalDD)) printtxt.append('Max DD Amount:' + txtpercent(rCalDDAmt)) printtxt.append('Target:' + vTarget) BackwardTest("test.png",printtxt)
def OneDayTransaction(TType='Open',vDeal = DateDeal,vTradeWay = 1,vStopLossPt = 10,vflexP = 1,vPosition=0): if TType == 'Open': Cont = Contract(vDateDeal = vDeal,OpenApp = 'Open',TradeWay = vTradeWay, Position = vPosition,ContName = date2str(vDeal.TradeDate)) if vTradeWay >0: if vDeal.OpenPrice - vDeal.LowPrice >= vStopLossPt: #要停損 result = max(vDeal.OpenPrice - vStopLossPt - vflexP,vDeal.LowPrice) Cont.CloseContract(vDateDeal= vDeal,ClosePrice = result,CloseApp = 'Assign') else: Cont.CloseContract(vDateDeal= vDeal,CloseApp = 'Close') else: if vDeal.HighPrice - vDeal.OpenPrice >= vStopLossPt: #要停損 result = min(vDeal.OpenPrice + vStopLossPt + vflexP,vDeal.HighPrice) Cont.CloseContract(vDateDeal= vDeal,ClosePrice = result,CloseApp = 'Assign') else: Cont.CloseContract(vDateDeal= vDeal,CloseApp = 'Close') return Cont
DayResult1Arr.append(DayResult1) Acct1.AddContr(DayResult1) Acct1.AcctCloseCon() Acct1.totalAmt = Acct1.totalAmt - feeCal(vPt=dealArr[i].ClosePrice,vPosition = Position,vfee=60) RecAmt1Arr.append(Acct1.totalAmt) DayResult2 = OneDayTransaction(vDeal = dealArr[i],vTradeWay = -1,vPosition = Position) #這是一個Contract DayResult2Arr.append(DayResult2) Acct2.AddContr(DayResult2) Acct2.AcctCloseCon() Acct2.totalAmt = Acct2.totalAmt - feeCal(vPt=dealArr[i].ClosePrice,vPosition = Position,vfee=60) RecAmt2Arr.append(Acct2.totalAmt) totalAmtArr.append(Acct1.totalAmt + Acct2.totalAmt) writetxt('AA.txt',date2str(dealArr[i].TradeDate) + ','+ str(DayResult1.BuildPrice) + ',' + str(DayResult1.EvenPrice)\ + ',' + str(DayResult1.GainLoss) + ','+ str(Acct1.totalAmt)) Acct_mkt_compare(RecDateArr,RecAmt2Arr,ClosePriceArr) rCalDDAmt,rCalDD = CalDD(totalAmtArr) printtxt = [] printtxt.append('CAGR:' + txtpercent(CalCAGR(totalAmtArr))) printtxt.append('CalSharpInd:' + txtpercent(CalSharpInd(totalAmtArr))) printtxt.append('CalDD:' + str(rCalDD)) printtxt.append('CalDDAmt:' + txtpercent(rCalDDAmt)) BackwardTest("test.png",printtxt)
找該date之ATR,然後計算該日如果交易的最適交易量 ''' if deal.TradeDate in DateATRArr: IntATR = DateATRArr.index(deal.TradeDate)+1 ATR = ATRArr[IntATR] PostAmt = math.floor((Acct1.totalAmt * 0.01)/(ATR*1000)) else: continue ''' 加上MA位置filter ''' if IndCal.MAPosition(vRange=60,vDeal = deal,vLocate = 'DOWN'): continue if(dura.CalMax(vTargetDate = date2str(deal.TradeDate),Period = 10)): if len(Acct1.UnConList)<4: cont1 = Contract(ContName=date2str(deal.TradeDate),Position = PostAmt*1000,vDateDeal = deal) Acct1.AddContr(cont1) ''' 計算手續費,買賣時都須加計交易金額*0.001425 ''' Acct1.totalAmt = Acct1.totalAmt - floatrou(cont1.BuildPrice * cont1.Position * 0.001425 * 0.06) RecContArr.append(cont1) #print len(dealArr) #print len(RecAmtArr) #print IndCal.dealarr[0].TradeDate #print dealArr[0].TradeDate #print RecDateArr[0]
''' 找該date之ATR,然後計算該日如果交易的最適交易量 ''' if deal.TradeDate in DateATRArr: IntATR = DateATRArr.index(deal.TradeDate) + 1 ATR = ATRArr[IntATR] PostAmt = math.floor((Acct1.totalAmt * 0.01) / (ATR * 1000)) else: continue ''' 加上MA位置filter ''' if IndCal.MAPosition(vRange=60, vDeal=deal, vLocate='DOWN'): continue if (dura.CalMax(vTargetDate=date2str(deal.TradeDate), Period=10)): if len(Acct1.UnConList) < 4: cont1 = Contract(ContName=date2str(deal.TradeDate), Position=PostAmt * 1000, vDateDeal=deal) Acct1.AddContr(cont1) ''' 計算手續費,買賣時都須加計交易金額*0.001425 ''' Acct1.totalAmt = Acct1.totalAmt - floatrou( cont1.BuildPrice * cont1.Position * 0.001425 * 0.06) RecContArr.append(cont1) #print len(dealArr) #print len(RecAmtArr) #print IndCal.dealarr[0].TradeDate