Exemple #1
0
 def testSelectSignalByDateAndInnerCode(self):
     signalData = SourceDataDao.load_signal_data('')
     signalData = SourceDataDao.select_signal_by_date_and_inner_code(signalData, '2004-01-31', '000049.SZ')
     # self.assertEqual(self.sum(1, 2), 3)
     print('signalData:'+str(len(signalData)))
     #print(signalData)
     self.assertNotEqual(len(signalData), 0)
Exemple #2
0
def createFakeSignalData(addr):
    signalData = SourceDataDao.load_signal_data(addr)
    startDate = signalData.index[0][0]
    endDate = signalData.index[-1][0]
    startYear = DateUtil.datetime2_year_str(startDate)
    endYear = DateUtil.datetime2_year_str(endDate)
    FORMAT = "%d-%d-%d"
    # c = time.strftime('%Y%m%d', time.strptime(y, '%Y-%m-%d'))
    for year in range(int(startYear), int(endYear) + 1, 1):
        for month in range(1, 13):
            d = calendar.monthrange(year, month)
            exportStartDate = FORMAT % (year, month, 1)
            exportEndDate = FORMAT % (year, month, d[1])
            # exportStartDate = str(year)+'-'+addZero(month)+'-'+'01'
            # exportEndDate = str(year) + '-' + addZero(month) + '-' + getMonthEndDay(month)
            subSignalData = SourceDataDao.select_by_date(
                signalData, exportStartDate, exportEndDate)
            print('exportStartDate:' + exportStartDate)
            print('exportEndDate:' + exportEndDate)
            print('subSignalData:' + str(len(subSignalData)))
            if (len(subSignalData) > 0):
                newSubSignalData = subSignalData.copy()
                newSubSignalData['Mom2'] = subSignalData['Mom']
                newSubSignalData['Mom3'] = subSignalData['Mom']
                SourceDataDao.export_to_hdfstore(
                    newSubSignalData,
                    StockConst.ROOT + StockConst.FAKE_SIGNAL_DATA_H5)
Exemple #3
0
def printSingalDataByDate(date,addr):
    signalData = SourceDataDao.load_signal_data(addr)
    t1 = pd.Timestamp(date)
    #t2 = pd.Timestamp(endDate)
    #signalData = signalData.loc[t1:t2, :]
    signalData = signalData[signalData.index.get_level_values(0) == t1]
    signalData = signalData.sort_values(by=[StockConst.MOM], ascending=False)
    print(signalData)
Exemple #4
0
def addBuySellFlgToSignalData2(signalDataAddr, dailyQuoteAddr):
    signalData = SourceDataDao.load_signal_data(signalDataAddr)
    dailyQuote = SourceDataDao.load_new_daily_quote(dailyQuoteAddr)
    groupedSignalData = signalData.groupby(level=StockConst.TRADINGDAY,
                                           as_index=False).apply(
                                               SelectUtil.top, 5,
                                               StockConst.MOM, False)
    groupedSignalData[StockConst.BUY_FLG] = dailyQuote[StockConst.BUY_FLG]
    groupedSignalData[StockConst.SELL_FLG] = dailyQuote[StockConst.SELL_FLG]
    # groupedSignalData.insert(1, StockConst.buyFlg, Series())
    # groupedSignalData.insert(2, StockConst.sellFlg, Series())
    # for index, row in groupedSignalData.iterrows():
    #     # print('tradingDate:'+str(index[0])+',innerCode:'+str(index[2]))
    #     groupedSignalData.ix[index, [StockConst.buyFlg]] = dailyQuote.ix[(index[0], index[2]), [StockConst.buyFlg]]
    #     groupedSignalData.ix[index, [StockConst.sellFlg]] = dailyQuote.ix[(index[0], index[2]), [StockConst.sellFlg]]
    groupedSignalData.to_csv(StockConst.ROOT + '\export\groupedSignalData.csv')
