def getReturn(data): if os.path.exists("data.csv"): data = pd.read_csv("data.csv", index_col="code") return data start = "2017-01-01" end = "2020-07-31" codes = data.index names = fromCodeToName(data, codes) codes = [str(x) for x in codes] # print(codes) # print(names) # 在数据中增加一列计算年化收益率 data["ar"] = 0.0 t = 0 cash = 100000 for code in data.index: test = backtest.BackTest(FactorStrategy, start, end, [str(code)], [names[t]], cash, bDraw=False) result = test.run() print("第{}次回测,股票代码{},回测年化收益率{}。".format(t + 1, code, result.年化收益率)) data.loc[code, ["ar"]] = result.年化收益率 t += 1 data.to_csv("data.csv") return data
def doBacktest(factors, strategy, a1, a2, a3, a4, a5, start, end, cash): score = scale(factors, a1, a2, a3, a4, a5) codes = score[-10:].index name = fromCodeToName(factors, codes) code = [str(x) for x in codes] opttest = backtest.BackTest(strategy, start, end, code, name, cash, bDraw = False) result = opttest.run() return result, code
def plot(self): print u'WF组合收益图' self.all_sample_factor = np.vstack([self.policy_record[1].is_factor, self.policy_record[1].oos_factor]) returns = np.vstack([self.is_resample_return[1], self.oos_resample_return[1]]) dates = np.append(self.is_resample_dates[1], self.oos_resample_dates[1]) is_oos_arr = np.append(np.zeros_like(self.policy_record[1].is_factor), np.ones_like(self.policy_record[1].oos_factor)) for i in np.sort(self.config.WF_dates.keys())[1:]: self.all_sample_factor = np.vstack([self.all_sample_factor, self.policy_record[i].oos_factor]) returns = np.vstack([returns, self.oos_resample_return[i]]) dates = np.append(dates, self.oos_resample_dates[i]) is_oos_arr = np.append(is_oos_arr, i * np.ones_like(self.policy_record[i].oos_factor)) #print factor.shape, returns.shape, dates.shape #print is_oos_arr.shape #print factor bt = backtest.BackTest(self.all_sample_factor, returns, dates) bt.run() bt.stats_info() bt.two_in_one() bt.ts_plot() #is_oos_arr=is_oos_arr, #title='WF train:%s predict:%s' %(self.config.train_bars, self.config.predict_bars)) #output='/home/dev/FalconPolicy/WalkForward/' + self.config.policy_path.split('/')[-1].split('.py')[0] + '_WF_train_%s_predict_%s.png' %(self.config.train_bars, self.config.predict_bars)) print u'样本外收益图' self.oos_sample_factor = self.policy_record[1].oos_factor returns = self.oos_resample_return[1] dates = self.oos_resample_dates[1] is_oos_arr = np.ones_like(self.policy_record[1].oos_factor) for i in np.sort(self.config.WF_dates.keys())[1:]: self.oos_sample_factor = np.vstack([self.oos_sample_factor, self.policy_record[i].oos_factor]) returns = np.vstack([returns, self.oos_resample_return[i]]) dates = np.append(dates, self.oos_resample_dates[i]) is_oos_arr = np.append(is_oos_arr, i * np.ones_like(self.policy_record[1].oos_factor)) bt = backtest.BackTest(self.oos_sample_factor, returns, dates) bt.run() bt.stats_info() bt.two_in_one() bt.ts_plot()
def getReturn(data): if os.path.exists("data.csv"): data = pd.read_csv("data.csv") codes = data.code codes = ["%06d" % x for x in codes] data.code = codes return data start = "2017-01-01" end = "2020-07-31" codes = data.code codes = ["%06d" % x for x in codes] data.code = codes # names = fromCodeToName(data, codes) # print(names) # print(len(codes), len(names)) # codes = [str(x) for x in codes] # print(codes) # print(codes) # print(names) # 在数据中增加一列计算年化收益率 data["ar"] = 0.0 t = 0 cash = 100000 # codes.remove("000029") names = data.name.values.tolist() # names.remove("深深房A") ar = [] for code in codes: test = backtest.BackTest(FactorStrategy, start, end, [code], [names[t]], cash, bDraw=False) result = test.run() print("第{}次回测,股票代码{},回测年化收益率{}。".format(t + 1, code, result.年化收益率)) ar.append(result.年化收益率) # data.loc[t, "ar"] = result.年化收益率 # print(data.info()) t += 1 print(data.shape, len(ar)) data["ar"] = ar print(data.info()) data.to_csv("data.csv") return data
def doTest(codes, method): names = fromCodeToName(data, codes) codes = [str(x) for x in codes] start = "2010-01-01" end = "2020-07-01" cash = 1000000 opttest = backtest.BackTest(FactorStrategy, start, end, codes, names, cash, bDraw=False) result = opttest.run() result["选股方法"] = method result["股票代码"] = codes print(result) return result
def testMultiRegress(data): model = joblib.load("LineRegress.m") pred_return = model.predict(data.iloc[:, 3:21]) # print(pred_return) data["pred_ar"] = pred_return # print(data) # 排序 data = data.sort_values(by = "pred_ar", ascending = False) # print(data) # 取前十个股票作为投资标的 codes = data.index[0:10].values # print(codes) names = fromCodeToName(data, codes) codes = [str(x) for x in codes] start = "2010-01-01" end = "2020-07-01" cash = 1000000 opttest = backtest.BackTest(FactorStrategy, start, end, codes, names, cash, bDraw = True) result = opttest.run() print("多元线性回归的回测结果:") print(result)
def checkResult(strategy, codes, names, start, end, cash = 1000000): opttest = backtest.BackTest(strategy, start, end, codes, names, cash) result = opttest.run() print("回测结果") print(result)
df_stock['date']=pd.to_datetime(df_stock['time_key']) df_stock.to_csv(path + filename) df_stock.index = pd.to_datetime(df_stock.date) df_stock['openinterest']=0 df_stock = df_stock[['open','high','low','close','volume','openinterest']] df.update({stock:df_stock}) return df if __name__ == "__main__": start = '2017-01-09' end = '2020-09-05' code = ['HK.00700'] name = code df_stock = get_stockdata(code,start,end) df_cn = pd.read_csv('to_cn.csv',index_col=0) df_stock = get_stockdata(code,start,end) backtest = backtest.BackTest(Tech_roll, start, end, code, name,500000,bDraw = True) result = backtest.run() #result = backtest.run() #result = backtest.optRun(myperiod = range(50,150,20)) #print(result) print(result) #maxindex = ret[ret == ret.max()].index #bestResult = result.loc[maxindex,:] #print(bestResult.loc[:, ["夏普比率", "参数名", "参数值", "年化收益率"]])
tradeBar = self.df_record.loc[date.strftime("%Y-%m-%d"), :] # print("bar数据", date, data._name) if len(tradeBar) != 0: for i in range(len(tradeBar)): name = tradeBar.iloc[i].证券名称 price = tradeBar.iloc[i].成交均价 stock = tradeBar.iloc[i].成交量 commit = tradeBar.iloc[i].手续费 # 进行交易 self.__doTrade(data, name, price, stock, commit, orderType) def next(self): if self.order: return self.doTrade() def stop(self): self.log("最大回撤:-%.2f%%" % self.stats.drawdown.maxdrawdown[-1], doprint=True) if __name__ == "__main__": # 加载数据,建立数据源 start = "2018-01-01" end = "2020-07-05" name = ["300ETF", "nasETF"] code = ["510300", "513100"] backtest = backtest.BackTest(TradeStrategy, start, end, code, name) backtest.run() backtest.output()
if self.bb.bot > self.datas[0].close: cash = self.broker.get_cash() stock = math.ceil(cash / self.dataclose / 100) * 100 - 100 self.order = self.buy(size=stock, price=self.datas[0].close, exectype=bt.Order.Market) else: # 持仓且突破上轨,卖出 if self.bb.bot < self.datas[0].close: self.order = self.close() def notify_order(self, order): # 有交易提交/被接受,啥也不做 if order.status in [order.Submitted, order.Accepted]: return self.order = None if __name__ == "__main__": start = "2018-01-01" end = "2020-07-05" name = ["nasetf"] code = ["513100"] backtest = backtest.BackTest(Bolling, start, end, code, name, 10000) result = backtest.run() # backtest.output() print(result) result = backtest.optRun(period=range(6, 30)) print(result)
self.bBuy = False self.dataclose = self.datas[0].close def next(self): if self.bBuy == True: return else: cash = self.broker.get_cash() stock = math.ceil(cash / self.dataclose / 100) * 100 - 100 self.order = self.buy(size=stock, price=self.datas[0].close) self.bBuy = True def stop(self): self.order = self.close() if __name__ == "__main__": start = "2018-01-01" end = "2020-07-05" name = ["nasetf"] code = ["513100"] backtest = backtest.BackTest(SmaCross, start, end, code, name, 10000) result = backtest.run() # backtest.output() print(result) result = backtest.optRun(pslow=range(6, 30)) print(result.describe()) plt.figure() plt.plot(result.年化收益率) plt.savefig("SmaCross参数优化.png")
self.comm += order.executed.comm elif order.status in [order.Canceled, order.Margin, order.Rejected]: self.log("交易失败") self.order = None # 输出手续费 def stop(self): self.log("手续费:%.2f 成本比例:%.5f" % (self.comm, self.comm / self.broker.getvalue())) if __name__ == "__main__": start = "2018-01-01" end = "2020-07-05" name = ["300etf"] code = ["510300"] backtest = backtest.BackTest(TurtleStrategy, start, end, code, name, 100000) result = backtest.run() # backtest.output() print(result) result = backtest.optRun(long_period=range(20, 40), short_period=range(5, 15)) plt.figure() plt.plot(result.参数值, result.年化收益率) plt.savefig("海龟策略参数优化.png") ret = result.loc[:, "年化收益率"] maxindex = ret[ret == ret.max()].index bestResult = result.loc[maxindex, :] print(bestResult.loc[:, ["夏普比率", "参数名", "参数值", "年化收益率"]])
(order.executed.price, order.executed.value, order.executed.comm)) self.comm += order.executed.comm elif order.status in [order.Canceled, order.Margin, order.Rejected]: self.log("交易失败") self.order = None # 输出手续费 def stop(self): self.log("手续费:%.2f 成本比例:%.5f" % (self.comm, self.comm / self.broker.getvalue())) if __name__ == "__main__": start = "2018-01-01" end = "2020-07-05" name = ["300etf"] code = ["510300"] backtest = backtest.BackTest(GridStrategy, start, end, code, name, 100000) result = backtest.run() # backtest.output() print(result) # 看选择不同网格宽度的效果 result = backtest.optRun(gap=np.arange(0.005, 0.055, 0.005)) plt.figure() plt.plot(result.参数值, result.年化收益率) plt.savefig("网格策略宽度优化.png") ret = result.loc[:, "年化收益率"] maxindex = ret[ret == ret.max()].index bestResult = result.loc[maxindex, :] print(bestResult.loc[:, ["夏普比率", "参数名", "参数值", "年化收益率"]])
# -*- coding: utf-8 -*- """ Created on Wed Oct 31 20:16:35 2018 @author: 46362 """ from MACDstrategy import MACD import backtest path = r"C:\Users\46362\Desktop\OnePy_Old-master" symbol_list = ['000001', '000002'] engine = backtest.BackTest(path, symbol_list, None) engine.initStrategy(MACD) engine.run()