admin
2025-04-14 6e247849d1cb16202a484dda3c80dc359710708b
时间统计
2个文件已修改
110 ■■■■ 已修改文件
strategy/instant_time_market.py 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
strategy/market_sentiment_analysis.py 100 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
strategy/instant_time_market.py
@@ -320,15 +320,25 @@
def set_current_info(current_infos):
    @dask.delayed
    def process_current_infos(current_info_list):
        __start_time = time.time()
        use_time_list = []
        for current_info in current_info_list:
            try:
                if current_info is not None:
                    _start_time = time.time()
                    strategic_thread_manager(current_info)
                    use_time_list.append(time.time() - _start_time)
            except Exception as error:
                logging.exception(error)
                # print("异常:", current_info)
                logger_debug.exception(error)
                logger_debug.error(f"L1处理出错:{current_info}")
        use_time = time.time() - __start_time
        if use_time > 1:
            # 记录超过1s的数据
            async_log_util.info("L1数据处理时间统计:thread-{} 总计用时-{} 平均耗时-{} 最大耗时-{}",
                                tool.get_thread_id(), use_time, sum(use_time_list) / len(use_time_list),
                                max(use_time_list))
    @dask.delayed
    def batch_process_current_infos(fs):
strategy/market_sentiment_analysis.py
@@ -34,35 +34,40 @@
            # 上证指数数据
            Shanghai_index_data = current_info.get('000001')
            Shanghai_index = Shanghai_index_data[0]  # 上证指数
            Shanghai_index_volume = round(Shanghai_index_data[1]/100000000, 2)  # 上证指数 当日当时成交量
            Shanghai_index_turnover = round(Shanghai_index_data[2]/100000000, 2)  # 上证指数 当日当时成交额度
            Shanghai_index_volume = round(Shanghai_index_data[1] / 100000000, 2)  # 上证指数 当日当时成交量
            Shanghai_index_turnover = round(Shanghai_index_data[2] / 100000000, 2)  # 上证指数 当日当时成交额度
            Shanghai_Yesterday_closing_index = round(Shanghai_index_data[3], 2)  # 上证指数 昨日收盘指数
            logger.info(f"上证 指数:{Shanghai_index}   昨日收盘指数:{Shanghai_Yesterday_closing_index}   成交量:{Shanghai_index_volume}亿 手   成交额:{Shanghai_index_turnover}亿 元")
            logger.info(
                f"上证 指数:{Shanghai_index}   昨日收盘指数:{Shanghai_Yesterday_closing_index}   成交量:{Shanghai_index_volume}亿 手   成交额:{Shanghai_index_turnover}亿 元")
            # 深证指数数据
            Shenzhen_index_data = current_info.get('399001')
            Shenzhen_index = Shenzhen_index_data[0]  # 深证指数
            Shenzhen_index_volume = round(Shenzhen_index_data[1]/100000000, 2)  # 深证指数 当日当时成交量
            Shenzhen_index_turnover = round(Shenzhen_index_data[2]/100000000, 2)  # 深证指数 当日当时成交额度
            Shenzhen_index_volume = round(Shenzhen_index_data[1] / 100000000, 2)  # 深证指数 当日当时成交量
            Shenzhen_index_turnover = round(Shenzhen_index_data[2] / 100000000, 2)  # 深证指数 当日当时成交额度
            Shenzhen_Yesterday_closing_index = round(Shenzhen_index_data[3], 2)  # 深证指数 昨日收盘指数
            logger.info(f"深证 指数:{Shenzhen_index}   昨日收盘指数:{Shenzhen_Yesterday_closing_index}   成交量:{Shenzhen_index_volume}亿 手   成交额:{Shenzhen_index_turnover}亿 元")
            logger.info(
                f"深证 指数:{Shenzhen_index}   昨日收盘指数:{Shenzhen_Yesterday_closing_index}   成交量:{Shenzhen_index_volume}亿 手   成交额:{Shenzhen_index_turnover}亿 元")
            # 创业板指数数据
            TSXV_index_data = current_info.get('399006')
            TSXV_index = TSXV_index_data[0]  # 创业板指
            TSXV_index_volume = round(TSXV_index_data[1]/100000000, 2)  # 创业板指 当日当时成交量
            TSXV_index_turnover = round(TSXV_index_data[2]/100000000, 2)  # 创业板指 当日当时成交额度
            TSXV_index_volume = round(TSXV_index_data[1] / 100000000, 2)  # 创业板指 当日当时成交量
            TSXV_index_turnover = round(TSXV_index_data[2] / 100000000, 2)  # 创业板指 当日当时成交额度
            TSXV_Yesterday_closing_index = round(TSXV_index_data[3], 2)  # 深证指数 昨日收盘指数
            logger.info(f"创业板 指数:{TSXV_index}   昨日收盘指数:{TSXV_Yesterday_closing_index}  成交量:{TSXV_index_volume}亿 手   成交额:{TSXV_index_turnover}亿 元")
            logger.info(
                f"创业板 指数:{TSXV_index}   昨日收盘指数:{TSXV_Yesterday_closing_index}  成交量:{TSXV_index_volume}亿 手   成交额:{TSXV_index_turnover}亿 元")
            # 调用涨幅公式计算对应的股票tick瞬时涨幅
            data_cache.Shanghai_tick_growth = basic_methods.tick_growth('000001', Shanghai_index)
            data_cache.Shanghai_today_growth = basic_methods.intraday_growth(Shanghai_index, Shanghai_Yesterday_closing_index)
            data_cache.Shanghai_today_growth = basic_methods.intraday_growth(Shanghai_index,
                                                                             Shanghai_Yesterday_closing_index)
            logger.info(f"上证指数 瞬时涨幅 ---- {round(data_cache.Shanghai_tick_growth, 4)}%")
            logger.info(f"上证指数 当日涨幅 ==== {round(data_cache.Shanghai_today_growth, 4)}%")
            # 调用涨幅公式计算对应的股票tick瞬时涨幅
            data_cache.Shenzhen_tick_growth = basic_methods.tick_growth('399001', Shanghai_index)
            data_cache.Shenzhen_today_growth = basic_methods.intraday_growth(Shenzhen_index, Shenzhen_Yesterday_closing_index)
            data_cache.Shenzhen_today_growth = basic_methods.intraday_growth(Shenzhen_index,
                                                                             Shenzhen_Yesterday_closing_index)
            logger.info(f"深证指数 瞬时涨幅 ---- {round(data_cache.Shenzhen_tick_growth, 4)}%")
            logger.info(f"深证指数 当日涨幅 ==== {round(data_cache.Shenzhen_today_growth, 4)}%")
            # 调用涨幅公式计算对应的股票tick瞬时涨幅
