鬼才量化 发布于2025-04-15
回复 5
浏览 491
6
《基于聚宽平台的股票交易策略代码分析》
在量化交易领域,利用代码实现自动化交易策略是提升交易效率和决策科学性的重要手段。下面我们来详细分析一段基于聚宽平台的股票交易策略代码。
代码整体概述
这段代码构建了一个完整的股票交易策略系统,涵盖了选股、买卖操作以及日期处理、股票筛选等辅助功能。它借助聚宽平台提供的丰富数据接口,实现了每日定时选股和买卖操作,旨在通过一系列条件筛选出具有潜力的股票并进行交易。
代码结构与主要功能模块
1. 初始化部分
python
def initialize(context):
# 系统设置
set_option('use_real_price', True)
set_option('avoid_future_data', True)
log.set_level('system', 'error')
# 每日运行
run_daily(buy, '09:30')
run_daily(sell, '11:28')
run_daily(sell, '14:50')
在initialize函数中,对系统进行了必要的设置,如使用真实价格、避免使用未来数据等,并设置了日志级别。同时,通过run_daily函数指定了每日的选股和买卖操作时间,分别在 9:30 进行选股买入,11:28 和 14:50 进行卖出操作。
2. 选股模块
python
def buy(context):
# 基础信息
date = transform_date(context.previous_date, 'str')
current_data = get_current_data()
# 昨日涨停列表
initial_list = prepare_stock_list(date)
hl_list = get_hl_stock(initial_list, date)
if len(hl_list) != 0:
# 获取非连板涨停的股票
ccd = get_continue_count_df(hl_list, date, 10)
lb_list = list(ccd.index)
stock_list = [s for s in hl_list if s not in lb_list]
# 计算相对位置
rpd = get_relative_position_df(stock_list, date, 60)
rpd = rpd[rpd['rp'] < = 0.5]
stock_list = list(rpd.index)
# 低开
df = get_price(stock_list, end_date=date, frequency='daily', fields=['close'], count=1, panel=False, fill_paused=False, skip_paused=True).set_index('code') if len(stock_list) != 0 else pd.DataFrame()
df['open_pct'] = [current_data[s].day_open/df.loc[s, 'close'] for s in stock_list]
df = df[(0.96 < = df['open_pct']) & (df['open_pct'] < = 0.97)]
stock_list = list(df.index)
# 买入
if len(context.portfolio.positions) == 0:
for s in stock_list:
order_target_value(s, context.portfolio.total_value/len(stock_list))
print( '买入', [get_security_info(s, date).display_name, s])
print('———————————————————————————————————')
buy函数是选股的核心部分。首先获取前一日的日期和当前股票数据,然后通过一系列筛选函数得到昨日涨停的股票列表。接着,排除连板涨停的股票,筛选出相对位置较低(即股价处于近 60 日波动区间较低位置)的股票,再进一步筛选出低开(低开幅度在 3% - 4%)的股票。最后,如果当前投资组合没有持仓,则将资金平均分配到筛选出的股票上进行买入操作。
3. 卖出模块
python
def sell(context):
# 基础信息
date = transform_date(context.previous_date, 'str')
current_data = get_current_data()
# 根据时间执行不同的卖出策略
if str(context.current_dt)[-8:] == '11:28:00':
for s in list(context.portfolio.positions):
if ((context.portfolio.positions[s].closeable_amount != 0) and (current_data[s].last_price < current_data[s].high_limit) and (current_data[s].last_price > context.portfolio.positions[s].avg_cost)):
order_target_value(s, 0)
print( '止盈卖出', [get_security_info(s, date).display_name, s])
print('———————————————————————————————————')
if str(context.current_dt)[-8:] == '14:50:00':
for s in list(context.portfolio.positions):
if ((context.portfolio.positions[s].closeable_amount != 0) and (current_data[s].last_price < current_data[s].high_limit)):
order_target_value(s, 0)
print( '止损卖出', [get_security_info(s, date).display_name, s])
print('———————————————————————————————————')
sell函数实现了两种卖出策略。在 11:28 时,如果股票可卖出且当前价格低于涨停价但高于持仓成本,则进行止盈卖出;在 14:50 时,如果股票可卖出且当前价格低于涨停价,则进行止损卖出。
4. 辅助功能模块
日期处理函数:transform_date函数用于在不同日期类型(字符串、datetime对象、date对象)之间进行转换;get_shifted_date函数用于获取指定日期平移后的日期,可以是自然日或交易日。
过滤函数:包括filter_new_stock(过滤新股)、filter_st_stock(过滤 ST 股票)、filter_kcbj_stock(过滤科创板和北交所股票)、filter_paused_stock(过滤停牌股票),用于对股票列表进行筛选。
统计函数:get_hl_count_df用于计算指定股票在指定日期内的涨停数和一字涨停数;get_continue_count_df用于计算连板数;get_relative_position_df用于计算股票在一段时间内的相对位置。
策略优势与潜在风险
优势
系统性筛选:通过多维度的筛选条件,如涨停情况、相对位置、低开幅度等,能够较为全面地筛选出具有潜力的股票,提高选股的准确性。
明确的买卖策略:设置了具体的买卖时间和条件,实现了自动化交易,减少了人为因素的干扰。
风险控制:设置了止盈和止损策略,有助于控制投资风险,保护资金安全。
潜在风险
数据依赖:策略高度依赖聚宽平台提供的数据,如果数据出现错误或延迟,可能会影响策略的执行效果。
市场变化:股票市场是复杂多变的,历史数据和筛选条件可能无法完全适应未来市场的变化,导致策略失效。
交易成本:频繁的买卖操作可能会产生较高的交易成本,如佣金、印花税等,从而降低实际收益。
综上所述,这段代码实现了一个较为完整的股票交易策略,但在实际应用中需要充分考虑其优势和潜在风险,并根据市场情况进行适当的调整和优化。
评论
【JoinQuant】策略名称:追首板涨停 链接:https://www.joinquant.com/algorithm/live/liveUrlShareIndex?backtestId=3734e292b0013a8ce0a7025fe2e2249c 密码:qnzijt
2025-04-15
上面是模拟交易供大家观摩学习
2025-04-15
@鬼才量化 怎么和发布的可以克隆的不一样
2025-04-15
2025年的最近几天和你模拟的不一致
2025-04-15
@水煮鱼1982 赶上7号下跌了不太好,看长期
2025-04-15