コード例 #1
0
def QA_SU_crawl_eastmoney(action="zjlx", stockCode=None):
    '''

    :param action: zjlx 后期支持其他的操作类型
    :param stockCode: 股票代码
    :return:
    '''
    stockItems = QA_fetch_stock_list()

    if stockCode == "all":
        # 读取tushare股票列表代码
        print("💪 一共需要获取 %d 个股票的 资金流向 , 需要大概 %d 小时" %
              (len(stockItems), (len(stockItems)*5)/60/60))

        code_list = []
        for stock in stockItems:
            code_list.append(stock['code'])
            # print(stock['code'])
        crawl_eastmoney_file.QA_read_eastmoney_zjlx_web_page_to_sqllite(
            code_list)
        # print(stock)

        return
    else:
        # todo 检查股票代码是否合法
        # return crawl_eastmoney_file.QA_read_eastmoney_zjlx_web_page_to_sqllite(stockCode=stockCode)
        code_list = []
        code_list.append(stockCode)
        return crawl_eastmoney_file.QA_request_eastmoney_zjlx(param_stock_code_list=code_list)
コード例 #2
0
 def test_QThread_Check_ZJLX_DB_Count(self):
     qthread = QThread_Check_ZJLX_DB_Status()
     stockListAll = QA_fetch_stock_list()
     for iRec in stockListAll:
         stockCode = iRec['code']
         lstRet = qthread.QA_count_eastmoney_stock_xjlc_record_count_one_by_one(str_stock_code=stockCode)
         print(lstRet)
コード例 #3
0
ファイル: QAQuery_Advance.py プロジェクト: evsteel/QUANTAXIS
def QA_fetch_stock_list_adv(collections=DATABASE.stock_list):
    '''
    '获取股票列表'
    :param collections: mongodb 数据库
    :return: DataFrame
    '''
    stock_list_items = QA_fetch_stock_list(collections)
    if len(stock_list_items) == 0:
        print("QA Error QA_fetch_stock_list_adv call item for item in collections.find() return 0 item, maybe the DATABASE.stock_list is empty!")
        return None
    return stock_list_items
コード例 #4
0
def QA_fetch_stock_list_adv(collections=DATABASE.stock_list):
    '''
    '获取股票列表'
    :param collections: mongodb 数据库
    :return: DataFrame
    '''
    stock_list_items = QA_fetch_stock_list(collections)
    if len(stock_list_items) == 0:
        print(
            "QA Error QA_fetch_stock_list_adv call item for item in collections.find() return 0 item, maybe the DATABASE.stock_list is empty!"
        )
        return None
    return pd.DataFrame(stock_list_items).drop(
        '_id', axis=1, inplace=False).set_index('code', drop=False)
コード例 #5
0
    def run(self):
        #time.sleep(2)
        print("QThread_GetStockList is running")
        # 检查数据库是否已经开启

        try:
            self.stockListAll = QA_fetch_stock_list()
        except Exception as ee:
            # print(ee)
            self.strTaskRunningResult = ee.__str__()
            self.stockListAll = None
            self.stockCountAll = 0
            return

        self.stockCountAll = len(self.stockListAll)
        self.strTaskRunningResult = "成功获取 股票列表, 🔗 数据库成功 , 共 {} 个股票 😄".format(
            self.stockCountAll)
        pass
コード例 #6
0
 def get(self):
     page = int(self.get_argument('page', default=1))
     page_size = int(self.get_argument('page_size', default=10))
     start = (page - 1) * page_size
     end = page * page_size - 1
     stock_list = QA_fetch_stock_list()
     stock_list['pre_close'] = stock_list['pre_close'].apply(
         lambda x: round(x, 2))
     stock_fav = QA_fetch_stock_fav()
     stock_list = stock_list[stock_list["code"].isin(
         stock_fav['code'].tolist())]
     total = len(stock_list)
     data = QA_util_to_json_from_pandas(stock_list[start:end])
     return self.write({
         'result': data,
         'page': int(page),
         'page_size': int(page_size),
         'total': int(total)
     })