Exemple #5
0
 def testSelect_stock_func1(self):
     signalData = SourceDataDao.load_signal_data('')
     techList = [StockConst.MOM]
     sliceIdx = None
     numOfDailySignal = 5
     sliceTotalNum = None
     sliceDict = {
         'sliceIdx': sliceIdx,
         'numOfDailySignal': numOfDailySignal,
         'sliceTotalNum': sliceTotalNum
     }
     groupedSignalData = BackTestMainNew.select_stock_func1(
         signalData, techList, sliceDict)
     currSignalData = groupedSignalData.xs('2005-01-05').xs('2005-01-05')
     entity = currSignalData.ix['000950.SZ']
     print(entity)
Exemple #6
0
def test10(addr):
    signalData = SourceDataDao.load_signal_data(addr)
    groupedSignalData = signalData.groupby(level=StockConst.TRADINGDAY, as_index=False).apply(SelectUtil.top, 5, StockConst.MOM, False)
    print(groupedSignalData)
Exemple #7
0
def exportSignal():
    signalData = SourceDataDao.load_signal_data(StockConst.ROOT + '/Mom_5_0302.h5')
    # signalData.to_csv(StockConst.root + '\export2\signalData.csv')
    # signalData.to_excel(StockConst.root + '\export2\signalData.xls', sheet_name='Sheet1')
    signalData.to_json(StockConst.ROOT + '\export2\signalData.json')
    signalData.to_hdf(StockConst.ROOT + '\export2\signalData.h5')
Exemple #8
0
def printGroupedSingalData(addr):
    signalData = SourceDataDao.load_signal_data(addr)
    groupedSignalData = signalData.groupby(level=StockConst.TRADINGDAY).apply(SelectUtil.top, 5, StockConst.MOM, False)
    groupedSignalData.to_csv(StockConst.ROOT + '\export\groupedSignalData.csv')
