| | |
| | | # 上证指数数据 |
| | | 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瞬时涨幅 |
| | |
| | | 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: |
| | |
| | | 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格式写入本地文件 |
| | |
| | | # 对于未知类型,你可以选择保留原样、跳过或引发异常 |
| | | # 这里我们选择保留原样 |
| | | return obj |
| | | |
| | | try: |
| | | json_data = json.dumps(convert_datetime(all_index_k_line_property_dict), ensure_ascii=False, indent=4) |
| | | # 将转换后的JSON字符串写入文件 |
| | |
| | | |
| | | # 计算市场分布形态因子 函数 |
| | | # ====================== 输入数据 ====================== |
| | | 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): |
| | |
| | | |
| | | # ====================== 核心因子计算 ====================== |
| | | 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')) |
| | |
| | | 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 = {} |
| | |
| | | '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 |
| | |
| | | |
| | | # 资金流向因子 -------------------------------------------------- |
| | | 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 |
| | | |
| | |
| | | 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) |
| | |
| | | # ((大盘综合强度分数 + 大盘指数情绪预期分数) * 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}") |