コード例 #7
0
ファイル: main.py プロジェクト: pythonness/QUANTAXIS
def QA_SU_crawl_eastmoney(action="zjlx",stockCode=None, fromStockCodeToStart=None):
    '''

    :param action: zjlx 后期支持其他的操作类型
    :param stockCode: 股票代码
    :return:
    '''
    stockItems = QA_fetch_stock_list()

    if stockCode=="all" or stockCode== "continue":
      
        code_list = []

        bCheckpointAfter = False
        for stock in stockItems:

            if stock['code'] == fromStockCodeToStart:
                bCheckpointAfter = True

            if fromStockCodeToStart != None and bCheckpointAfter == False and stock['code'] != fromStockCodeToStart:
                continue
            elif fromStockCodeToStart != None and stock['code'] == fromStockCodeToStart:
                bCheckpointAfter = True

            code_list.append(stock['code'])
            #print(stock['code'])

          #读取tushare股票列表代码
        print("💪 一共需要获取 %d 个股票的 资金流向 , 需要大概 %d 小时" % (len(code_list), (len(code_list)*30)/60/60 ))

        crawl_eastmoney_file.QA_read_eastmoney_zjlx_web_page_to_sqllite(code_list)
            #print(stock)

        return
    else:
        #todo 检查股票代码是否合法
        #return crawl_eastmoney_file.QA_read_eastmoney_zjlx_web_page_to_sqllite(stockCode=stockCode)
        code_list = []
        code_list.append(stockCode)
        return crawl_eastmoney_file.QA_request_eastmoney_zjlx(param_stock_code_list=code_list)
コード例 #8
0
    def QA_statistic_block_data(self):

        # 🛠 todo 直接使用monogodb 数据库去统计
        try:
            block_list_df = QA_fetch_stock_block()
            blockNameList = {}
            block_list_df = block_list_df.set_index(['blockname'])

            for strIndexBlockName in block_list_df.index:
                try:
                    dict = blockNameList[strIndexBlockName]
                    dict['count'] = dict['count'] + 1
                    self.strTaskRunningLog = "正在统计板块{} 股票个数{}".format(strIndexBlockName, dict['count'])

                except Exception as ee:
                    dictNew = {}
                    dictNew['up'] = 0    #上涨家数
                    dictNew['even'] = 0  #平盘家数
                    dictNew['down'] = 0  #下跌家数
                    dictNew['count'] = 0 #板块股票数
                    dictNew['upRatio'] = 0.0 #上涨家数比率
                    dictNew['downRation'] = 0.0 #下跌家数比率
                    blockNameList[strIndexBlockName] = dictNew
                #row2 = block_list_df[i]
            #######################################################################################################

            strToday = QADate.QA_util_today_str()
            strEndDate = QADate_trade.QA_util_get_real_date(date = strToday)
            strStartDate = QADate_trade.QA_util_get_last_day(date= strEndDate)

            codeTwoDayPriceeDict = {}
            stock_list = QA_fetch_stock_list()

            stock_list_len = len(stock_list)
            stock_name_count = 0
            for aStockCode in stock_list:
                stock_name_count = stock_name_count + 1
                strAcode = aStockCode['code']
                strAName = aStockCode['name']
                priceTowDay = QA_fetch_stock_day_adv(code=strAcode, start=strStartDate, end=strEndDate)

                up = None
                if priceTowDay is not None:
                    priceTowDay.to_qfq()
                    # price_len = len(priceTowDay)
                    # print(priceTowDay)

                    price_len = len(priceTowDay)
                    if price_len == 2:
                        closeSerial = priceTowDay.close
                        # todayPrice = priceTowDay[1].close
                        v1 = closeSerial[0]
                        v2 = closeSerial[1]
                        if v1 < v2:
                            up = True
                        else:
                            up = False

                codeTwoDayPriceeDict[strAcode] = {'pricetwoday':priceTowDay,
                                                  'up':up}

                if  codeTwoDayPriceeDict[strAcode]['up'] is not None and codeTwoDayPriceeDict[strAcode]['up'] == True:
                    self.strTaskRunningLog = "正在获取股票价格 {} {} 上涨 ⬆🔺,  进度{}/{} " \
                        .format(strAcode, strAName, stock_name_count, stock_list_len)

                elif codeTwoDayPriceeDict[strAcode]['up'] is not None and codeTwoDayPriceeDict[strAcode]['up'] == False:
                    self.strTaskRunningLog = "正在获取股票价格 {} {} 下跌 ⬇️,  进度{}/{} " \
                        .format(strAcode, strAName, stock_name_count, stock_list_len)

                else:
                    self.strTaskRunningLog = "正在获取股票价格 {} {} 和前一天的无法统计️,  进度{}/{} " \
                        .format(strAcode, strAName, stock_name_count, stock_list_len)
            ##########################################################################################################



            len_block_size = len(blockNameList)
            count = 0
            for blockName in blockNameList.keys():
                count = count + 1
                stocks_in_block = QA_fetch_stock_block_adv(code=None, blockname= blockName)
                self.strTaskRunningLog = "正在统计板块{} ,进度{}/{}".format(blockName,count,len_block_size)
                code_list = stocks_in_block.code

                iCodeLength = len(code_list)
                iCountForCode = 0

                for iCode in code_list:

                    iCountForCode = iCountForCode + 1

                    try:
                        priceTowDay = codeTwoDayPriceeDict[iCode]['pricetwoday']
                        upValue = codeTwoDayPriceeDict[iCode]['up']

                        if priceTowDay is not None:
                            if upValue == True:
                                blockNameList[blockName]['up'] = blockNameList[blockName]['up'] + 1
                            elif upValue == False:
                                blockNameList[blockName]['down'] = blockNameList[blockName]['down'] + 1


                    except Exception as ee:
                        strErrorMsg = ee.__str__()
                        print(strErrorMsg)



                        self.strTaskRunningLog = "正在统计板块{} ,进度{}/{} \n 股票 {}, 进度 {}/{}"\
                            .format(blockName, count, len_block_size, iCode, iCountForCode, iCodeLength)

                    pass
                #print(stocks_in_block)
            #######################################################################################################

        except Exception as eee:
            strErrorMsg = eee.__str__()
            print(strErrorMsg)

        finally:
            return blockNameList