def main(select_stock_1day_func,trade_1day_func,techList,signalDataAddr = '', dailyQuoteAddr = '', startDate = '2004-01-01', endDate = '2005-12-31'):
    start = time.clock()

    signalData = SourceDataDao.load_signal_data(signalDataAddr) #ByDate
    #dailyQuote = SourceDataDao.loadDailyQuote()
    dailyQuote = SourceDataDao.load_new_daily_quote(dailyQuoteAddr) #ByDate

    start_1 = time.clock()
    signalData = signalData[(signalData.index.get_level_values(0) >= startDate) & (signalData.index.get_level_values(0) <= endDate) ]
    end_1 = time.clock()
    print("signalData花费时间:%f s" % (end_1 - start_1))

    # print(startDate)
    # print(endDate)
    dateList = SourceDataDao.select_date_from_signal(signalData, startDate, endDate)
    # print(dateList)

    # 统计结果
    stockStatDailyDf = pd.DataFrame(index=pd.date_range(startDate, endDate),
                                    columns=['netValue', 'changePCT', 'buyCnt', 'sellCnt', 'prevHoldCnt',
                                             'currHoldCnt', 'cannotSellCnt', 'cannotBuyCnt',
                                         'usableCach', 'mv'])
    # 每日持仓
    stockHoldDailyList = []
    # 交易结果
    stockTradeList = []

    start_trade = time.clock()
    # 交易
    t1d = process1day(startDate, endDate, dailyQuote, signalData, dateList, stockStatDailyDf, stockHoldDailyList, stockTradeList)
    res = signalData.groupby(level=StockConst.TRADINGDAY).apply(t1d.deal, techList, select_stock_1day_func, trade_1day_func)
    end_trade = time.clock()
    print("交易花费时间:%f s" % (end_trade - start_trade))


    result = ''

    start_stat = time.clock()
    # 信号数据
    #groupedSelectStock.to_csv(StockConst.root + '\export\groupedSelectStock.csv')

    # 每日交易
    # print('每日交易:')
    # print(stockTradeList)
    stockTradeDailyDf = pd.DataFrame(stockTradeList)
    stockTradeDailyDf.sort_values(by=['tradingDate'], ascending=True)
    # stockTradeDailyDf.to_csv(StockConst.root + '\export\stockTradeDaily.csv')

    # 每日持仓
    #print('每日持仓:')
    stockHoldDailyDf = pd.DataFrame(stockHoldDailyList)
    stockHoldDailyDf.sort_values(by=['tradingDate'],ascending=True)
    # stockHoldDailyDf.to_csv(StockConst.root + '\export\stockHoldDaily.csv')

    #每日统计(收益,净值,买入数,卖出数,持有数)
    stockStatDailyDf = stockStatDailyDf.dropna(how='all')
    result += '--' * 70 + '\n'
    result += '每日统计:' + '\n'
    result += stockStatDailyDf.to_string() + '\n'
    # stockStatDailyDf.to_csv(StockConst.root + '\export\stockStatDaily.csv')

    # 每年统计
    result += '--' * 70 + '\n'
    yearDf = StockYearService.main(stockStatDailyDf)
    result += '每年统计:' + '\n'
    result += yearDf.to_string() + '\n'

    # 最大回撤
    result += '--' * 70 + '\n'
    maxdrop = StockMaxDropNewService.get_max_drop(stockStatDailyDf)
    result += '最大回撤:' + '\n'
    result += SetUtil.dict_to_string(maxdrop) + '\n'
    #每年的最大回撤
    maxdropDf = StockMaxDropNewService.get_max_drop_for_each_year(stockStatDailyDf)
    maxdropDf.sort_values(by=["year"])
    result += '每年的最大回撤:' + '\n'
    result += maxdropDf.to_string() + '\n'

    #夏普比率
    result += '--' * 70 + '\n'
    sharpRatio = SharpRatioNewService.get_sharp_ratio(stockStatDailyDf)
    result += '夏普比率:' + '\n'
    result += str(sharpRatio) + '\n'
    #每年的夏普比率
    sharpRatioDf = SharpRatioNewService.get_sharp_ratio_for_each_year(stockStatDailyDf)
    sharpRatioDf.sort_values(by=["year"])
    result += '每年的夏普比率:' + '\n'
    result += sharpRatioDf.to_string() + '\n'

    end_stat = time.clock()
    print("统计花费时间:%f s" % (end_stat - start_stat))

    # result += '回测完成'
    end = time.clock()
    print("main花费时间:%f s" % (end - start))

    # 净值曲线图
    stockStatDailyDf['netValue'].plot()
    plt.show()

    resultDic={'stockStatDailyDf':stockStatDailyDf,'result':result}

    print(result)
    return resultDic
Exemple #10
0
 def testLoadSignalData(self):
     signalData = SourceDataDao.load_signal_data('')
     # self.assertEqual(self.sum(1, 2), 3)
     print('signalData:' + str(len(signalData)))
     self.assertNotEqual(len(signalData), 0)
