返回列表 发布新帖

求助!全市场选股策略

1791 3
发表于 2025-1-15 19:42:54 | 显示全部楼层 阅读模式

想要在QMT上实现小市值策略回测,但是不知道为什么执行起来策略没有进行买入,问了AI说是订阅股票太多了,不知道怎么解决,以下是我得代码:

# coding: gbk

def init(ContextInfo):
    """
    初始化函数,仅在策略开始时调用一次
    """
    # 订阅沪深A股全市场股票池
    stock_list = ContextInfo.get_stock_list_in_sector("沪深A股")  # 获取沪深A股股票池
    if not stock_list:
        print("股票池为空,请检查是否正确设置市场或板块")
        return

    ContextInfo.set_universe(stock_list[:100])  # 限制订阅前100只股票,避免性能问题
    print(f"订阅的股票池: {stock_list[:100]}")

    ContextInfo.accountID = '86861888'  # 替换为实际资金账号
    ContextInfo.selected_stocks = []  # 初始化选中的股票列表
    print("策略初始化完成")


def handlebar(ContextInfo):
    """
    每根K线结束时执行一次
    """
    # 获取当前市场数据
    market_data = ContextInfo.get_market_data_ex(["lastPrice", "circulatingMarketValue"], subscribe=False)
    if not market_data:
        print("市场数据为空,请检查订阅的股票池或行情数据源是否正常")
        return

    print(f"获取的市场数据: {market_data[:10]}")  # 打印部分数据,检查字段内容

    # 筛选价格大于2元的股票
    filtered_stocks = [stock for stock in market_data if stock.get("lastPrice", 0) > 2]
    if not filtered_stocks:
        print("未筛选到符合条件的股票")
        return

    print(f"筛选价格大于2元的股票: {filtered_stocks[:10]}")  # 打印部分筛选结果

    # 按流通市值从小到大排序
    sorted_stocks = sorted(filtered_stocks, key=lambda x: x.get("circulatingMarketValue", float('inf')))
    top_50_stocks = [stock["symbol"] for stock in sorted_stocks[:50]]
    print(f"筛选出的股票: {top_50_stocks}")

    # 获取当前持仓
    current_positions = get_trade_detail_data(ContextInfo.accountID, "STOCK", "POSITION")
    holding_dict = {obj.m_strInstrumentID + "." + obj.m_strExchangeID: obj.m_nCanUseVolume for obj in current_positions}
    print(f"当前持仓股票: {list(holding_dict.keys())}")

    # 卖出不再符合条件的股票
    for stock in holding_dict.keys():
        if stock not in top_50_stocks:
            ContextInfo.passorder(
                opType=24,  # 卖出
                orderType=1101,  # 按市价卖出
                accountid=ContextInfo.accountID,
                orderCode=stock,
                prType=5,  # 市价
                price=0,
                volume=holding_dict[stock],
                strategyName="小市值轮动策略",
                quickTrade=1,
                userOrderId="SELL_OUT"
            )
            print(f"卖出股票: {stock},数量: {holding_dict[stock]}")

    # 买入符合条件的新股票
    for stock in top_50_stocks:
        if stock not in holding_dict.keys():
            ContextInfo.passorder(
                opType=23,  # 买入
                orderType=1101,  # 按市价买入
                accountid=ContextInfo.accountID,
                orderCode=stock,
                prType=5,  # 市价
                price=0,
                volume=100,  # 固定买入100股
                strategyName="小市值轮动策略",
                quickTrade=1,
                userOrderId="BUY_IN"
            )
            print(f"尝试买入股票: {stock},数量: 100")

    print("今日操作完成")

评论3

~量子~
发表于 2025-2-22 11:58:10 | 显示全部楼层
这因子也太少了吧, 就看个价格吗?
*******7002_BImqx
发表于 2025-3-9 19:22:48 | 显示全部楼层
mark下,那把数量改少了能跑通吗?
*******7002_BImqx
发表于 2025-3-9 19:23:21 | 显示全部楼层
~量子~ 发表于 2025-2-22 11:58
这因子也太少了吧, 就看个价格吗?

他这个应该是测试吧?肯定还有其他一些过滤条件

回复

您需要登录后才可以回帖 登录 | 立即注册

客服专线

400-080-8112

用思考的速度交易,用真诚的态度合作,我们是认真的!
  • 关注公众号
  • 添加微信客服
Copyright © 2001-2025 迅投QMT社区 版权所有 All Rights Reserved. 蜀ICP备19002686号-2
关灯 快速发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表