Example #1
0
def main():
    app = QApplication(sys.argv)
    data_hub = StockAnalysisSystem().get_data_hub_entry()
    update_table = StockAnalysisSystem().get_database_entry().get_update_table(
    )
    dlg = WrapperQDialog(DataUpdateUi(data_hub, update_table))
    dlg.exec()
Example #2
0
def test_entry() -> bool:
    sas = StockAnalysisSystem()
    if not sas.check_initialize():
        print('StockAnalysisSystem init fail.')
        return False
    test_memory_leak_in_update(sas)
    return True
Example #3
0
def main():
    sas = StockAnalysisSystem()
    assert sas.check_initialize()

    factor_test_entry(sas)

    print('Process Quit.')
Example #4
0
def test_memory_leak_in_update(sas: StockAnalysisSystem):
    sas = StockAnalysisSystem()
    data_hub = sas.get_data_hub_entry()
    data_center = data_hub.get_data_center()
    data_utility = data_hub.get_data_utility()

    # data_center.update_local_data('Market.SecuritiesInfo', force=False)
    # data_center.update_local_data('Market.NamingHistory')
    # data_center.update_local_data('Market.TradeCalender')

    # stock_list = data_utility.get_stock_list()

    # data_center.update_local_data('Finance.Audit', '600000.SSE', force=True)
    # data_center.update_local_data('Finance.Audit', '600036.SSE', force=True)
    #
    # data_center.update_local_data('Finance.BalanceSheet', '600000.SSE', force=True)
    # data_center.update_local_data('Finance.BalanceSheet', '600036.SSE', force=True)
    #
    # data_center.update_local_data('Finance.IncomeStatement', '600000.SSE', force=True)
    # data_center.update_local_data('Finance.IncomeStatement', '600036.SSE', force=True)
    #
    # data_center.update_local_data('Finance.CashFlowStatement', '600000.SSE', force=True)
    # data_center.update_local_data('Finance.CashFlowStatement', '600036.SSE', force=True)

    data_hub = sas.get_data_hub_entry()
    data_center = data_hub.get_data_center()
    data_utility = data_hub.get_data_utility()
    stock_list = data_utility.get_stock_list()

    counter = 0
    for stock_identity, name in stock_list:
        counter += 1
        data_center.update_local_data('Finance.Audit',
                                      stock_identity,
                                      force=True)
        data_center.update_local_data('Finance.BalanceSheet',
                                      stock_identity,
                                      force=True)
        data_center.update_local_data('Finance.IncomeStatement',
                                      stock_identity,
                                      force=True)
        data_center.update_local_data('Finance.CashFlowStatement',
                                      stock_identity,
                                      force=True)
        data_center.update_local_data('Stockholder.PledgeStatus',
                                      stock_identity,
                                      force=True)
        data_center.update_local_data('Stockholder.PledgeHistory',
                                      stock_identity,
                                      force=True)
        if counter > 100:
            break

    print(gc.collect())
    objs = objgraph.by_type('OBJ')
    if len(objs) > 0:
        objgraph.show_backrefs(objs[0], max_depth=10, filename='obj.dot')

    return True
Example #5
0
 def config_ui(self):
     data_utility = StockAnalysisSystem().get_data_hub_entry(
     ).get_data_utility()
     stock_list = data_utility.get_stock_list()
     for stock_identity, stock_name in stock_list:
         self.__combo_name.addItem(stock_identity + ' | ' + stock_name)
     self.__combo_name.setEditable(True)
     self.setMinimumSize(QSize(600, 400))
 def closeEvent(self, event):
     if StockAnalysisSystem().can_sys_quit():
         StockAnalysisSystem().finalize()
         super().closeEvent(event)
     else:
         QMessageBox.information(
             self, QtCore.QCoreApplication.translate('main', '无法退出'),
             QtCore.QCoreApplication.translate('main', '有任务正在执行中,无法退出程序'),
             QMessageBox.Ok, QMessageBox.Ok)
         event.ignore()