コード例 #9
0
    def run(self):

        #
        def find(f, seq):
            """Return first item in sequence where f(item) == True."""
            for item in seq:
                if f(item):
                    return item

        self.zjlxRecNeedUpdateStockCodes.clear()
        self.stockListAll.clear()
        self.stockListAll = QA_fetch_stock_list()

        self.strTaskRunningLog = '正在检查数据库,已经获取的数据'
        itemsInZJLX = self.QA_count_eastmoney_stock_xjlc_record_count_by_aggregate(
        )
        '''
            追究没有获取过的记录,
        '''

        # 非常慢
        # codeNeedAppend = []
        # for aItemInAllStock in self.stockListAll:
        #     code0 = aItemInAllStock['code']
        #     #self.strTaskRunningLog = '正在检查数据 {}'.format(code0)
        #
        #     foundItem = find(lambda aRec: aRec['_id'] == code0, itemsInZJLX)
        #     if foundItem is None:
        #         codeNeedAppend.append(code0)
        #
        #
        # print(codeNeedAppend)

        # 使用 dict
        allItemsByDict = {}
        partItemsByDict = {}

        needToAppendCode = []

        self.strTaskRunningLog = '正在检查数据库,从未获取的记录'

        for iRecWhole in self.stockListAll:
            allItemsByDict[iRecWhole['code']] = iRecWhole['code']

        for iRecPart in itemsInZJLX:
            partItemsByDict[iRecPart['_id']] = iRecPart['_id']

        for iRec in allItemsByDict:
            try:
                stock_code = partItemsByDict[iRec]
            except Exception as ee:
                #part 里面 没有 这个股票代码
                needToAppendCode.append(iRec)
                #print(ee)

        #print(needToAppendCode)

        for codeAppend in needToAppendCode:
            anItem = {
                '_id': codeAppend,
                'first_date': '第一次获取',
                'last_date': '第一次获取',
                'total_num': 0,
                'need_update': 'Yes'
            }
            itemsInZJLX.append(anItem)

        def takeCode(elem):
            return elem['_id']

        itemsInZJLX.sort(key=takeCode)

        iIndexZJLX = 0
        zjlxCount = len(itemsInZJLX)

        for itemInZjlx in itemsInZJLX:
            try:
                iIndexZJLX = iIndexZJLX + 1
                self.strTaskRunningLog = '正在检查数据:{} 进度:{}/{}'.format(
                    itemInZjlx, iIndexZJLX, zjlxCount)

                # item['_id'], item['start_date'], item['end_date'], item['total_num'], item['need_update']
                col0 = itemInZjlx['_id']
                col1 = itemInZjlx['first_date']
                col2 = itemInZjlx['last_date']
                col3 = itemInZjlx['total_num']
                col4 = itemInZjlx['need_update']
                self.pyqtSignalToLogTable.emit(col0, col1, col2, col3, col4)

                if itemInZjlx['need_update'] == 'Yes':
                    self.zjlxRecNeedUpdateStockCodes.append(col0)

            except Exception as ee:
                print(ee)

        self.strTaskRunningResult = " 任务结束 "
        pass
