3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
get_trend_data 详解在 ptrade 平台中,get_trend_data 接口专门用于获取集中竞价期间(9:15 - 9:25)的代码数据。通过分析集合竞价期间的成交量(business_amount)、成交额(business_balance)和最新价格(hq_px),可以有效识别主力资金的早盘试盘与抢筹异动。
get_trend_data(date=None, stocks=None, market=None)
date:查询日期,格式为 'YYYYmmdd'(如 '20230308')。不传时默认返回当日数据。stocks:股票代码,支持单只股票(str)或股票列表(list[str])。market:市场代码,如 "XSHG" 或 "XSHE"。注意:stocks 和 market 不能同时入参。返回一个 dict 字典,Key 为股票代码,Value 包含以下字段:
time_stamp:时间戳 (int)hq_px:价格 (float)wavg_px:加权价格 (float)business_amount:总成交量 (int)business_balance:总成交额 (int)amount:持仓量 (int)before_trading_start 阶段筛选出目标监控股票池(如昨日热门股或特定板块)。9:25 - 9:30 之间(例如 9:26),通过 run_daily 定时触发任务,调用 get_trend_data 获取竞价截止时的最终撮合数据。9:30 开盘瞬间以限价单或市价单快速跟进。以下是一个完整的 ptrade 集合竞价异动狙击策略示例:
# -*- coding: utf-8 -*-
import datetime
def initialize(context):
# 设置监控的股票池(以恒生电子等为例)
g.security_list = ['600570.SS', '000001.SZ']
set_universe(g.security_list)
# 每天 9:26 分运行集合竞价异动分析函数(此时 9:25 竞价已结束,数据已定格)
run_daily(context, aggregate_auction_analysis, time='09:26')
def before_trading_start(context, data):
# 每日初始化信号标识
g.target_stocks = []
def aggregate_auction_analysis(context):
today_str = context.blotter.current_dt.strftime('%Y%m%d')
log.info("开始分析 %s 集合竞价异动数据..." % today_str)
# 1. 获取集合竞价数据
try:
trend_data = get_trend_data(date=today_str, stocks=g.security_list)
except Exception as e:
log.error("获取集合竞价数据失败: %s" % e)
return
if not trend_data:
log.warning("今日无集合竞价数据")
return
for stock in g.security_list:
if stock not in trend_data:
continue
stock_trend = trend_data[stock]
if not stock_trend:
continue
# 获取竞价截止时的最新价格与成交量
auction_price = stock_trend.get('hq_px')
auction_volume = stock_trend.get('business_amount')
auction_balance = stock_trend.get('business_balance')
# 2. 获取昨日收盘价及昨日成交量用于对比
hist = get_history(1, '1d', ['close', 'volume', 'preclose'], security_list=stock, include=False)
if hist is None or hist.empty:
continue
# 兼容 python3.11 与 python3.5 的 get_history 返回格式
if 'code' in hist.columns:
last_close = hist.query('code == @stock')['close'].values[0]
last_volume = hist.query('code == @stock')['volume'].values[0]
else:
last_close = hist['close'].values[0]
last_volume = hist['volume'].values[0]
# 3. 计算异动指标
# 价格涨幅
price_change_rate = (auction_price - last_close) / last_close * 100
# 竞价成交量占昨日总成交量的比例
volume_ratio = (auction_volume / last_volume) * 100 if last_volume > 0 else 0
log.info("股票: %s, 竞价价格: %.2f (涨幅: %.2f%%), 竞价成交量: %d (占比昨日: %.2f%%)" %
(stock, auction_price, price_change_rate, auction_volume, volume_ratio))
# 4. 异动筛选条件:高开 1.5% ~ 5% 之间,且竞价成交量占比昨日超过 1%
if 1.5 <= price_change_rate <= 5.0 and volume_ratio >= 1.0:
log.info(">>> 发现异动狙击目标: %s" % stock)
g.target_stocks.append(stock)
def handle_data(context, data):
# 9:30 开盘后,对筛选出的异动目标进行买入委托
current_time = context.blotter.current_dt.strftime('%H:%M')
if current_time == '09:30' and g.target_stocks:
for stock in g.target_stocks:
# 检查持仓,避免重复买入
if get_position(stock).amount == 0:
cash = context.portfolio.cash
# 均分资金买入异动股
invest_value = cash / len(g.target_stocks)
if invest_value > 5000: # 最小起买资金限制
order_value(stock, invest_value)
log.info("早盘狙击买入: %s, 金额: %.2f" % (stock, invest_value))
# 清空今日目标,防止重复触发
g.target_stocks = []
9:25 结束并定格。因此,建议将 run_daily 的触发时间设在 9:26 至 9:29 之间。如果在 9:25 之前调用,获取的数据可能不完整。get_trend_data 可能返回空值或不包含该股票。策略中需做好 try...except 异常保护与 None 值过滤。order)抢筹,需注意科创板、创业板的价格笼子限制(2% 价格限制),可考虑使用市价保护限价单(order_market)以提高撮合效率。