金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 39|回复: 5

大盘市场情绪

[复制链接]

4659

主题

4763

帖子

4788

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-10-11 09:33 | 显示全部楼层 |阅读模式
帮我修改一下这个大盘情绪的定义
# 金字塔(Python)版本的大盘情绪判定
import numpy as np
import pandas as pd

def check_market_sentiment_pyramid():
    """
    金字塔版本的大盘情绪判定
    基于上证指数000001.SH的TYP指标
    条件:TYP[-1]>TYP[-2] and TYP[-1]>TYPMA1[-1] and TYPMA1[-1]>TYPMA2[-1]
    """
    try:
        # 获取上证指数数据
        market_index = '000001'

        # 金字塔获取数据方式
        # 获取40个交易日的收盘价、最高价、最低价
        count = 40
        close_data = history_bars(market_index, count, '1d', ['close'])
        high_data = history_bars(market_index, count, '1d', ['high'])
        low_data = history_bars(market_index, count, '1d', ['low'])

        if len(close_data) < 36:
            print("数据不足,无法计算TYP指标")
            return True

        # 计算TYP指标
        typ, typma1, typma2 = get_typ_indicators_pyramid(close_data, high_data, low_data, 5, 34)

        # 检查条件
        if len(typ) >= 2 and len(typma1) >= 1 and len(typma2) >= 1:
            condition1 = typ[-1] > typ[-2]  # TYP[-1] > TYP[-2]
            condition2 = typ[-1] > typma1[-1]  # TYP[-1] > TYPMA1[-1]
            condition3 = typma1[-1] > typma2[-1]  # TYPMA1[-1] > TYPMA2[-1]

            market_ok = condition1 and condition2 and condition3

            # 打印调试信息
            print(f"大盘情绪判定: TYP[-1]={typ[-1]:.2f}, TYP[-2]={typ[-2]:.2f}, TYPMA1[-1]={typma1[-1]:.2f}, TYPMA2[-1]={typma2[-1]:.2f}")
            print(f"条件1(TYP上升): {condition1}, 条件2(突破短期): {condition2}, 条件3(多头排列): {condition3}")
            print(f"综合判定: {'情绪良好,允许开仓' if market_ok else '情绪不佳,限制开仓'}")

            return market_ok
        else:
            print("TYP指标计算数据不足")
            return True

    except Exception as e:
        print(f"大盘情绪判定出错: {e}")
        return True

def get_typ_indicators_pyramid(close_list, high_list, low_list, n1, n2):
    """
    金字塔版本的计算TYP相关指标
    TYP:(CLOSE+HIGH+LOW)/3;
    TYPMA1:EMA(TYP,5);   # 短期EMA周期固定为5
    TYPMA2:EMA(TYP,34);  # 长期EMA周期固定为34
    """
    # 计算TYP典型价格
    typ = (close_list + high_list + low_list) / 3

    # 计算TYPMA1和TYPMA2 (EMA)
    typma1 = get_ema_pyramid(typ, n1)
    typma2 = get_ema_pyramid(typ, n2)

    return typ, typma1, typma2

def get_ema_pyramid(data, period):
    """
    金字塔版本的EMA计算
    """
    # 使用pandas计算EMA
    series = pd.Series(data)
    ema = series.ewm(span=period, adjust=False).mean()
    return ema.values

# 在金字塔策略中的使用示例
def main_strategy(context):
    """
    主策略函数示例
    """
    # 检查大盘情绪
    sentiment_ok = check_market_sentiment_pyramid()

    if sentiment_ok:
        # 大盘情绪良好,执行正常交易逻辑
        print("大盘情绪良好,执行交易")
        # 这里添加你的买入逻辑
        # buy_stocks(context)
    else:
        # 大盘情绪不佳,限制交易或只执行卖出
        print("大盘情绪不佳,限制开仓")
        # 这里可以只执行卖出逻辑或空仓等待
        # sell_stocks_only(context)

# 简化版本(如果不需要详细打印信息)
def check_market_sentiment_simple():
    """
    简化版本的大盘情绪判定
    """
    try:
        market_index = '000001'
        count = 40

        close_data = history_bars(market_index, count, '1d', ['close'])
        high_data = history_bars(market_index, count, '1d', ['high'])
        low_data = history_bars(market_index, count, '1d', ['low'])

        if len(close_data) < 36:
            return True

        # 计算TYP指标
        typ = (close_data + high_data + low_data) / 3

        # 计算EMA
        typma1 = pd.Series(typ).ewm(span=5, adjust=False).mean().values
        typma2 = pd.Series(typ).ewm(span=34, adjust=False).mean().values

        # 检查条件
        if len(typ) >= 2 and len(typma1) >= 1 and len(typma2) >= 1:
            return typ[-1] > typ[-2] and typ[-1] > typma1[-1] and typma1[-1] > typma2[-1]
        else:
            return True

    except Exception as e:
        print(f"大盘情绪判定出错: {e}")
        return True