@@ -278,9 +283,10 @@
            start = None
        #  确保不会出现除以零的报错
        if current_yesterday_volume != 0:
            if str(it_K_line[i]['bob']).find('2025-03-21')>=0:
            if str(it_K_line[i]['bob']).find('2025-03-21') >= 0:
                print(f"")
            print(f"{it_K_line[i]['bob']} 的 current_today_volume=={current_today_volume},, current_yesterday_volume=={current_yesterday_volume}")
            print(
                f"{it_K_line[i]['bob']} 的 current_today_volume=={current_today_volume},, current_yesterday_volume=={current_yesterday_volume}")
            if round(current_today_volume / current_yesterday_volume, 2) > 1.1:
                # print(f"i=={i} {it_K_line[i]['bob']} {round(current_today_volume/current_yesterday_volume,2)} 【放量】")
                if current_today_growth > 0:
@@ -374,6 +380,7 @@
        symbol_K_line_property_dict = {i: it_K_line_reversed}  # 添加 更新极限指标属性的K线 字典
        # print(f"symbol_K_line_property_dict===={symbol_K_line_property_dict}")
        all_index_k_line_property_dict.update(symbol_K_line_property_dict)
    # print(f"all_index_k_line_property_dict===={all_index_k_line_property_dict}")
    # 构造时间格式datetime转化为字符串,以便将K线属性指标转化为json格式写入本地文件
@@ -389,6 +396,7 @@
            # 对于未知类型,你可以选择保留原样、跳过或引发异常
            # 这里我们选择保留原样
            return obj
    try:
        json_data = json.dumps(convert_datetime(all_index_k_line_property_dict), ensure_ascii=False, indent=4)
        # 将转换后的JSON字符串写入文件
