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()
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
def main(): sas = StockAnalysisSystem() assert sas.check_initialize() factor_test_entry(sas) print('Process Quit.')
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
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')
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()
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))
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)
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')
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)
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
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'))
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)
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()
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)
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))
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
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()
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)
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()