def main(select_stock_func,
         trade_func,
         techList,
         signalDataAddr='',
         dailyQuoteAddr='',
         startDate='1/1/2004',
         endDate='12/31/2005'):
    start = time.clock()

    signalData = SourceDataDao.load_signal_data(signalDataAddr)
    #dailyQuote = SourceDataDao.loadDailyQuote()
    dailyQuote = SourceDataDao.load_new_daily_quote(dailyQuoteAddr)

    #参数
    #每天信号数
    #numOfDailySignal = 5
    #初始资金
    initialMV = 1000000  #1000000
    #开始结束日期
    #startDate = '1/8/2001'
    #startDate = '1/1/2004'
    #endDate = '1/1/2017'
    #eendDate = '5/18/2001'
    #endDate = '12/31/2005'
    #endDate = '12/31/2002'
    #endDate = '1/9/2001'

    #选股结果(外部传入)
    #select top 5 group by TradingDay order by Mom desc
    groupedSignalData = select_stock_func(signalData, techList)
    #当前持仓 key:innerCode value:
    currHoldSet = {}
    #资金情况
    capitalEntity = CapitalEntity.CapitalEntity(initialMV)
    lastMV = initialMV
    #初始化每日统计表
    stockStatDailyDf = pd.DataFrame(index=pd.date_range(startDate, endDate),
                                    columns=[
                                        'netValue', 'changePCT', 'buyCnt',
                                        'sellCnt', 'prevHoldCnt',
                                        'currHoldCnt', 'cannotSellCnt',
                                        'cannotBuyCnt', 'usableCach', 'mv'
                                    ])
    #初始化每日持仓表
    stockHoldDailyList = []
    stockTradeList = []

    #从信号表中取得唯一性日期
    dateList = SourceDataDao.select_date_from_signal(signalData, startDate,
                                                     endDate)
    # print(dateList)

    start_loop = time.clock()
    for index, item in enumerate(dateList):
        #for date in dateList:
        #print('index:'+str(index)+' len:'+str(len(dateList)))
        start_inloop0 = time.clock()

        #信号日
        signalDay = dateList[index]
        # 非最后一天
        if index < (len(dateList) - 1):
            #交易日
            tradingDay = dateList[index + 1]
            tradingDayStr = DateUtil.datetime2_str(tradingDay)
            #print('dateStr:'+dateStr)
        # 最后一天
        else:
            break

        #print(dateStr)
        currSignalData = groupedSignalData.ix[signalDay]
        # print(currSignalData)
        if StockConst.IS_DEBUG:
            print("currSignalData:" + str(len(currSignalData)))
            #print(currSignalData)

        end_inloop0 = time.clock()
        print("inloop0花费时间:%f s" % (end_inloop0 - start_inloop0))

        #交易方法(外部传入)
        start_inloop1 = time.clock()
        dict = trade_func(currSignalData, currHoldSet, dailyQuote, tradingDay,
                          signalData, capitalEntity)
        end_inloop1 = time.clock()
        print("trade_func花费时间:%f s" % (end_inloop1 - start_inloop1))

        actualBuyList = dict['actualBuyList']
        actualSellList = dict['actualSellList']
        prevHoldList = dict['prevHoldList']
        cannotBuyList = dict['cannotBuyList']
        cannotSellList = dict['cannotSellList']
        stockTradeListDaily = dict['stockTradeList']

        if len(stockTradeListDaily) > 0:
            stockTradeList.extend(stockTradeListDaily)

        # print(currHoldSet)

        #3.计算当日市值
        start_inloop2 = time.clock()
        currMV = calculateDailyMV(currHoldSet, capitalEntity, dailyQuote,
                                  tradingDay, stockHoldDailyList, initialMV)
        end_inloop2 = time.clock()
        print("calculateDailyMV花费时间:%f s" % (end_inloop2 - start_inloop2))

        start_inloop3 = time.clock()
        #4.个数
        buyCnt = len(actualBuyList)
        sellCnt = len(actualSellList)
        prevHoldCnt = len(prevHoldList)
        currHoldCnt = len(currHoldSet)
        cannotSellCnt = len(cannotSellList)
        cannotBuyCnt = len(cannotBuyList)

        # print(currMV)

        #if StockConst.isDebug:
        #print("dateStr:" + dateStr + " changePCTBuy:" + str(changePCTBuy) + " changePCTSell:" + str(changePCTSell) +
        #" changePCTHold:" + str(changePCTHold))

        #当日净值
        netValue = currMV / initialMV
        #print("netValue:" + str(netValue))
        #当日收益
        dailyChangePCT = NumUtil.get_change_pct(lastMV, currMV, 2)
        #当日可用现金
        usableCach = capitalEntity.get_usable_cash()
        #
        stockStatDailyDf.ix[
            tradingDayStr] = netValue, dailyChangePCT, buyCnt, sellCnt, prevHoldCnt, currHoldCnt, cannotSellCnt, cannotBuyCnt, usableCach, currMV
        #
        lastMV = currMV
        end_inloop3 = time.clock()
        print("inloop3花费时间:%f s" % (end_inloop3 - start_inloop3))

        pass

    end_loop = time.clock()
    print("for循环花费时间:%f s" % (end_loop - start_loop))

    result = ''

    start_stat = time.clock()
    # 信号数据
    #groupedSignalData.to_csv(StockConst.root + '\export\groupedSignalData.csv')

    # 每日交易
    # print('每日交易:')
    # print(stockTradeList)
    stockTradeDailyDf = pd.DataFrame(stockTradeList)
    stockTradeDailyDf.sort_values(by=['tradingDate'], ascending=True)
    # stockTradeDailyDf.to_csv(StockConst.root + '\export\stockTradeDaily.csv')

    # 每日持仓
    #print('每日持仓:')
    stockHoldDailyDf = pd.DataFrame(stockHoldDailyList)
    stockHoldDailyDf.sort_values(by=['tradingDate'], ascending=True)
    # stockHoldDailyDf.to_csv(StockConst.root + '\export\stockHoldDaily.csv')

    #每日统计(收益,净值,买入数,卖出数,持有数)
    stockStatDailyDf = stockStatDailyDf.dropna(how='all')
    result += '--' * 70 + '\n'
    result += '每日统计:' + '\n'
    result += stockStatDailyDf.to_string() + '\n'
    # stockStatDailyDf.to_csv(StockConst.root + '\export\stockStatDaily.csv')

    # 每年统计
    result += '--' * 70 + '\n'
    yearDf = StockYearService.main(stockStatDailyDf)
    result += '每年统计:' + '\n'
    result += yearDf.to_string() + '\n'

    # 最大回撤
    result += '--' * 70 + '\n'
    maxdrop = StockMaxDropNewService.get_max_drop(stockStatDailyDf)
    result += '最大回撤:' + '\n'
    result += SetUtil.dict_to_string(maxdrop) + '\n'
    #每年的最大回撤
    maxdropDf = StockMaxDropNewService.get_max_drop_for_each_year(
        stockStatDailyDf)
    maxdropDf.sort_values(by=["year"])
    result += '每年的最大回撤:' + '\n'
    result += maxdropDf.to_string() + '\n'

    #夏普比率
    result += '--' * 70 + '\n'
    sharpRatio = SharpRatioNewService.get_sharp_ratio(stockStatDailyDf)
    result += '夏普比率:' + '\n'
    result += str(sharpRatio) + '\n'
    #每年的夏普比率
    sharpRatioDf = SharpRatioNewService.get_sharp_ratio_for_each_year(
        stockStatDailyDf)
    sharpRatioDf.sort_values(by=["year"])
    result += '每年的夏普比率:' + '\n'
    result += sharpRatioDf.to_string() + '\n'

    end_stat = time.clock()
    print("统计花费时间:%f s" % (end_stat - start_stat))

    # result += '回测完成'
    end = time.clock()
    print("main花费时间:%f s" % (end - start))

    # 净值曲线图
    stockStatDailyDf['netValue'].plot()
    plt.show()

    resultDic = {'stockStatDailyDf': stockStatDailyDf, 'result': result}

    print(result)
    return resultDic
def mergeSignalWithZZ800():
    signalDataDf = SourceDataDao.load_signal_data('')
    indexDf = SourceDataDao.load_h5(StockConst.ROOT + StockConst.ZZ800H5)
    # signalDataDf = selectSignalByDate(signalDataDf,'2005-01-01','2005-04-08')
    # hs300Df = hs300Df.loc[(hs300Df['NatureDay'] == '2005-04-08')]
    mergeSignalWithIndexMain(signalDataDf, indexDf, StockConst.SIGNAL_DATA_BASEDON_ZZ800)
Exemple #13
0
 def test_select_stock_func3(self):
     signalData = SourceDataDao.load_signal_data('')
     techList = [StockConst.MOM, 'Momp']
     BackTestMainNew.select_stock_func3(signalData, techList)