コード例 #10
0
    def doStart(self):

        self.bntStop.setEnabled(False)
        self.bntStart.setEnabled(False)

        # 🛠todo 关闭上一次启动的服务区进程
        for i in range(processNum):
            try:
                process_port = str(port_number_start + i)
                sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

                # Connect the socket to the port where the server is listening
                server_address = ('localhost', int(process_port))
                # print('connecting to {} port {}'.format(*server_address))

                sock.connect(server_address)

                strMsg = 'shutdown:shutdown'
                message = strMsg.encode()
                sock.sendall(message)
                # print('sending {!r}'.format(message))

                # print('closing socket')
                #sock.close()
            except Exception as ee:
                # print(ee)
                pass

            finally:
                pass

        # 检查数据库是否已经开启
        try:
            stockListAll = QA_fetch_stock_list()
        except Exception as ee:
            #print(ee)
            strError = ee.__str__()
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Information)
            msg.setText("获取股票代码失败,无法连接数据库!😹")
            msg.setInformativeText(strError)
            msg.setWindowTitle("提示:")
            msg.setDetailedText(": 请确认mongodb 是否运行正常")
            #retval = msg.exec_()
            msg.exec()
            return

        stockCountAll = len(stockListAll)

        labelAll = "%d/%d,还剩:%d,进度:%f,剩余小时:%s" % (0, stockCountAll,
                                                  stockCountAll, 0.0, '未知')
        self.labelAllProgress.setText(labelAll)

        # 🛠todo
        #print("启动服务进程")

        # xxxx/QUANTAXIS/QUANTAXIS_Monitor_GUI/MainTables/__file__
        realPath = os.path.realpath(
            __file__
        )  # xxxx/QUANTAXIS/QUANTAXIS_Monitor_GUI/MainTables/__file__
        realDir0 = os.path.dirname(realPath)
        # xxxx/QUANTAXIS/QUANTAXIS_Monitor_GUI/MainTables
        realDir1 = os.path.dirname(realDir0)
        # xxxx/QUANTAXIS/QUANTAXIS_Monitor_GUI
        realDir2 = os.path.dirname(realDir1)

        for i in range(processNum):
            process_port = str(port_number_start + i)
            p = subprocess.Popen([
                'python',
                './QUANTAXIS_Monitor_GUI/TasksByProcess/SubSeleniumProcess.py',
                process_port
            ],
                                 cwd=realDir2)
            #stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            #print(p)
            time.sleep(1)
            # 尝试连接是否正常工作

        # 🛠todo 判断服务进程socket是否已经就绪
        time.sleep(30)

        for i in range(processNum):
            try:
                #print("连接服务进程的线程")
                worker = Worker()

                worker.logTbl = self.logTbl

                worker.totalProgressBar = self.progressBarAll
                worker.totalProgressLabel = self.labelAllProgress

                worker.process_port = port_number_start + i
                worker.progressBar = self.subProgressBar[i]
                worker.progressLabel = self.subProcessLabel[i]

                worker.progressBar.setMaximum(10000)
                worker.progressLabel.setText("准备开始。。。")

                # Worker cannot be converted to PyQt5.QtCore.QObject in this context
                worker.trigger_new_sub_process_log.connect(
                    worker.handleNewSubProcessLog)
                worker.trigger_new_sub_process_progress.connect(
                    worker.handleNewSubProcessProgress)

                #self.threadpool.start(self.worker)
                #todo  fix here 没有用到赞的
                self.Thread_List.append(worker)

                worker.start()

                time.sleep(1)

            except Exception as ee:
                #print(ee)
                pass

        self.startup_task_time = datetime.now()
        self.timer.start(15000)  # 设置计时间隔并启动, 更新整体进度

        self.progressBarAll.setMaximum(1000000)

        self.bntStop.setEnabled(True)
