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)
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)
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)
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')
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)
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)
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')
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
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)
def test_select_stock_func3(self): signalData = SourceDataDao.load_signal_data('') techList = [StockConst.MOM, 'Momp'] BackTestMainNew.select_stock_func3(signalData, techList)