class MACDBackTest(QDialog): def __init__(self): super(MACDBackTest, self).__init__() self.codepool = [ "000001", "000002", "000004", ] self.initUI() def initUI(self): self.resize(900, 600) self.setWindowTitle("QUANT XH 金融终端——MACD金叉死叉回测") self.setWindowIcon(QIcon("static/icon.png")) self.poollabel = QLabel() self.poollabel.setText("股票池") self.poollabel.setFont(QFont("仿宋", 15)) self.pooledit = QTextEdit() self.pooledit.setFont(QFont("仿宋", 12)) self.pooledit.setFixedSize(120, 30) self.pooladdbtn = QPushButton() self.pooladdbtn.setText("添加股票") self.pooladdbtn.setFont(QFont("仿宋", 12)) self.pooladdbtn.setFixedSize(100, 30) self.pooladdbtn.clicked.connect(self.addCode) self.poolclbtn = QPushButton() self.poolclbtn.setText("清空") self.poolclbtn.setFont(QFont("仿宋", 12)) self.poolclbtn.setFixedSize(80, 30) self.poolclbtn.clicked.connect(self.clearPool) self.pooltb = QTextBrowser() self.pooltb.setFixedSize(300, 300) self.pooltb.setFont(QFont("仿宋", 12)) self.shortlabel = QLabel() self.shortlabel.setText("SHORT") self.shortlabel.setFont(QFont("仿宋", 15)) self.shortedit = QTextEdit() self.shortedit.setText("12") self.shortedit.setFont(QFont("仿宋", 12)) self.shortedit.setFixedSize(50, 30) self.longlabel = QLabel() self.longlabel.setText("LONG") self.longlabel.setFont(QFont("仿宋", 15)) self.longedit = QTextEdit() self.longedit.setText("26") self.longedit.setFont(QFont("仿宋", 12)) self.longedit.setFixedSize(50, 30) self.mlabel = QLabel() self.mlabel.setText("M") self.mlabel.setFont(QFont("仿宋", 15)) self.medit = QTextEdit() self.medit.setText("9") self.medit.setFont(QFont("仿宋", 12)) self.medit.setFixedSize(50, 30) self.texttb = QTextBrowser() self.texttb.setFont(QFont("仿宋", 10)) self.texttb.setFixedSize(300, 150) self.texttb.setText( "当DIFF和DEA均为正值,DIFF线向上突破DEA线,在0轴上方形成金叉,表示市场上买盘非常踊跃,上涨行情仍将继续。\n\n" "当DIFF和DEA均为负值,DIFF线向上突破DEA线,在0轴下方形成金叉表示市场上的做空气氛有所缓解,股价可能止跌反弹。") self.ckfromtimelabel = QLabel() self.ckfromtimelabel.setText("窗口开始时间") self.ckfromtimelabel.setFont(QFont("仿宋", 15)) self.ckfromtimeedit = QDateEdit() datefrom = datetime.strptime("2018-09-01", "%Y-%m-%d").date() self.ckfromtimeedit.setDate(datefrom) self.ckfromtimeedit.setFont(QFont("仿宋", 12)) self.ckfromtimeedit.setFixedSize(200, 30) self.cktotimelabel = QLabel() self.cktotimelabel.setText("窗口结束时间") self.cktotimelabel.setFont(QFont("仿宋", 15)) self.cktotimeedit = QDateEdit() dateto = datetime.strptime("2019-05-20", "%Y-%m-%d").date() self.cktotimeedit.setDate(dateto) self.cktotimeedit.setFont(QFont("仿宋", 12)) self.cktotimeedit.setFixedSize(200, 30) self.ycfromtimelabel = QLabel() self.ycfromtimelabel.setText("预测开始时间") self.ycfromtimelabel.setFont(QFont("仿宋", 15)) self.ycfromtimeedit = QDateEdit() datefrom = datetime.strptime("2019-01-01", "%Y-%m-%d").date() self.ycfromtimeedit.setDate(datefrom) self.ycfromtimeedit.setFont(QFont("仿宋", 12)) self.ycfromtimeedit.setFixedSize(200, 30) self.yctotimelabel = QLabel() self.yctotimelabel.setText("预测结束时间") self.yctotimelabel.setFont(QFont("仿宋", 15)) self.yctotimeedit = QDateEdit() dateto = datetime.strptime("2019-05-01", "%Y-%m-%d").date() self.yctotimeedit.setDate(dateto) self.yctotimeedit.setFont(QFont("仿宋", 12)) self.yctotimeedit.setFixedSize(200, 30) self.cashlabel = QLabel() self.cashlabel.setText("初始资金") self.cashlabel.setFont(QFont("仿宋", 15)) self.cashedit = QTextEdit() self.cashedit.setText("1000000") self.cashedit.setFont(QFont("仿宋", 12)) self.cashedit.setFixedSize(200, 30) self.amountlabel = QLabel() self.amountlabel.setText("单笔交易股数") self.amountlabel.setFont(QFont("仿宋", 15)) self.amountedit = QTextEdit() self.amountedit.setText("3000") self.amountedit.setFont(QFont("仿宋", 12)) self.amountedit.setFixedSize(200, 30) self.selectbtn = QPushButton() self.selectbtn.setText("开始回测") self.selectbtn.setFixedSize(120, 40) self.selectbtn.setFont(QFont("仿宋", 12)) self.selectbtn.clicked.connect(self.backTest) # self.resultbtn = QPushButton() # self.resultbtn.setText("回测结果") # self.resultbtn.setFixedSize(120,40) # self.resultbtn.setFont(QFont("仿宋", 12)) # self.resultbtn.setEnabled(False) self.h11box = QHBoxLayout() self.h11box.addWidget(self.pooledit) self.h11box.addWidget(self.pooladdbtn) self.h11box.addWidget(self.poolclbtn) self.h12box = QHBoxLayout() self.h12box.addWidget(self.pooltb) self.h13box = QHBoxLayout() self.h13box.addStretch(1) self.h13box.addWidget(self.shortlabel) self.h13box.addWidget(self.shortedit) self.h13box.addStretch(1) self.h13box.addWidget(self.longlabel) self.h13box.addWidget(self.longedit) self.h13box.addStretch(1) self.h13box.addWidget(self.mlabel) self.h13box.addWidget(self.medit) self.h13box.addStretch(1) self.h14box = QHBoxLayout() self.h14box.addStretch(1) self.h14box.addWidget(self.texttb) self.h14box.addStretch(1) self.v1box = QVBoxLayout() self.v1box.addStretch(1) self.v1box.addWidget(self.poollabel) self.v1box.addLayout(self.h11box) self.v1box.addLayout(self.h12box) self.v1box.addStretch(1) self.v1box.addLayout(self.h13box) self.v1box.addStretch(1) self.v1box.addLayout(self.h14box) self.v1box.addStretch(1) self.h21box = QHBoxLayout() self.h21box.addWidget(self.selectbtn) # self.h21box.addWidget(self.resultbtn) self.v2box = QVBoxLayout() self.v2box.addStretch(1) self.v2box.addWidget(self.ckfromtimelabel) self.v2box.addWidget(self.ckfromtimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.cktotimelabel) self.v2box.addWidget(self.cktotimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.ycfromtimelabel) self.v2box.addWidget(self.ycfromtimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.yctotimelabel) self.v2box.addWidget(self.yctotimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.cashlabel) self.v2box.addWidget(self.cashedit) self.v2box.addStretch(1) self.v2box.addWidget(self.amountlabel) self.v2box.addWidget(self.amountedit) self.v2box.addStretch(1) self.v2box.addLayout(self.h21box) self.v2box.addStretch(1) self.hbox = QHBoxLayout() self.hbox.addStretch(1) self.hbox.addLayout(self.v1box) self.hbox.addStretch(1) self.hbox.addLayout(self.v2box) self.hbox.addStretch(1) self.setLayout(self.hbox) self.pooltb.setPlainText(' '.join(self.codepool)) def addCode(self): f = FETCH() code = self.pooledit.toPlainText() if code in self.codepool: print( QMessageBox.information(self, "提示", "该股票已经存在于股票池中!", QMessageBox.Yes, QMessageBox.Yes)) elif code not in list(f.fetch_stock_list()['code']): print( QMessageBox.information(self, "提示", "该股票代码不存在!", QMessageBox.Yes, QMessageBox.Yes)) else: self.codepool.append(code) self.pooledit.clear() self.pooltb.setPlainText(' '.join(self.codepool)) def clearPool(self): self.codepool = [] self.pooltb.setPlainText(' '.join(self.codepool)) def backTest(self): def change_name(s): l = s.split('/') if len(l[1]) == 1: l[1] = "0" + l[1] if len(l[2]) == 1: l[2] = "0" + l[2] return ("-".join(l)) r = MACDTest(cash=int(self.cashedit.toPlainText())) r.MACD_backtest(code=self.codepool, ckstart=change_name(self.ckfromtimeedit.text()), ckend=change_name(self.cktotimeedit.text()), ycstart=change_name(self.ycfromtimeedit.text()), ycend=change_name(self.yctotimeedit.text()), amount=int(self.amountedit.toPlainText()), SHORT=int(self.shortedit.toPlainText()), LONG=int(self.longedit.toPlainText()), M=int(self.medit.toPlainText())) r.save_to_mongo() # self.resultbtn.clicked.connect(self.btResult(r.ACstr)) # self.resultbtn.setEnabled(True) self.btResult(r.ACstr) def btResult(self, AC_id): dialog = BackTestResult(ACid=AC_id) dialog.setWindowFlags(Qt.WindowStaysOnTopHint) dialog.show() dialog.exec_()
class RandomBackTest(QDialog): def __init__(self): super(RandomBackTest,self).__init__() self.codepool = ["000001","000002","000004",] self.initUI() def initUI(self): self.resize(900,600) self.setWindowTitle("QUANT XH 金融终端——随机买卖回测") self.setWindowIcon(QIcon("static/icon.png")) self.poollabel = QLabel() self.poollabel.setText("股票池") self.poollabel.setFont(QFont("仿宋", 15)) self.pooledit = QTextEdit() self.pooledit.setFont(QFont("仿宋", 12)) self.pooledit.setFixedSize(120, 30) self.pooladdbtn = QPushButton() self.pooladdbtn.setText("添加股票") self.pooladdbtn.setFont(QFont("仿宋", 12)) self.pooladdbtn.setFixedSize(100, 30) self.pooladdbtn.clicked.connect(self.addCode) self.poolclbtn = QPushButton() self.poolclbtn.setText("清空") self.poolclbtn.setFont(QFont("仿宋", 12)) self.poolclbtn.setFixedSize(80, 30) self.poolclbtn.clicked.connect(self.clearPool) self.pooltb = QTextBrowser() self.pooltb.setFixedSize(300, 300) self.pooltb.setFont(QFont("仿宋", 12)) self.fromtimelabel = QLabel() self.fromtimelabel.setText("开始时间") self.fromtimelabel.setFont(QFont("仿宋", 15)) self.fromtimeedit = QDateEdit() datefrom = datetime.strptime("2019-01-01", "%Y-%m-%d").date() self.fromtimeedit.setDate(datefrom) self.fromtimeedit.setFont(QFont("仿宋", 12)) self.fromtimeedit.setFixedSize(200,30) self.totimelabel = QLabel() self.totimelabel.setText("结束时间") self.totimelabel.setFont(QFont("仿宋", 15)) self.totimeedit = QDateEdit() dateto = datetime.strptime("2019-12-31", "%Y-%m-%d").date() self.totimeedit.setDate(dateto) self.totimeedit.setFont(QFont("仿宋", 12)) self.totimeedit.setFixedSize(200,30) self.cashlabel = QLabel() self.cashlabel.setText("初始资金") self.cashlabel.setFont(QFont("仿宋", 15)) self.cashedit = QTextEdit() self.cashedit.setText("1000000") self.cashedit.setFont(QFont("仿宋", 12)) self.cashedit.setFixedSize(200,30) self.amountlabel = QLabel() self.amountlabel.setText("单笔交易股数") self.amountlabel.setFont(QFont("仿宋", 15)) self.amountedit = QTextEdit() self.amountedit.setText("1000") self.amountedit.setFont(QFont("仿宋", 12)) self.amountedit.setFixedSize(200,30) self.selectbtn = QPushButton() self.selectbtn.setText("开始回测") self.selectbtn.setFixedSize(120,40) self.selectbtn.setFont(QFont("仿宋", 12)) self.selectbtn.clicked.connect(self.backTest) # self.resultbtn = QPushButton() # self.resultbtn.setText("回测结果") # self.resultbtn.setFixedSize(120,40) # self.resultbtn.setFont(QFont("仿宋", 12)) # self.resultbtn.setEnabled(False) self.h11box = QHBoxLayout() self.h11box.addWidget(self.pooledit) self.h11box.addWidget(self.pooladdbtn) self.h11box.addWidget(self.poolclbtn) self.h12box = QHBoxLayout() self.h12box.addWidget(self.pooltb) self.v1box = QVBoxLayout() self.v1box.addStretch(1) self.v1box.addWidget(self.poollabel) self.v1box.addLayout(self.h11box) self.v1box.addLayout(self.h12box) self.v1box.addStretch(1) self.h21box = QHBoxLayout() self.h21box.addWidget(self.selectbtn) # self.h21box.addWidget(self.resultbtn) self.v2box = QVBoxLayout() self.v2box.addStretch(1) self.v2box.addWidget(self.fromtimelabel) self.v2box.addWidget(self.fromtimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.totimelabel) self.v2box.addWidget(self.totimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.cashlabel) self.v2box.addWidget(self.cashedit) self.v2box.addStretch(1) self.v2box.addWidget(self.amountlabel) self.v2box.addWidget(self.amountedit) self.v2box.addStretch(1) self.v2box.addLayout(self.h21box) self.v2box.addStretch(1) self.hbox = QHBoxLayout() self.hbox.addLayout(self.v1box) self.hbox.addLayout(self.v2box) self.setLayout(self.hbox) self.pooltb.setPlainText(' '.join(self.codepool)) def addCode(self): f = FETCH() code = self.pooledit.toPlainText() if code in self.codepool: print(QMessageBox.information(self, "提示", "该股票已经存在于股票池中!", QMessageBox.Yes, QMessageBox.Yes)) elif code not in list(f.fetch_stock_list()['code']): print(QMessageBox.information(self, "提示", "该股票代码不存在!", QMessageBox.Yes, QMessageBox.Yes)) else: self.codepool.append(code) self.pooledit.clear() self.pooltb.setPlainText(' '.join(self.codepool)) def clearPool(self): self.codepool = [] self.pooltb.setPlainText(' '.join(self.codepool)) def backTest(self): def change_name(s): l = s.split('/') if len(l[1]) == 1: l[1] = "0" + l[1] if len(l[2]) == 1: l[2] = "0" + l[2] return ("-".join(l)) r = RBTest(cash=int(self.cashedit.toPlainText())) r.simple_backtest(self.codepool,change_name(self.fromtimeedit.text()), change_name(self.totimeedit.text()),int(self.amountedit.toPlainText())) r.save_to_mongo() # self.resultbtn.clicked.connect(self.btResult(r.ACstr)) # self.resultbtn.setEnabled(True) self.btResult(r.ACstr) def btResult(self,AC_id): dialog = BackTestResult(ACid=AC_id) dialog.setWindowFlags(Qt.WindowStaysOnTopHint) dialog.show() dialog.exec_()
class RSINBackTest(QDialog): def __init__(self): super(RSINBackTest,self).__init__() self.codepool = ["000001","000002","000004",] self.initUI() def initUI(self): self.resize(900,600) self.setWindowTitle("QUANT XH 金融终端——RSI N日回测") self.setWindowIcon(QIcon("static/icon.png")) self.poollabel = QLabel() self.poollabel.setText("股票池") self.poollabel.setFont(QFont("仿宋", 15)) self.pooledit = QTextEdit() self.pooledit.setFont(QFont("仿宋", 12)) self.pooledit.setFixedSize(120, 30) self.pooladdbtn = QPushButton() self.pooladdbtn.setText("添加股票") self.pooladdbtn.setFont(QFont("仿宋", 12)) self.pooladdbtn.setFixedSize(100, 30) self.pooladdbtn.clicked.connect(self.addCode) self.poolclbtn = QPushButton() self.poolclbtn.setText("清空") self.poolclbtn.setFont(QFont("仿宋", 12)) self.poolclbtn.setFixedSize(80, 30) self.poolclbtn.clicked.connect(self.clearPool) self.pooltb = QTextBrowser() self.pooltb.setFixedSize(300, 300) self.pooltb.setFont(QFont("仿宋", 12)) self.nlabel = QLabel() self.nlabel.setText("N:") self.nlabel.setFont(QFont("仿宋", 15)) self.nedit = QTextEdit() self.nedit.setText("6") self.nedit.setFont(QFont("仿宋", 12)) self.nedit.setFixedSize(50, 30) self.texttb = QTextBrowser() self.texttb.setFont(QFont("仿宋", 10)) self.texttb.setFixedSize(300, 150) self.texttb.setText("RSI指标分为三个数值:20、50、80,其中,当指标运行到20下方时,预示价格进入超卖区域,短期警示风险来临,不可追空,价格可能出现反弹或上涨;当指标运行到80上方时,预示价格进入超买区域,短线百警示风险来临,不可追多,价格可能出现调整或下跌") self.ckfromtimelabel = QLabel() self.ckfromtimelabel.setText("窗口开始时间") self.ckfromtimelabel.setFont(QFont("仿宋", 15)) self.ckfromtimeedit = QDateEdit() datefrom = datetime.strptime("2018-09-01", "%Y-%m-%d").date() self.ckfromtimeedit.setDate(datefrom) self.ckfromtimeedit.setFont(QFont("仿宋", 12)) self.ckfromtimeedit.setFixedSize(200,30) self.cktotimelabel = QLabel() self.cktotimelabel.setText("窗口结束时间") self.cktotimelabel.setFont(QFont("仿宋", 15)) self.cktotimeedit = QDateEdit() dateto = datetime.strptime("2019-05-20", "%Y-%m-%d").date() self.cktotimeedit.setDate(dateto) self.cktotimeedit.setFont(QFont("仿宋", 12)) self.cktotimeedit.setFixedSize(200,30) self.ycfromtimelabel = QLabel() self.ycfromtimelabel.setText("预测开始时间") self.ycfromtimelabel.setFont(QFont("仿宋", 15)) self.ycfromtimeedit = QDateEdit() datefrom = datetime.strptime("2019-01-01", "%Y-%m-%d").date() self.ycfromtimeedit.setDate(datefrom) self.ycfromtimeedit.setFont(QFont("仿宋", 12)) self.ycfromtimeedit.setFixedSize(200, 30) self.yctotimelabel = QLabel() self.yctotimelabel.setText("预测结束时间") self.yctotimelabel.setFont(QFont("仿宋", 15)) self.yctotimeedit = QDateEdit() dateto = datetime.strptime("2019-05-01", "%Y-%m-%d").date() self.yctotimeedit.setDate(dateto) self.yctotimeedit.setFont(QFont("仿宋", 12)) self.yctotimeedit.setFixedSize(200, 30) self.cashlabel = QLabel() self.cashlabel.setText("初始资金") self.cashlabel.setFont(QFont("仿宋", 15)) self.cashedit = QTextEdit() self.cashedit.setText("1000000") self.cashedit.setFont(QFont("仿宋", 12)) self.cashedit.setFixedSize(200,30) self.amountlabel = QLabel() self.amountlabel.setText("单笔交易股数") self.amountlabel.setFont(QFont("仿宋", 15)) self.amountedit = QTextEdit() self.amountedit.setText("3000") self.amountedit.setFont(QFont("仿宋", 12)) self.amountedit.setFixedSize(200,30) self.selectbtn = QPushButton() self.selectbtn.setText("开始回测") self.selectbtn.setFixedSize(120,40) self.selectbtn.setFont(QFont("仿宋", 12)) self.selectbtn.clicked.connect(self.backTest) # self.resultbtn = QPushButton() # self.resultbtn.setText("回测结果") # self.resultbtn.setFixedSize(120,40) # self.resultbtn.setFont(QFont("仿宋", 12)) # self.resultbtn.setEnabled(False) self.h11box = QHBoxLayout() self.h11box.addWidget(self.pooledit) self.h11box.addWidget(self.pooladdbtn) self.h11box.addWidget(self.poolclbtn) self.h12box = QHBoxLayout() self.h12box.addWidget(self.pooltb) self.h14box = QHBoxLayout() self.h14box.addStretch(1) self.h14box.addWidget(self.texttb) self.h14box.addStretch(1) self.v1box = QVBoxLayout() self.v1box.addStretch(1) self.v1box.addWidget(self.poollabel) self.v1box.addLayout(self.h11box) self.v1box.addLayout(self.h12box) self.v1box.addStretch(1) self.v1box.addLayout(self.h14box) self.v1box.addStretch(1) self.h21box = QHBoxLayout() self.h21box.addWidget(self.selectbtn) # self.h21box.addWidget(self.resultbtn) self.h22box = QHBoxLayout() self.h22box.addStretch(1) self.h22box.addWidget(self.nlabel) self.h22box.addWidget(self.nedit) self.h22box.addStretch(1) self.v2box = QVBoxLayout() self.v2box.addStretch(1) self.v2box.addLayout(self.h22box) self.v2box.addStretch(1) self.v2box.addWidget(self.ckfromtimelabel) self.v2box.addWidget(self.ckfromtimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.cktotimelabel) self.v2box.addWidget(self.cktotimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.ycfromtimelabel) self.v2box.addWidget(self.ycfromtimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.yctotimelabel) self.v2box.addWidget(self.yctotimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.cashlabel) self.v2box.addWidget(self.cashedit) self.v2box.addStretch(1) self.v2box.addWidget(self.amountlabel) self.v2box.addWidget(self.amountedit) self.v2box.addStretch(1) self.v2box.addLayout(self.h21box) self.v2box.addStretch(1) self.hbox = QHBoxLayout() self.hbox.addStretch(1) self.hbox.addLayout(self.v1box) self.hbox.addStretch(1) self.hbox.addLayout(self.v2box) self.hbox.addStretch(1) self.setLayout(self.hbox) self.pooltb.setPlainText(' '.join(self.codepool)) def addCode(self): f = FETCH() code = self.pooledit.toPlainText() if code in self.codepool: print(QMessageBox.information(self, "提示", "该股票已经存在于股票池中!", QMessageBox.Yes, QMessageBox.Yes)) elif code not in list(f.fetch_stock_list()['code']): print(QMessageBox.information(self, "提示", "该股票代码不存在!", QMessageBox.Yes, QMessageBox.Yes)) else: self.codepool.append(code) self.pooledit.clear() self.pooltb.setPlainText(' '.join(self.codepool)) def clearPool(self): self.codepool = [] self.pooltb.setPlainText(' '.join(self.codepool)) def backTest(self): def change_name(s): l = s.split('/') if len(l[1]) == 1: l[1] = "0" + l[1] if len(l[2]) == 1: l[2] = "0" + l[2] return ("-".join(l)) r = RSINtest(cash=int(self.cashedit.toPlainText())) r.RSIN_backtest(code=self.codepool,ckstart=change_name(self.ckfromtimeedit.text()), ckend=change_name(self.cktotimeedit.text()),ycstart=change_name(self.ycfromtimeedit.text()), ycend=change_name(self.yctotimeedit.text()), amount=int(self.amountedit.toPlainText()), N=int(self.nedit.toPlainText())) r.save_to_mongo() # self.resultbtn.clicked.connect(self.btResult(r.ACstr)) # self.resultbtn.setEnabled(True) self.btResult(r.ACstr) def btResult(self,AC_id): dialog = BackTestResult(ACid=AC_id) dialog.setWindowFlags(Qt.WindowStaysOnTopHint) dialog.show() dialog.exec_()
class KlineSelect(QDialog): def __init__(self, code="000001", fromtime="2020-01-01", totime="2020-03-01"): super(KlineSelect,self).__init__() self.code = code self.fromtime = fromtime self.totime = totime self.initUI() def initUI(self): self.resize(800,600) self.setWindowTitle("QUANT XH 金融终端") self.setWindowIcon(QIcon("static/icon.png")) self.h1box = QHBoxLayout() self.codelabel = QLabel() self.codelabel.setText("股票代码") self.codelabel.setFont(QFont("仿宋", 12)) self.codeedit = QTextEdit() self.codeedit.setFont(QFont("仿宋", 12)) self.codeedit.setFixedSize(120,25) self.codeedit.setText(self.code) self.fromtimelabel = QLabel() self.fromtimelabel.setText("起始时间") self.fromtimelabel.setFont(QFont("仿宋", 12)) self.fromtimeedit = QDateEdit() self.fromtimeedit.setFixedSize(150, 25) self.fromtimeedit.setFont(QFont("仿宋", 12)) datefrom = datetime.strptime(self.fromtime,"%Y-%m-%d").date() self.fromtimeedit.setDate(datefrom) self.totimelabel = QLabel() self.totimelabel.setText("终止时间") self.totimelabel.setFont(QFont("仿宋", 12)) self.totimeedit = QDateEdit() self.totimeedit.setFixedSize(150, 25) self.totimeedit.setFont(QFont("仿宋", 12)) dateto = datetime.strptime(self.totime, "%Y-%m-%d").date() self.totimeedit.setDate(dateto) self.selectbutton = QPushButton() self.selectbutton.setText("选择") self.selectbutton.setFont(QFont("仿宋", 12)) self.selectbutton.clicked.connect(self.updateKlines) self.h1box.addStretch(1) self.h1box.addWidget(self.codelabel) self.h1box.addWidget(self.codeedit) self.h1box.addStretch(1) self.h1box.addWidget(self.fromtimelabel) self.h1box.addWidget(self.fromtimeedit) self.h1box.addStretch(1) self.h1box.addWidget(self.totimelabel) self.h1box.addWidget(self.totimeedit) self.h1box.addStretch(1) self.h1box.addWidget(self.selectbutton) self.h1box.addStretch(1) self.klineswindow = KlinesDialog(type="A",code=self.code,fromtime=self.fromtime,totime=self.totime) self.v1box = QVBoxLayout() self.v1box.addWidget(self.klineswindow) self.vbox = QVBoxLayout() self.vbox.addStretch(1) self.vbox.addLayout(self.h1box) self.vbox.addStretch(1) self.vbox.addLayout(self.v1box) self.vbox.addStretch(1) self.setLayout(self.vbox) def updateKlines(self): self.code = self.codeedit.toPlainText() def change_name(s): l = s.split('/') if len(l[1]) == 1: l[1] = "0" + l[1] if len(l[2]) == 1: l[2] = "0" + l[2] return ("-".join(l)) self.fromtime = change_name(self.fromtimeedit.text()) self.totime = change_name(self.totimeedit.text()) f = FETCH() stock_list = list(f.fetch_stock_list()['code']) if self.code not in stock_list: print(QMessageBox.information(self, "提示", "您输入了不正确的或是已下架的代码!", QMessageBox.Yes, QMessageBox.Yes)) else: self.klineswindow.close() self.klineswindow = KlinesDialog(type="A",code=self.code,fromtime=self.fromtime,totime=self.totime) self.v1box.addWidget(self.klineswindow)
class CCINBackTest(QDialog): def __init__(self): super(CCINBackTest, self).__init__() self.codepool = [ "000001", "000002", "000004", ] self.initUI() def initUI(self): self.resize(900, 600) self.setWindowTitle("QUANT XH 金融终端——CCI N日回测") self.setWindowIcon(QIcon("static/icon.png")) self.poollabel = QLabel() self.poollabel.setText("股票池") self.poollabel.setFont(QFont("仿宋", 15)) self.pooledit = QTextEdit() self.pooledit.setFont(QFont("仿宋", 12)) self.pooledit.setFixedSize(120, 30) self.pooladdbtn = QPushButton() self.pooladdbtn.setText("添加股票") self.pooladdbtn.setFont(QFont("仿宋", 12)) self.pooladdbtn.setFixedSize(100, 30) self.pooladdbtn.clicked.connect(self.addCode) self.poolclbtn = QPushButton() self.poolclbtn.setText("清空") self.poolclbtn.setFont(QFont("仿宋", 12)) self.poolclbtn.setFixedSize(80, 30) self.poolclbtn.clicked.connect(self.clearPool) self.pooltb = QTextBrowser() self.pooltb.setFixedSize(300, 300) self.pooltb.setFont(QFont("仿宋", 12)) self.nlabel = QLabel() self.nlabel.setText("N:") self.nlabel.setFont(QFont("仿宋", 15)) self.nedit = QTextEdit() self.nedit.setText("14") self.nedit.setFont(QFont("仿宋", 12)) self.nedit.setFixedSize(50, 30) self.texttb = QTextBrowser() self.texttb.setFont(QFont("仿宋", 10)) self.texttb.setFixedSize(300, 150) self.texttb.setText( "1.当CCI指标曲线从上向下突破+100线而重新进入常态区间时,表明市场价格的上涨阶段可能结束,将进入一个比较长时间的震荡整理阶段,应及时平多做空。\n\n" "2.当CCI指标曲线从上向下突破-100线而进入另一个非常态区间(超卖区)时,表明市场价格的弱势状态已经形成,将进入一个比较长的寻底过程,可以持有空单等待更高利润。" ) self.ckfromtimelabel = QLabel() self.ckfromtimelabel.setText("窗口开始时间") self.ckfromtimelabel.setFont(QFont("仿宋", 15)) self.ckfromtimeedit = QDateEdit() datefrom = datetime.strptime("2018-09-01", "%Y-%m-%d").date() self.ckfromtimeedit.setDate(datefrom) self.ckfromtimeedit.setFont(QFont("仿宋", 12)) self.ckfromtimeedit.setFixedSize(200, 30) self.cktotimelabel = QLabel() self.cktotimelabel.setText("窗口结束时间") self.cktotimelabel.setFont(QFont("仿宋", 15)) self.cktotimeedit = QDateEdit() dateto = datetime.strptime("2019-05-20", "%Y-%m-%d").date() self.cktotimeedit.setDate(dateto) self.cktotimeedit.setFont(QFont("仿宋", 12)) self.cktotimeedit.setFixedSize(200, 30) self.ycfromtimelabel = QLabel() self.ycfromtimelabel.setText("预测开始时间") self.ycfromtimelabel.setFont(QFont("仿宋", 15)) self.ycfromtimeedit = QDateEdit() datefrom = datetime.strptime("2019-01-01", "%Y-%m-%d").date() self.ycfromtimeedit.setDate(datefrom) self.ycfromtimeedit.setFont(QFont("仿宋", 12)) self.ycfromtimeedit.setFixedSize(200, 30) self.yctotimelabel = QLabel() self.yctotimelabel.setText("预测结束时间") self.yctotimelabel.setFont(QFont("仿宋", 15)) self.yctotimeedit = QDateEdit() dateto = datetime.strptime("2019-05-01", "%Y-%m-%d").date() self.yctotimeedit.setDate(dateto) self.yctotimeedit.setFont(QFont("仿宋", 12)) self.yctotimeedit.setFixedSize(200, 30) self.cashlabel = QLabel() self.cashlabel.setText("初始资金") self.cashlabel.setFont(QFont("仿宋", 15)) self.cashedit = QTextEdit() self.cashedit.setText("1000000") self.cashedit.setFont(QFont("仿宋", 12)) self.cashedit.setFixedSize(200, 30) self.amountlabel = QLabel() self.amountlabel.setText("单笔交易股数") self.amountlabel.setFont(QFont("仿宋", 15)) self.amountedit = QTextEdit() self.amountedit.setText("3000") self.amountedit.setFont(QFont("仿宋", 12)) self.amountedit.setFixedSize(200, 30) self.selectbtn = QPushButton() self.selectbtn.setText("开始回测") self.selectbtn.setFixedSize(120, 40) self.selectbtn.setFont(QFont("仿宋", 12)) self.selectbtn.clicked.connect(self.backTest) # self.resultbtn = QPushButton() # self.resultbtn.setText("回测结果") # self.resultbtn.setFixedSize(120,40) # self.resultbtn.setFont(QFont("仿宋", 12)) # self.resultbtn.setEnabled(False) self.h11box = QHBoxLayout() self.h11box.addWidget(self.pooledit) self.h11box.addWidget(self.pooladdbtn) self.h11box.addWidget(self.poolclbtn) self.h12box = QHBoxLayout() self.h12box.addWidget(self.pooltb) self.h14box = QHBoxLayout() self.h14box.addStretch(1) self.h14box.addWidget(self.texttb) self.h14box.addStretch(1) self.v1box = QVBoxLayout() self.v1box.addStretch(1) self.v1box.addWidget(self.poollabel) self.v1box.addLayout(self.h11box) self.v1box.addLayout(self.h12box) self.v1box.addStretch(1) self.v1box.addLayout(self.h14box) self.v1box.addStretch(1) self.h21box = QHBoxLayout() self.h21box.addWidget(self.selectbtn) # self.h21box.addWidget(self.resultbtn) self.h22box = QHBoxLayout() self.h22box.addStretch(1) self.h22box.addWidget(self.nlabel) self.h22box.addWidget(self.nedit) self.h22box.addStretch(1) self.v2box = QVBoxLayout() self.v2box.addStretch(1) self.v2box.addLayout(self.h22box) self.v2box.addStretch(1) self.v2box.addWidget(self.ckfromtimelabel) self.v2box.addWidget(self.ckfromtimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.cktotimelabel) self.v2box.addWidget(self.cktotimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.ycfromtimelabel) self.v2box.addWidget(self.ycfromtimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.yctotimelabel) self.v2box.addWidget(self.yctotimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.cashlabel) self.v2box.addWidget(self.cashedit) self.v2box.addStretch(1) self.v2box.addWidget(self.amountlabel) self.v2box.addWidget(self.amountedit) self.v2box.addStretch(1) self.v2box.addLayout(self.h21box) self.v2box.addStretch(1) self.hbox = QHBoxLayout() self.hbox.addStretch(1) self.hbox.addLayout(self.v1box) self.hbox.addStretch(1) self.hbox.addLayout(self.v2box) self.hbox.addStretch(1) self.setLayout(self.hbox) self.pooltb.setPlainText(' '.join(self.codepool)) def addCode(self): f = FETCH() code = self.pooledit.toPlainText() if code in self.codepool: print( QMessageBox.information(self, "提示", "该股票已经存在于股票池中!", QMessageBox.Yes, QMessageBox.Yes)) elif code not in list(f.fetch_stock_list()['code']): print( QMessageBox.information(self, "提示", "该股票代码不存在!", QMessageBox.Yes, QMessageBox.Yes)) else: self.codepool.append(code) self.pooledit.clear() self.pooltb.setPlainText(' '.join(self.codepool)) def clearPool(self): self.codepool = [] self.pooltb.setPlainText(' '.join(self.codepool)) def backTest(self): def change_name(s): l = s.split('/') if len(l[1]) == 1: l[1] = "0" + l[1] if len(l[2]) == 1: l[2] = "0" + l[2] return ("-".join(l)) r = CCINtest(cash=int(self.cashedit.toPlainText())) r.CCIN_backtest(code=self.codepool, ckstart=change_name(self.ckfromtimeedit.text()), ckend=change_name(self.cktotimeedit.text()), ycstart=change_name(self.ycfromtimeedit.text()), ycend=change_name(self.yctotimeedit.text()), amount=int(self.amountedit.toPlainText()), N=int(self.nedit.toPlainText())) r.save_to_mongo() # self.resultbtn.clicked.connect(self.btResult(r.ACstr)) # self.resultbtn.setEnabled(True) self.btResult(r.ACstr) def btResult(self, AC_id): dialog = BackTestResult(ACid=AC_id) dialog.setWindowFlags(Qt.WindowStaysOnTopHint) dialog.show() dialog.exec_()
class LSTMBacktest(QDialog): def __init__(self): super(LSTMBacktest, self).__init__() self.codepool = [ "000001", "000004", ] self.initUI() def initUI(self): self.resize(900, 600) self.setWindowTitle("QUANT XH 金融终端——LSTM预测股价回测") self.setWindowIcon(QIcon("static/icon.png")) self.tcodelabel = QLabel() self.tcodelabel.setText("训练股票") self.tcodelabel.setFont(QFont("仿宋", 15)) self.tcodeedit = QTextEdit() self.tcodeedit.setFont(QFont("仿宋", 12)) self.tcodeedit.setFixedSize(150, 30) self.tcodeedit.setText("000002") self.tfromtimelabel = QLabel() self.tfromtimelabel.setText("开始时间") self.tfromtimelabel.setFont(QFont("仿宋", 15)) self.tfromtimeedit = QDateEdit() datefrom = datetime.strptime("2001-01-01", "%Y-%m-%d").date() self.tfromtimeedit.setDate(datefrom) self.tfromtimeedit.setFont(QFont("仿宋", 12)) self.tfromtimeedit.setFixedSize(200, 30) self.ttotimelabel = QLabel() self.ttotimelabel.setText("结束时间") self.ttotimelabel.setFont(QFont("仿宋", 15)) self.ttotimeedit = QDateEdit() dateto = datetime.strptime("2020-04-30", "%Y-%m-%d").date() self.ttotimeedit.setDate(dateto) self.ttotimeedit.setFont(QFont("仿宋", 12)) self.ttotimeedit.setFixedSize(200, 30) self.trainbtn = QPushButton() self.trainbtn.setText("开始训练") self.trainbtn.setFixedSize(120, 40) self.trainbtn.setFont(QFont("仿宋", 12)) self.trainbtn.clicked.connect(self.con_model) self.acclabel = QLabel() self.acclabel.setFont(QFont("仿宋", 12)) self.acclabel.setText("准确率:") self.accnlabel = QLabel() self.accnlabel.setFont(QFont("仿宋", 12)) self.accnlabel.setText("") self.accnlabel.setFixedWidth(100) self.poollabel = QLabel() self.poollabel.setText("股票池") self.poollabel.setFont(QFont("仿宋", 15)) self.pooledit = QTextEdit() self.pooledit.setFont(QFont("仿宋", 12)) self.pooledit.setFixedSize(120, 30) self.pooladdbtn = QPushButton() self.pooladdbtn.setText("添加股票") self.pooladdbtn.setFont(QFont("仿宋", 12)) self.pooladdbtn.setFixedSize(100, 30) self.pooladdbtn.clicked.connect(self.addCode) self.poolclbtn = QPushButton() self.poolclbtn.setText("清空") self.poolclbtn.setFont(QFont("仿宋", 12)) self.poolclbtn.setFixedSize(80, 30) self.poolclbtn.clicked.connect(self.clearPool) self.pooltb = QTextBrowser() self.pooltb.setFixedSize(300, 200) self.pooltb.setFont(QFont("仿宋", 12)) self.buylabel = QLabel() self.buylabel.setText("买入涨幅") self.buylabel.setFont(QFont("仿宋", 15)) self.buyedit = QTextEdit() self.buyedit.setFont(QFont("仿宋", 12)) self.buyedit.setFixedSize(120, 30) self.buyedit.setText("0.02") self.selllabel = QLabel() self.selllabel.setText("卖出跌幅") self.selllabel.setFont(QFont("仿宋", 15)) self.selledit = QTextEdit() self.selledit.setFont(QFont("仿宋", 12)) self.selledit.setFixedSize(120, 30) self.selledit.setText("0.02") self.ckfromtimelabel = QLabel() self.ckfromtimelabel.setText("窗口开始时间") self.ckfromtimelabel.setFont(QFont("仿宋", 15)) self.ckfromtimeedit = QDateEdit() datefrom = datetime.strptime("2018-07-01", "%Y-%m-%d").date() self.ckfromtimeedit.setDate(datefrom) self.ckfromtimeedit.setFont(QFont("仿宋", 12)) self.ckfromtimeedit.setFixedSize(200, 30) self.cktotimelabel = QLabel() self.cktotimelabel.setText("窗口结束时间") self.cktotimelabel.setFont(QFont("仿宋", 15)) self.cktotimeedit = QDateEdit() dateto = datetime.strptime("2019-12-31", "%Y-%m-%d").date() self.cktotimeedit.setDate(dateto) self.cktotimeedit.setFont(QFont("仿宋", 12)) self.cktotimeedit.setFixedSize(200, 30) self.ycfromtimelabel = QLabel() self.ycfromtimelabel.setText("预测开始时间") self.ycfromtimelabel.setFont(QFont("仿宋", 15)) self.ycfromtimeedit = QDateEdit() datefrom = datetime.strptime("2019-01-01", "%Y-%m-%d").date() self.ycfromtimeedit.setDate(datefrom) self.ycfromtimeedit.setFont(QFont("仿宋", 12)) self.ycfromtimeedit.setFixedSize(200, 30) self.yctotimelabel = QLabel() self.yctotimelabel.setText("预测结束时间") self.yctotimelabel.setFont(QFont("仿宋", 15)) self.yctotimeedit = QDateEdit() dateto = datetime.strptime("2019-12-31", "%Y-%m-%d").date() self.yctotimeedit.setDate(dateto) self.yctotimeedit.setFont(QFont("仿宋", 12)) self.yctotimeedit.setFixedSize(200, 30) self.cashlabel = QLabel() self.cashlabel.setText("初始资金") self.cashlabel.setFont(QFont("仿宋", 15)) self.cashedit = QTextEdit() self.cashedit.setText("1000000") self.cashedit.setFont(QFont("仿宋", 12)) self.cashedit.setFixedSize(200, 30) self.amountlabel = QLabel() self.amountlabel.setText("单笔交易股数") self.amountlabel.setFont(QFont("仿宋", 15)) self.amountedit = QTextEdit() self.amountedit.setText("1000") self.amountedit.setFont(QFont("仿宋", 12)) self.amountedit.setFixedSize(200, 30) self.selectbtn = QPushButton() self.selectbtn.setText("开始回测") self.selectbtn.setFixedSize(120, 40) self.selectbtn.setFont(QFont("仿宋", 12)) self.selectbtn.clicked.connect(self.backTest) self.selectbtn.setEnabled(False) self.h10box = QHBoxLayout() self.h10box.addWidget(self.tcodelabel) self.h10box.addWidget(self.tcodeedit) self.h105box = QHBoxLayout() self.h105box.addWidget(self.tfromtimelabel) self.h105box.addWidget(self.tfromtimeedit) self.h106box = QHBoxLayout() self.h106box.addWidget(self.ttotimelabel) self.h106box.addWidget(self.ttotimeedit) self.h107box = QHBoxLayout() self.h107box.addWidget(self.trainbtn) self.h107box.addWidget(self.acclabel) self.h107box.addWidget(self.accnlabel) self.h11box = QHBoxLayout() self.h11box.addWidget(self.pooledit) self.h11box.addWidget(self.pooladdbtn) self.h11box.addWidget(self.poolclbtn) self.h12box = QHBoxLayout() self.h12box.addWidget(self.pooltb) self.h13box = QHBoxLayout() self.h13box.addWidget(self.buylabel) self.h13box.addWidget(self.buyedit) self.h14box = QHBoxLayout() self.h14box.addWidget(self.selllabel) self.h14box.addWidget(self.selledit) self.v1box = QVBoxLayout() self.v1box.addStretch(1) self.v1box.addLayout(self.h10box) self.v1box.addLayout(self.h105box) self.v1box.addLayout(self.h106box) self.v1box.addLayout(self.h107box) self.v1box.addStretch(1) self.v1box.addWidget(self.poollabel) self.v1box.addLayout(self.h11box) self.v1box.addLayout(self.h12box) self.v1box.addStretch(1) self.v1box.addLayout(self.h13box) self.v1box.addLayout(self.h14box) self.v1box.addStretch(1) self.h21box = QHBoxLayout() self.h21box.addWidget(self.selectbtn) # self.h21box.addWidget(self.resultbtn) self.v2box = QVBoxLayout() self.v2box.addStretch(1) self.v2box.addWidget(self.ckfromtimelabel) self.v2box.addWidget(self.ckfromtimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.cktotimelabel) self.v2box.addWidget(self.cktotimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.ycfromtimelabel) self.v2box.addWidget(self.ycfromtimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.yctotimelabel) self.v2box.addWidget(self.yctotimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.cashlabel) self.v2box.addWidget(self.cashedit) self.v2box.addStretch(1) self.v2box.addWidget(self.amountlabel) self.v2box.addWidget(self.amountedit) self.v2box.addStretch(1) self.v2box.addLayout(self.h21box) self.v2box.addStretch(1) self.hbox = QHBoxLayout() self.hbox.addStretch(1) self.hbox.addLayout(self.v1box) self.hbox.addStretch(1) self.hbox.addLayout(self.v2box) self.hbox.addStretch(1) self.setLayout(self.hbox) self.pooltb.setPlainText(' '.join(self.codepool)) def addCode(self): f = FETCH() code = self.pooledit.toPlainText() if code in self.codepool: print( QMessageBox.information(self, "提示", "该股票已经存在于股票池中!", QMessageBox.Yes, QMessageBox.Yes)) elif code not in list(f.fetch_stock_list()['code']): print( QMessageBox.information(self, "提示", "该股票代码不存在!", QMessageBox.Yes, QMessageBox.Yes)) else: self.codepool.append(code) self.pooledit.clear() self.pooltb.setPlainText(' '.join(self.codepool)) def clearPool(self): self.codepool = [] self.pooltb.setPlainText(' '.join(self.codepool)) def con_model(self): self.tcode = self.tcodeedit.toPlainText() try: lstm = LSTMpredict() lstm.get_data(self.tcodeedit.toPlainText(), self.change_name(self.tfromtimeedit.text()), self.change_name(self.ttotimeedit.text())) lstm.nomalize() lstm.cons_sets(cut=99) lstm.make_model() lstm.train_performance() lstm.test_performance() lstm.output_result() self.model = lstm.model self.accnlabel.setText(str(lstm.result * 100)[:4] + "%") self.selectbtn.setEnabled(True) except RuntimeError: self.accnlabel.setText("训练出错。") def backTest(self): r = LSTMtest(cash=int(self.cashedit.toPlainText())) print(self.codepool) r.LSTM_backtest(tcode=self.tcode, codep=self.codepool, ckstart=self.change_name(self.ckfromtimeedit.text()), ckend=self.change_name(self.cktotimeedit.text()), ycstart=self.change_name(self.ycfromtimeedit.text()), ycend=self.change_name(self.yctotimeedit.text()), amount=int(self.amountedit.toPlainText()), model=self.model, buy=float(self.buyedit.toPlainText()), sell=float(self.selledit.toPlainText())) r.save_to_mongo() self.btResult(r.ACstr) def change_name(self, s): l = s.split('/') if len(l[1]) == 1: l[1] = "0" + l[1] if len(l[2]) == 1: l[2] = "0" + l[2] return ("-".join(l)) def btResult(self, AC_id): dialog = BackTestResult(ACid=AC_id) dialog.setWindowFlags(Qt.WindowStaysOnTopHint) dialog.show() dialog.exec_()