def csv_name_column_to_identity(csv_file: str, column: str) -> bool:
    df = pd.read_csv(csv_file, index_col=None)
    if column not in list(df.columns):
        return False
    from stock_analysis_system import StockAnalysisSystem
    data_utility = StockAnalysisSystem().get_data_hub_entry().get_data_utility()
    name_column = df[column].values.tolist()
    id_column = data_utility.names_to_stock_identity(name_column)
    df[column] = np.array(id_column)
    df.to_csv(csv_file + '_parsed.csv')
Example #8
0
class MainWindow(CommonMainWindow):

    def __init__(self):

        # --------- init Parent ---------
        super(MainWindow, self).__init__()

        # --------- init Member ---------
        self.__translate = QtCore.QCoreApplication.translate

        # ---------- Modules and Sub Window ----------

        self.__alias_table_module = StockAnalysisSystem().get_database_entry().get_alias_table()
        self.__alias_table_module_ui = AliasTableUi(self.__alias_table_module)

        # ---------- Deep init ----------
        self.init_ui()
        self.init_menu()
        self.init_sub_window()

        self.modules_init()
        self.modules_ui_init()

    # ----------------------------- Setup and UI -----------------------------

    def init_ui(self):
        widget = QWidget()
        main_layout = QHBoxLayout()
        widget.setLayout(main_layout)
        self.setCentralWidget(widget)

        self.setWindowTitle('Stock Analysis System - Sleepy')

    def init_menu(self):
        pass

    def init_sub_window(self):
        self.add_sub_window(self.__alias_table_module_ui, {
            'DockName': self.__translate('main', 'Alias Table'),
            'DockArea': Qt.LeftDockWidgetArea,
            'DockShow': True,
            'DockFloat': True,
            'MenuName': self.__translate('main', 'Alias Table'),
            'MenuPresent': True,
            'ActionName': self.__translate('main', 'Alias Table'),
            'ActionShortcut': self.__translate('main', ''),
            'ActionPresent': True,
            'ActionTips': self.__translate('main', 'Alias Table'),
        })

    def modules_init(self):
        self.__alias_table_module.init(True)

    def modules_ui_init(self):
        self.__alias_table_module_ui.Init()
Example #9
0
    def __init__(self, data_hub_entry: DataHubEntry, update_table: UpdateTableEx):
        super(DataUpdateUi, self).__init__()

        # Access entry
        self.__data_hub = data_hub_entry
        self.__data_center = self.__data_hub.get_data_center()
        self.__update_table = update_table

        # Table content
        self.__display_uri = []
        self.__display_identities = None
        self.__display_table_lines = []

        # Page related
        self.__page = 0
        self.__item_per_page = 20

        # For processing updating
        self.__processing_update_tasks = []
        # Fot task counting
        self.__processing_update_tasks_count = []

        self.task_finish_signal.connect(self.__on_task_done)
        self.refresh_finish_signal.connect(self.update_table_display)

        # Timer for update status
        self.__timer = QTimer()
        self.__timer.setInterval(1000)
        self.__timer.timeout.connect(self.on_timer)
        self.__timer.start()

        # UI related
        self.__info_panel = QLabel(DEFAULT_INFO)

        self.__table_main = TableViewEx()
        self.__button_head_page = QPushButton('<<')
        self.__button_prev_page = QPushButton('<')
        self.__button_next_page = QPushButton('>')
        self.__button_tail_page = QPushButton('>>')
        self.__button_upper_level = QPushButton('↑')

        self.__button_refresh = QPushButton('Refresh')
        self.__button_batch_auto_update = QPushButton('Auto Update Select')
        self.__button_batch_force_update = QPushButton('Force Update Select')

        self.init_ui()

        # Post update and cache stock list after posting RefreshTask
        data_utility = self.__data_hub.get_data_utility()
        StockAnalysisSystem().get_task_queue().add_observer(self)
        StockAnalysisSystem().get_task_queue().append_task(UpdateStockListTask(data_utility))