コード例 #11
0
    def run(self):
        '''
        Your code goes in this function
        '''
        try:

            stockList = QA_fetch_stock_list()
            stockCount = len(stockList)

            subStockList = []

            quotient = stockCount // processNum
            remainder = stockCount % processNum
            thread_num = self.process_port - port_number_start

            formStock = 0
            toStock = 0

            if thread_num < processNum - 1:
                fromStock = thread_num * quotient + 0
                toStock = thread_num * quotient + quotient - 1
                for i in range(quotient):
                    aStock = stockList[thread_num * quotient + i]
                    subStockList.append(aStock)
            else:
                if remainder != 0:
                    fromStock = thread_num * quotient + 0
                    toStock = thread_num * quotient + remainder - 1
                    for i in range(remainder):
                        aStock = stockList[thread_num * quotient + i]
                        subStockList.append(aStock)
                else:
                    fromStock = thread_num * quotient + 0
                    toStock = thread_num * quotient + quotient - 1
                    for i in range(quotient):
                        aStock = stockList[thread_num * quotient + i]
                        subStockList.append(aStock)

            subStockList.reverse()

            for i in range(50):
                if i < len(subStockList[i]):
                    subStockList.remove(subStockList[i])

            print("thread_Port%d,一共获取股票%d个,  当前线程分配 %d, from %d to %d" %
                  (self.process_port, stockCount, len(subStockList), fromStock,
                   toStock))

        except Exception as ee:
            print(ee)
            return

        for aStock in subStockList:
            try:
                fetchCode = aStock['code']
                #print("准备获取代码{}".format(fetchCode))
                self.fetchCodeZjlx(fetchCode, self.process_port)
                #print("完成获取代码{}".format(fetchCode))

                if mutex.acquire():
                    #更新总体进度,这个是多线程 ,1/100 , 还剩1 , 1%
                    #labelAll = "%d/%d,还剩:%d,进度:%f" % (0, stockCountAll, stockCountAll, 0.0)

                    txt = self.totalProgressLabel.text()

                    progres_lables = txt.split(',')
                    progress_stock_number = progres_lables[0].split('/')

                    already_got = int(progress_stock_number[0])
                    total_remain = int(progress_stock_number[1])
                    already_got = already_got + 1

                    reamin_stock = total_remain - already_got
                    progress_percent = already_got / total_remain

                    sRemainHour = progres_lables[3].split(':')[1]
                    labelAll = "%d/%d,还剩:%d,进度:%f,剩余小时:%s" % (
                        already_got, total_remain, reamin_stock,
                        progress_percent, sRemainHour)
                    self.totalProgressLabel.setText(labelAll)
                    mutex.release()

            except Exception as ee:
                mutex.release()
                print(ee)
                pass
                return