# 在金字塔中定时调用示例
def on_bar(context):
    """
    K线回调函数
    """
    # 只在开盘后一段时间内检查(避免开盘波动)
    current_time = context.current_dt.strftime('%H%M%S')
    if '093000' <= current_time <= '150000':
        sentiment_ok = check_market_sentiment_pyramid()
        context.market_sentiment = sentiment_ok  # 保存状态供其他函数使用

金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2025-10-11 09:38 | 显示全部楼层
py相关代码主要提供接口方面的维护,通常不提供涉及到具体代码思路的修改。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

1

主题

13

帖子

13

积分

Rank: 1

等级: 新手上路

注册:
2025-4-7
曾用名:
发表于 2025-10-11 10:00 来自手机 | 显示全部楼层
那我写一个大盘情绪的定义
回复

使用道具 举报

1

主题

13

帖子

13

积分

Rank: 1

等级: 新手上路

注册:
2025-4-7
曾用名:
发表于 2025-10-11 10:03 来自手机 | 显示全部楼层
这个是我的思路# 金字塔(Pyramid)版本 - 简化大盘情绪判断 import pandas as np from PythonLib import *  # 可调节的情绪阈值 - 只需修改这个值 MARKET_SENTIMENT_THRESHOLD = 50  # 默认50%,可根据需要调整  # 定义参考ETF股票池 def GetReferStock():     """获取参考股票池(主要由ETF基金组成)"""     refer_stocks = [         '510050.SH', '159919.SZ', '510300.SH', '159901.SZ',  # 沪深300         '159915.SZ', '159922.SZ', '510500.SH',               # 创业板、中证500         '512480.SH', '512170.SH', '512880.SH', '512200.SH',  # 芯片、医疗、证券、地产         '159995.SZ', '512660.SH', '515790.SH',               # 半导体、军工、光伏         '159869.SZ', '159819.SZ', '512100.SH',               # 医疗、人工智能、证券         '512800.SH', '159852.SZ', '159840.SZ',               # 银行、芯片、新能车         '159766.SZ', '159521.SZ', '159527.SZ',               # 消费、双创、科创         '159531.SZ', '515230.SZ', '516110.SZ',               # 创新药、软件、汽车         '561120.SH', '159553.SZ', '159768.SZ',               # 消费电子、新材料、养殖         '159980.SZ', '159907.SZ', '159825.SZ',               # 有色、深100、农业         '561800.SH', '159619.SZ', '588080.SH',               # 化工、港股通、科创50         '588000.SH'                                          # 科创50     ]     return refer_stocks  def IsMarketSentimentGood():     """判断大盘情绪是否良好"""     refer_stocks = GetReferStock()     rise_count = 0     total_valid = 0          for stock in refer_stocks:         try:             # 金字塔获取股票数据             dyn_data = get_dyn_data(stock, ['最新价', '昨收'])             if dyn_data and len(dyn_data) > 0:                 current_price = dyn_data['最新价'][0]                 prev_close = dyn_data['昨收'][0]                                  if current_price > 0 and prev_close > 0:                     ratio = (current_price / prev_close - 1) * 100                     if ratio > 0:                         rise_count += 1                     total_valid += 1                              except Exception as e:             print(f"获取{stock}数据失败: {e}")             continue          # 计算情绪比例     sentiment_ratio = 0     if total_valid > 0:         sentiment_ratio = round(rise_count / total_valid * 100, 2)          # 判断是否达到阈值     is_good = sentiment_ratio >= MARKET_SENTIMENT_THRESHOLD          # 输出结果     print(f"大盘情绪检测: {sentiment_ratio}% (阈值: {MARKET_SENTIMENT_THRESHOLD}%) - {'良好' if is_good else '不佳'}")          return is_good, sentiment_ratio  # 使用示例 if __name__ == "__main__":     # 判断大盘情绪     sentiment_good, ratio = IsMarketSentimentGood()          if sentiment_good:         print(" 大盘情绪良好,可以执行选股策略")         # 这里放置你的选股逻辑     else:         print(" 大盘情绪不佳,暂停选股操作")
回复

使用道具 举报

1

主题

13

帖子

13

积分

Rank: 1

等级: 新手上路

注册:
2025-4-7
曾用名:
发表于 2025-10-11 10:36 来自手机 | 显示全部楼层
帮我写一个大盘情绪的定义
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2025-10-11 11:15 | 显示全部楼层
抱歉,不提供py策略编写的服务。py相关的部分,论坛只提供基本接口的问题反馈和修复。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 微信登录

本版积分规则

手机版|小黑屋|上海金之塔信息技术有限公司 ( 沪ICP备13035422号 )

GMT+8, 2025-10-11 18:52 , Processed in 0.122600 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表