Example #10
0
 def extension_window_init(self):
     sas = StockAnalysisSystem()
     extension_manager = sas.get_extension_manager()
     widgets_config = extension_manager.create_extensions_widgets(self)
     for widget, _config in widgets_config:
         self.add_sub_window(
             widget, _config.get('name'), {
                 'DockFloat': True,
                 'MenuPresent': True,
                 'DockArea': Qt.AllDockWidgetAreas,
                 'DockShow': _config.get('show', False),
                 'DockName': _config.get('name', 'Extension'),
                 'ActionTips': _config.get('name', 'Extension'),
             }, self.__menu_extension)
Example #11
0
    def __ui_to_config(self):
        sas = StockAnalysisSystem()
        config = sas.get_config()

        config.set('TS_TOKEN', self.__line_ts_token.text())
        config.set('NOSQL_DB_HOST', self.__line_nosql_db_host.text())
        config.set('NOSQL_DB_PORT', self.__line_nosql_db_port.text())
        config.set('NOSQL_DB_USER', self.__line_nosql_db_user.text())
        config.set('NOSQL_DB_PASS', self.__line_nosql_db_pass.text())

        config.set('PROXY_PROTOCOL',
                   self.__combo_web_proxy_protocol.currentText())
        config.set('PROXY_HOST', self.__line_web_proxy_host.text())

        config.save_config()
    def import_csv(self, csv_file: str, replace: bool = False) -> bool:
        df = pd.read_csv(csv_file, index_col=None)
        header = list(df.columns)
        if 'name' not in header or 'reason' not in header or 'comments' not in header:
            return False
        if replace:
            self.clear()

        data_utility = StockAnalysisSystem().get_data_hub_entry().get_data_utility()
        name_column = df['name'].values.tolist()
        id_column = data_utility.names_to_stock_identity(name_column)
        df['name'] = np.array(id_column)

        for index, row in df.iterrows():
            self.upsert_to_list(row['name'], row['reason'], row['comments'])
        return True
def test_memory_leak(sas: StockAnalysisSystem):
    data_hub = sas.get_data_hub_entry()
    data_center = data_hub.get_data_center()
    data_utility = data_hub.get_data_utility()

    assert data_center.update_local_data('Finance.Audit', '600000')
    assert data_center.update_local_data('Finance.Audit', '600036')
Example #14
0
 def update_table(self):
     self.__table_main.clear()
     self.__table_main.setRowCount(0)
     self.__table_main.setHorizontalHeaderLabels(DataUpdateUi.TABLE_HEADER)
     self.__table_main.AppendRow(['', '刷新中...', '', '', '', '', '', '', ''])
     task = RefreshTask(self)
     StockAnalysisSystem().get_task_queue().append_task(task)
Example #15
0
 def __build_post_update_task(self, uri: str, identities: list or None, force: bool) -> bool:
     task = UpdateTask(self, self.__data_hub, self.__data_center, force)
     if identities is None:
         if uri == 'Market.TradeCalender':
             identities = 'SSE'
         elif uri in DataUpdateUi.INCLUDES_SECURITIES_SUB_UPDATE_LIST:
             data_utility = self.__data_hub.get_data_utility()
             identities = data_utility.get_stock_identities()
     task.set_work_package(uri, identities)
     self.__processing_update_tasks.append(task)
     self.__processing_update_tasks_count.append(task)
     ret = StockAnalysisSystem().get_task_queue().append_task(task)
     # After updating market info, also update stock list cache
     if ret and uri == 'Market.SecuritiesInfo':
         data_utility = self.__data_hub.get_data_utility()
         StockAnalysisSystem().get_task_queue().append_task(UpdateStockListTask(data_utility))
     return ret
