| | |
| | | |
| | | |
| | | # ====================== 数据预处理 ====================== |
| | | def preprocess_data(data): |
| | | """ |
| | | 预处理原始数据: |
| | | 1. 转换所有数值字段为整数 |
| | | 2. 解析涨跌分布(ZSZDFB)为整数列表 |
| | | 3. 分离涨跌幅分布数据 |
| | | """ |
| | | processed = {} |
| | | |
| | | # 通用字段类型转换 |
| | | for key, value in data.items(): |
| | | if isinstance(value, str) and value.isdigit(): # 处理字符串数字 |
| | | processed[key] = int(value) |
| | | elif key == 'ZSZDFB': # 特殊处理涨跌分布 |
| | | # 过滤空值并转换为整数列表 |
| | | processed[key] = [int(x) for x in value.strip(',').split(',')] |
| | | else: |
| | | processed[key] = value # 保留原始类型 |
| | | |
| | | # 分离涨跌幅分布数据(示例划分,具体区间需确认) |
| | | # 假设ZSZDFB对应从-10%到10%的18个区间分布(根据数据长度推测) |
| | | processed['price_distribution'] = { |
| | | 'bins': list(range(-10, 11)), # 生成-10到10的整数区间标识 |
| | | 'counts': processed['ZSZDFB'] |
| | | } |
| | | return processed |
| | | # def preprocess_data(data): |
| | | # """ |
| | | # 预处理原始数据: |
| | | # 1. 转换所有数值字段为整数 |
| | | # 2. 解析涨跌分布(ZSZDFB)为整数列表 |
| | | # 3. 分离涨跌幅分布数据 |
| | | # """ |
| | | # processed = {} |
| | | # |
| | | # # 通用字段类型转换 |
| | | # for key, value in data.items(): |
| | | # if isinstance(value, str) and value.isdigit(): # 处理字符串数字 |
| | | # processed[key] = int(value) |
| | | # elif key == 'ZSZDFB': # 特殊处理涨跌分布 |
| | | # # 过滤空值并转换为整数列表 |
| | | # processed[key] = [int(x) for x in value.strip(',').split(',')] |
| | | # else: |
| | | # processed[key] = value # 保留原始类型 |
| | | # |
| | | # # 分离涨跌幅分布数据(示例划分,具体区间需确认) |
| | | # # 假设ZSZDFB对应从-10%到10%的18个区间分布(根据数据长度推测) |
| | | # processed['price_distribution'] = { |
| | | # 'bins': list(range(-10, 11)), # 生成-10到10的整数区间标识 |
| | | # 'counts': processed['ZSZDFB'] |
| | | # } |
| | | # return processed |
| | | |
| | | |
| | | # data = preprocess_data(raw_data) |
| | |
| | | connecting_board_height = data_cache.real_time_market_sentiment_dirt.get('lbgd', None) # 连板高度 |
| | | # 获取市场情绪-涨跌统计 |
| | | data_cache.rise_and_fall_statistics_dirt = kpl_api.getMarketFelling() # 涨跌统计字典 |
| | | # 涨跌统计因子计算 |
| | | factors = calculate_factors(data_cache.rise_and_fall_statistics_dirt) |
| | | # 涨跌统计生成信号 |
| | | signals = generate_signals(factors) |
| | | limit_up_numbers = data_cache.rise_and_fall_statistics_dirt.get('ZT', None) # 涨停家数 |
| | | actual_limit_up_numbers = data_cache.rise_and_fall_statistics_dirt.get('SJZT', None) # 实际涨停家数 |
| | | ST_limit_up_numbers = data_cache.rise_and_fall_statistics_dirt.get('STZT', None) # ST涨停家数 |
| | |
| | | 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}") |
| | | logger.info(f"涨跌统计因子的计算={factors}") |
| | | |
| | | # 低迷情绪比例 |
| | | low_emotion_mood_ratio = 1 |
| | | # 理想交易行情分数【评估当前行情是否有利于低吸策略取得更高抓板率的分数(是否是理想的交易行情)】 |
| | | ideal_trading_market_score = 1 |
| | | # 33分是个两级分化阶梯不好,目前不好拿捏,暂时不用 |
| | | # if data_cache.real_time_market_strong <= 33: |
| | | if data_cache.real_time_market_strong < 30: |
| | | # 如果大盘综合强度分数小于30,将低迷情绪分数比例设置为0.01,可用资金缩小一百倍 |
| | | low_emotion_mood_ratio = 0.01 |
| | | ideal_trading_market_score = 0.01 |
| | | if data_cache.real_time_market_strong <= 10: |
| | | low_emotion_mood_ratio = 0 |
| | | logger.info(f"极端低迷情绪比例===={low_emotion_mood_ratio * 100}%") |
| | | ideal_trading_market_score = 0 |
| | | logger.info(f"理想交易行情分数===={ideal_trading_market_score * 100}%") |
| | | |
| | | data_cache.index_trend_expectation_score = index_trend_expectation() |
| | | logger.info(f"大盘指数情绪预期分数==={data_cache.index_trend_expectation_score}分") |
| | |
| | | |
| | | # 获取计算今天新增的持仓数量 |
| | | addition_position_number = len(data_cache.addition_position_symbols_set) |
| | | # 定义一个今日的剩余新增持仓数量的变量 |
| | | # 定义一个今日的剩余新增持仓数量的变量 【目前策略默认一日三仓 所以设置常量3】 |
| | | Unfinished_opening_plan_number = 3 - addition_position_number |
| | | logger.info(f"今日的剩余新增持仓数量==={Unfinished_opening_plan_number}") |
| | | usefulMoney = data_cache.account_finance_dict[0].get('usefulMoney', 0) |
| | | logger.info(f"账户可用资金==={usefulMoney}元") |
| | | if Unfinished_opening_plan_number != 0: |
| | | # 如果GUI看盘上没有手动设置具体的下单金额,就按照评分策略的金额下单,否则就按照GUI设置的金额下单。 |
| | | if data_cache.BUY_MONEY_PER_CODE < 0: |
| | | # 根据账户可用金额 计算今日计划下单金额 |
| | | # 账户可用金额 默认乘以0.9,永远留一点钱,一方面也冗余一些计算误差 |
| | | # ((大盘综合强度分数 + 大盘指数情绪预期分数) * 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},") |
| | | else: |
| | | # 如果一日三仓的计划还未完成 且 未设置过开仓计划金额 |
| | | if Unfinished_opening_plan_number != 0 and data_cache.today_planned_order_amount <= 0: |
| | | # 如果GUI看盘手动设置了具体的下单金额【ata_cache.BUY_MONEY_PER_CODE 中默认值为-1,只有当GUI看盘手动设置了并提交才会>=0】,就按照GUI设置的金额下单。否则就按照评分策略的金额下单, |
| | | if data_cache.BUY_MONEY_PER_CODE >= 0: |
| | | data_cache.today_planned_order_amount = data_cache.BUY_MONEY_PER_CODE |
| | | logger.info(f"采用GUI设置方式=》今日计划下单金额:{data_cache.today_planned_order_amount}") |
| | | |
| | | else: |
| | | # 如果今日还没有一个新增仓位,就不停计算更新计划金额 |
| | | if addition_position_number <= 0: |
| | | # 根据账户可用金额 计算今日计划下单金额 |
| | | # 账户可用金额 默认乘以0.95,永远留一点钱,一方面也冗余一些计算误差 |
| | | # ((大盘综合强度分数 + 大盘指数情绪预期分数) * 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 * ideal_trading_market_score / Unfinished_opening_plan_number |
| | | logger.info(f"采用开仓策略计算方式=》今日计划下单金额:{data_cache.today_planned_order_amount}") |
| | | except Exception as error: |
| | | logger_debug.exception(error) |
| | | logger.error(f"实时设置计划持仓数量 函数报错: {error}") |