Example #1
0
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_()
Example #2
0
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_()
Example #3
0
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_()
Example #4
0
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)
Example #5
0
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_()
Example #6
0
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_()