Example #16
0
    def __config_to_ui(self):
        sas = StockAnalysisSystem()
        config = sas.get_config()
        if config.load_config():
            text = config.get('TS_TOKEN')
            self.__line_ts_token.setText(text)

            text = config.get('NOSQL_DB_HOST')
            self.__line_nosql_db_host.setText(text)
            self.__line_nosql_db_port.setText(config.get('NOSQL_DB_PORT'))
            self.__line_nosql_db_user.setText(config.get('NOSQL_DB_USER'))
            self.__line_nosql_db_pass.setText(config.get('NOSQL_DB_PASS'))

            self.__combo_web_proxy_protocol.setEditText(
                config.get('PROXY_PROTOCOL'))
            self.__combo_web_proxy_protocol.setCurrentIndex(0)
            self.__line_web_proxy_host.setText(config.get('PROXY_HOST'))
Example #17
0
 def __on_task_done(self):
     self.__task_thread = None
     StockAnalysisSystem().release_sys_quit()
     QMessageBox.information(
         self, QtCore.QCoreApplication.translate('main', '远行完成'),
         QtCore.QCoreApplication.translate(
             'main', '策略运行完成,耗时' + str(self.__timing_clock.elapsed_s()) +
             '秒\n' + '报告生成路径:' + self.__result_output), QMessageBox.Ok,
         QMessageBox.Ok)
Example #18
0
    def __init__(self):

        # --------- init Parent ---------
        super(MainWindow, self).__init__()

        # --------- init Member ---------
        self.__translate = QtCore.QCoreApplication.translate

        # ---------- Modules and Sub Window ----------

        self.__alias_table_module = StockAnalysisSystem().get_database_entry().get_alias_table()
        self.__alias_table_module_ui = AliasTableUi(self.__alias_table_module)

        # ---------- Deep init ----------
        self.init_ui()
        self.init_menu()
        self.init_sub_window()

        self.modules_init()
        self.modules_ui_init()
Example #19
0
 def execute_update_task(self):
     if self.__task_thread is None:
         self.__task_thread = threading.Thread(target=self.ui_task)
         StockAnalysisSystem().lock_sys_quit()
         self.__timing_clock.reset()
         self.__task_thread.start()
     else:
         print('Task already running...')
         QMessageBox.information(
             self, QtCore.QCoreApplication.translate('', '无法执行'),
             QtCore.QCoreApplication.translate('', '已经有策略在运行中,无法同时运行多个策略'),
             QMessageBox.Close, QMessageBox.Close)
Example #20
0
    def __config_control(self):
        self.setWindowTitle('System Config')
        self.__button_ok.clicked.connect(self.on_button_ok)
        self.__button_exit.clicked.connect(self.on_button_exit)
        self.__button_browse.clicked.connect(self.on_button_browse)
        self.__button_import.clicked.connect(self.on_button_import)
        self.__button_export.clicked.connect(self.on_button_export)

        # self.__text_information.setEnabled(False)
        self.__text_information.setStyleSheet(
            "QLabel{border:2px solid rgb(0, 0, 0);}")
        self.__text_information.setTextInteractionFlags(
            Qt.TextSelectableByMouse | Qt.TextSelectableByKeyboard)

        self.__combo_web_proxy_protocol.setEditable(True)
        self.__combo_web_proxy_protocol.addItem('HTTP_PROXY')
        self.__combo_web_proxy_protocol.addItem('HTTPS_PROXY')

        sas = StockAnalysisSystem()
        logs = sas.get_log_errors()

        self.__config_to_ui()
        self.__text_information.setText('\n'.join(logs))
Example #21
0
def __test_factor_for_one_stock(sas: StockAnalysisSystem, factors: [str]):
    if not isinstance(factors, (list, tuple)):
        factors = [factors]
    data_hub = sas.get_data_hub_entry()
    data_center = data_hub.get_data_center()
    df = data_center.query_from_factor('Factor.Finance',
                                       '000021.SZSE', (default_since(), now()),
                                       fields=factors,
                                       readable=True)
    print(df)
    assert df is not None and len(df) > 0

    for fct in factors:
        assert fct in df.columns