コード例 #12
0
def re_build(target,
             positions,
             sub_accounts,
             trading_date,
             percent,
             exceptions,
             k=100):
    sub_accounts = sub_accounts - 10000
    positions = positions[positions['股票余额'].astype(float) > 0]
    positions = positions[positions['股票余额'].astype(float) > 0]
    positions['上市时间'] = positions['证券代码'].apply(
        lambda x: date_func(str(QA_fetch_stock_to_market_date(x))))

    if exceptions is not None:
        exceptions = exceptions.extend(
            list(positions[positions['上市时间'] <= 15].set_index('证券代码').index))
    else:
        exceptions = list(
            positions[positions['上市时间'] <= 15].set_index('证券代码').index)

    if target is None:
        res = pd.concat([
            positions.set_index('证券代码'),
            QA_fetch_stock_fianacial_adv(
                list(positions.set_index('证券代码').index), trading_date,
                trading_date).data.reset_index('date')[['NAME', 'INDUSTRY']],
            QA_fetch_stock_day_adv(list(positions.set_index('证券代码').index),
                                   QA_util_get_last_day(trading_date, 60),
                                   trading_date).to_qfq().data.
            loc[trading_date].reset_index('date')['close']
        ],
                        axis=1)
        if exceptions is not None:
            exceptions_list = [
                i for i in list(res.index) if i not in exceptions
            ]
            res = res.loc[exceptions_list]
        else:
            pass
        avg_account = 0
        res = res.assign(tar=avg_account)
        res['cnt'] = 0
        res['real'] = 0
        res['mark'] = (res['cnt'] - res['股票余额'].apply(lambda x: float(x))
                       ).apply(lambda x: math.floor(x / 100) * 100)
    else:
        tar1 = target.reset_index().groupby('code').max()
        tar1['double'] = target.reset_index().groupby('code')['RANK'].count()
        target = tar1
        if exceptions is not None:
            exceptions_list = [
                i for i in list(target.index) if i not in exceptions
            ]
            exceptions_listb = [
                i for i in list(positions.set_index('证券代码').index)
                if i not in exceptions
            ]
            r1 = target.loc[exceptions_list].join(
                positions.set_index('证券代码').loc[exceptions_listb], how='outer')
        else:
            r1 = target.join(positions.set_index('证券代码'), how='outer')
        r1['股票余额'] = r1['股票余额'].fillna(0)
        realtm = QA_fetch_get_stock_realtime(
            'tdx',
            code=[
                x for x in list(r1.index)
                if x in list(QA_fetch_stock_list().index)
            ]).reset_index('datetime')[[
                'ask1', 'ask_vol1', 'bid1', 'bid_vol1'
            ]]
        close = QA_fetch_stock_day_adv(
            list(r1.index), QA_util_get_last_day(trading_date, 60),
            trading_date).data.loc[trading_date].reset_index('date')['close']
        res = r1.join(QA_fetch_stock_fianacial_adv(
            list(r1.index), trading_date,
            trading_date).data.reset_index('date')[['NAME', 'INDUSTRY']],
                      how='left').join(realtm, how='left').join(close,
                                                                how='left')
        avg_account = (sub_accounts * percent) / target['double'].sum()
        res = res.assign(tar=avg_account)
        res.ix[res['RANK'].isnull(), 'tar'] = 0
        res['tar'] = res['tar'] * res['double']
        res['amt'] = res.apply(lambda x: func1(x['ask1'], x['bid1']), axis=1)
        res['cnt'] = (res['tar'] / res['amt'] /
                      100).apply(lambda x: round(x, 0) * 100)
        res['real'] = res['cnt'] * res['amt']
        res = res.sort_values(by='amt', ascending=False)
        res = res.fillna(0)
        res1 = res[res['tar'] > 0]
        res2 = res[res['tar'] == 0]
        res1.ix[-1, 'cnt'] = round(
            (res1['real'][-1] - (res1['real'].sum() - res1['tar'].sum())) /
            res1['ask1'][-1] / 100, 0) * 100 - k
        res = pd.concat([res1, res2])
        res['real'] = res['cnt'] * res['amt']
        res['mark'] = (res['cnt'] - res['股票余额'].apply(lambda x: float(x))
                       ).apply(lambda x: math.floor(x / 100) * 100)
    return (res)