@@ -403,7 +411,13 @@
# 计算市场分布形态因子 函数
# ====================== 输入数据 ======================
data = {'-1': '210', '-10': '4', '-2': '134', '-3': '71', '-4': '45', '-5': '18', '-6': '15', '-7': '7', '-8': '6', '-9': '2', '0': '83', '1': '650', '10': '41', '2': '1242', '3': '1182', '4': '784', '5': '334', '6': '139', '7': '77', '8': '46', '9': '16', 'DT': 5, 'SJDT': '1', 'SJZT': '17', 'STDT': '4', 'STZT': '2', 'SZJS': 4530, 'XDJS': 517, 'ZSZDFB': '1929,247,56,435,61,3,259,29,4,44,5,1,38,9,3,239,51,10,', 'ZT': 19, 'sign': '市场人气较好', 'szln': 1723817, 'qscln': 5291241, 's_zrcs': 2413498, 'q_zrcs': 6183792, 's_zrtj': 75543024, 'q_zrtj': 169960513}
data = {'-1': '284', '-10': '2', '-2': '80', '-3': '32', '-4': '11', '-5': '6', '-6': '6', '-7': '2', '-8': '0',
        '-9': '1', '0': '101', '1': '1376', '10': '8', '2': '1760', '3': '964', '4': '285', '5': '108', '6': '49',
        '7': '17', '8': '9', '9': '2', 'DT': 3, 'SJDT': '2', 'SJZT': '15', 'STDT': '1', 'STZT': '7', 'SZJS': 4600,
        'XDJS': 427, 'ZSZDFB': '1939,238,57,446,45,8,271,19,2,42,7,1,26,19,5,217,71,12,', 'ZT': 22,
        'sign': '市场人气较好', 'szln': 1113353, 'qscln': 3725698, 's_zrcs': 2185592, 'q_zrcs': 5573160,
        's_zrtj': 58079140, 'q_zrtj': 134866542}
# ====================== 数据预处理 ======================
def preprocess_data(data):
@@ -439,7 +453,14 @@
# ====================== 核心因子计算 ======================
def calculate_factors(data):
    if data is not None:
    data = {'-1': '284', '-10': '2', '-2': '80', '-3': '32', '-4': '11', '-5': '6', '-6': '6', '-7': '2', '-8': '0',
            '-9': '1', '0': '101', '1': '1376', '10': '8', '2': '1760', '3': '964', '4': '285', '5': '108', '6': '49',
            '7': '17', '8': '9', '9': '2', 'DT': 3, 'SJDT': '2', 'SJZT': '15', 'STDT': '1', 'STZT': '7', 'SZJS': 4600,
            'XDJS': 427, 'ZSZDFB': '1939,238,57,446,45,8,271,19,2,42,7,1,26,19,5,217,71,12,', 'ZT': 22,
            'sign': '市场人气较好', 'szln': 1113353, 'qscln': 3725698, 's_zrcs': 2185592, 'q_zrcs': 5573160,
            's_zrtj': 58079140, 'q_zrtj': 134866542}
    if data is not None and len(data) > 0:
        zero = int(data.get('0'))
        rise_one = int(data.get('1'))
        rise_two = int(data.get('2'))
@@ -461,7 +482,21 @@
        fall_eight = int(data.get('-8'))
        fall_nine = int(data.get('-9'))
        fall_ten = int(data.get('-10'))
        print(type(fall_ten))
        ZT = int(data.get('ZT'))  # 跌停
        DT = int(data.get('DT'))  # 跌停
        SJZT = int(data.get('SJZT'))  # 实际跌停
        SJDT = int(data.get('SJDT'))  # 实际跌停
        STZT = int(data.get('STZT'))  # ST跌停
        STZT = int(data.get('STDT'))  # ST跌停
        SZJS = int(data.get('SZJS'))  # 上涨家数
        XDJS = int(data.get('XDJS'))  # 上涨家数
        ZSZDFB = data.get('ZSZDFB')  # 总手涨跌分布   '1929,247,56,435,61,3,259,29,4,44,5,1,38,9,3,239,51,10,'
        szln = int(data.get('szln'))  # - szln(卖总量):内盘成交量,即主动卖出量,单位为手
        qscln = int(data.get('qscln'))  # - qscln(买总量):外盘成交量,即主动买入量,单位为手
        s_zrcs = int(data.get('s_zrcs'))  # - s_zrcs(卖方昨日持仓数):卖方在昨日的持仓数量
        q_zrcs = int(data.get('q_zrcs'))  # - q_zrcs(买方昨日持仓数):买方在昨日的持仓数量
        s_zrtj = int(data.get('s_zrtj'))  # - s_zrtj(卖方资金今日统计):卖方当日的资金流出量
        q_zrtj = int(data.get('q_zrtj'))  # - q_zrtj(买方资金今日统计):买方当日的资金流入量
        """计算市场关键指标因子"""
        factors = {}
@@ -521,7 +556,7 @@
            'rise_vs_fall_ratio': round(rise_sum / fall_sum, 2) if fall_sum > 0 else 0,  # 涨跌比
            'rise_gather_area': max_key,  # 找到最大值
            'rise_scattered_area': min_key,  # 找到最小值
            'percentages': percentages,  # 各个涨幅段的股票分布比例
            'percentages': percentages,  # 全幅段的股票分布比例
            # 'rise_percentages': rise_percentages,  # 各个涨幅段的股票分布比例
            # 'fall_percentages': fall_percentages,  # 各个跌幅段的股票分布比例
            'rise_and_fall_sum': rise_and_fall_sum