Example #22
0
def __test_factor_for_all_stock(sas: StockAnalysisSystem, factors: [str]):
    if not isinstance(factors, (list, tuple)):
        factors = [factors]
    data_hub = sas.get_data_hub_entry()
    data_center = data_hub.get_data_center()
    df = data_center.query_from_factor(
        'Factor.Finance',
        '', (text_auto_time('2018-12-01'), text_auto_time('2018-12-31')),
        fields=factors,
        readable=True)
    print(df)
    assert df is not None and len(df) > 0

    for fct in factors:
        assert fct in df.columns
def test_all_update(sas: StockAnalysisSystem):
    data_hub = sas.get_data_hub_entry()
    data_center = data_hub.get_data_center()
    data_utility = data_hub.get_data_utility()

    assert data_center.update_local_data('Market.SecuritiesInfo', force=True)
    assert data_center.update_local_data('Market.NamingHistory', force=True)
    assert data_center.update_local_data('Market.TradeCalender',
                                         exchange='SSE',
                                         force=True)

    assert data_center.update_local_data('Finance.Audit', '600000')
    assert data_center.update_local_data('Finance.BalanceSheet', '600000')
    assert data_center.update_local_data('Finance.IncomeStatement', '600000')
    assert data_center.update_local_data('Finance.CashFlowStatement', '600000')

    return True
def main():
    global sasEntry
    global data_center
    global data_utility
    global factor_center

    sasEntry = StockAnalysisSystem()
    assert StockAnalysisSystem().check_initialize()

    data_center = sasEntry.get_data_hub_entry().get_data_center()
    data_utility = sasEntry.get_data_hub_entry().get_data_utility()
    factor_center = sasEntry.get_factor_center()

    test_entry()

    print('All test passed.')
    def __init__(self):
        super(MainWindow, self).__init__(hold_menu=True)

        # --------- init Member ---------

        self.__menu_config = None
        self.__translate = QtCore.QCoreApplication.translate

        # ---------- Modules and Sub Window ----------

        data_hub_entry = StockAnalysisSystem().get_data_hub_entry()
        strategy_entry = StockAnalysisSystem().get_strategy_entry()
        database_entry = StockAnalysisSystem().get_database_entry()
        update_table = database_entry.get_update_table()

        self.__data_hub_ui = DataHubUi(data_hub_entry.get_data_center())
        self.__strategy_ui = StrategyUi(data_hub_entry, strategy_entry)
        self.__data_update_ui = DataUpdateUi(data_hub_entry, update_table)

        self.__gray_list_ui = XListTableUi(database_entry.get_gray_table(),
                                           '灰名单')
        self.__black_list_ui = XListTableUi(database_entry.get_black_table(),
                                            '黑名单')
        self.__focus_list_ui = XListTableUi(database_entry.get_focus_table(),
                                            '关注名单')

        self.__alias_table_module = database_entry.get_alias_table()
        self.__alias_table_ui = AliasTableUi(self.__alias_table_module)
        self.__task_queue_ui = TaskQueueUi(
            StockAnalysisSystem().get_task_queue())

        # ---------- Deep init ----------
        self.init_ui()
        self.init_menu()
        self.init_sub_window()

        self.modules_init()
        self.modules_ui_init()
Example #26
0
 def update_table(self):
     self.__table_main.Clear()
     self.__table_main.SetColumn(DataUpdateUi.TABLE_HEADER)
     self.__table_main.AppendRow(['', '刷新中...', '', '', '', '', '', '', ''])
     task = RefreshTask(self)
     StockAnalysisSystem().get_task_queue().append_task(task)
Example #27
0
def main():
    app = QApplication(sys.argv)
    data_hub_entry = StockAnalysisSystem().get_data_hub_entry()
    strategy_entry = StockAnalysisSystem().get_strategy_entry()
    dlg = WrapperQDialog(StrategyUi(data_hub_entry, strategy_entry))
    dlg.exec()
def test_entry() -> bool:
    sas = StockAnalysisSystem()
    if not sas.check_initialize():
        print('StockAnalysisSystem initialize fail.')
        return False
    assert test_all_update()