示例#1
0
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
示例#2
0
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)
示例#3
0
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) 
示例#4
0
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
示例#5
0
        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)
示例#6
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
#print dealArr[0].TradeDate
#print RecDateArr[0]
            
示例#7
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