@@ -529,19 +564,19 @@
        # 资金流向因子 --------------------------------------------------
        factors['capital_flow'] = {
            'buy': data['q_zrtj'],  # 买方资金净流入
            'sell': data['s_zrtj'],  # 卖方资金净流出
            'net': data['q_zrtj'] - data['s_zrtj']  # 资金净流入
            'buy': q_zrtj,  # 买方资金净流入
            'sell': s_zrtj,  # 卖方资金净流出
            'net': q_zrtj - s_zrtj  # 资金净流入
        }
        # 市场情绪因子 --------------------------------------------------
        factors['sentiment'] = {
            'zt_ratio': data['ZT'] / rise_and_fall_sum,  # 涨停占总比
            'zt_vs_dt_ratio': data['ZT'] / data['DT'],  # 涨停跌停比
            'zt_ratio': ZT / rise_and_fall_sum,  # 涨停占总比
            'zt_vs_dt_ratio': SJZT / SJDT,  # 涨停跌停比
            'rise_vs_fall_ratio': SZJS / XDJS,  # 涨跌比
            'rise_vs_all_stocks_ratio': SZJS / rise_and_fall_sum,  # 活跃股占比
            'sign': 1 if '较好' in data['sign'] else 0,  # 情绪标签量化
            'rise_vs_all_stocks_ratio': data['SZJS'] / rise_and_fall_sum,  # 活跃股占比
            'rise_vs_fall_ratio': data['SZJS'] / data['SZJS'],  # 活跃股占比
            'extreme_ratio': (data['ZT'] + data['DT']) / rise_and_fall_sum,  # 极端波动(涨停+跌停占总比)
            'extreme_ratio': (ZT + DT) / rise_and_fall_sum,  # 极端波动(涨停+跌停占总比)
        }
        return factors
@@ -607,9 +642,12 @@
                    else:
                        # 大盘综合强度分数 的 异步日志
                        # logger_Overall_market_strength_score.info(data_cache.real_time_market_strong)
                        async_log_util.info(logger_Overall_market_strength_score, f"{data_cache.real_time_market_strong}")
                        logger.info(f"日期:{date_today},情绪指标:{sentiment_indicators}分,大幅回撤:{significant_drawdown},涨停家数:{limit_up_amount},连板高度:{connecting_board_height}")
                        logger.info(f"上涨家数:{rise_numbers},下跌家数:{fall_numbers},实际涨停家数:{actual_limit_up_numbers},实际跌停家数:{actual_limit_down_numbers}")
                        async_log_util.info(logger_Overall_market_strength_score,
                                            f"{data_cache.real_time_market_strong}")
                        logger.info(
                            f"日期:{date_today},情绪指标:{sentiment_indicators}分,大幅回撤:{significant_drawdown},涨停家数:{limit_up_amount},连板高度:{connecting_board_height}")
                        logger.info(
                            f"上涨家数:{rise_numbers},下跌家数:{fall_numbers},实际涨停家数:{actual_limit_up_numbers},实际跌停家数:{actual_limit_down_numbers}")
                        logger.info(f"涨跌统计字典{data_cache.rise_and_fall_statistics_dirt}")
                    usefulMoney = data_cache.account_finance_dict[0].get('usefulMoney', 0)
@@ -644,8 +682,10 @@
                            #  ((大盘综合强度分数 + 大盘指数情绪预期分数) * 0.01) * (账户可用金额 * 0.9 * 极端低迷情绪比例 / 今日最大新增持仓票数)
                            # data_cache.today_planned_order_amount = ((data_cache.real_time_market_strong + data_cache.index_trend_expectation_score) * 0.01) * (
                            #                                                 usefulMoney * 0.9 * low_emotion_mood_ratio / Unfinished_opening_plan_number)
                            data_cache.today_planned_order_amount = (usefulMoney * 0.95 * low_emotion_mood_ratio / Unfinished_opening_plan_number)
                            logger.info(f"采用开仓策略计算方式=》今日计划下单金额:{data_cache.today_planned_order_amount},")
                            data_cache.today_planned_order_amount = (
                                        usefulMoney * 0.95 * low_emotion_mood_ratio / Unfinished_opening_plan_number)
                            logger.info(
                                f"采用开仓策略计算方式=》今日计划下单金额:{data_cache.today_planned_order_amount},")
                        else:
                            data_cache.today_planned_order_amount = data_cache.BUY_MONEY_PER_CODE
                            logger.info(f"采用GUI设置方式=》今日计划下单金额:{data_cache.today_planned_order_amount}")