算法炼金师 发布于2025-04-27
回复 0
浏览 483
1
最近一直在研究量化交易,把这段时间写的一个交易策略代码分享出来,和大家聊聊怎么用代码实现股票投资自动化。这可是实打实自己踩过坑、反复调试的经验,希望能给对量化交易感兴趣的朋友一些启发。
在initialize函数里,我做的第一件事就是设定交易基准,选了沪深 300 指数作为参考。滑点和手续费这些细节也不能马虎,毕竟交易成本会直接影响最终收益。还记得刚开始测试策略时,没考虑滑点,结果实盘交易时才发现收益和回测差距不小,吃了个哑巴亏。
另外,设置选股、买入和卖出的频率特别关键。我试过不同的频率,频率太高容易频繁交易增加成本,频率太低又可能错过机会,摸索了好久才找到一个相对合适的参数。
选股策略:万里挑一的筛选过程
选股是整个策略的核心,我在代码里设计了一套层层筛选的流程。
python
def check_stocks(context):
if g.check_stocks_days%g.check_stocks_refresh_rate != 0:
# 计数器加一
g.check_stocks_days += 1
return
# 股票池赋值
g.check_out_lists = get_security_universe(context, g.security_universe_index, g.security_universe_user_securities)
# 行业过滤
g.check_out_lists = industry_filter(context, g.check_out_lists, g.industry_list)
# 概念过滤
g.check_out_lists = concept_filter(context, g.check_out_lists, g.concept_list)
# 过滤ST股票
g.check_out_lists = st_filter(context, g.check_out_lists)
# 过滤退市股票
g.check_out_lists = delisted_filter(context, g.check_out_lists)
# 财务筛选
g.check_out_lists = financial_statements_filter(context, g.check_out_lists)
# 行情筛选
g.check_out_lists = situation_filter(context, g.check_out_lists)
# 技术指标筛选
g.check_out_lists = technical_indicators_filter(context, g.check_out_lists)
# 形态指标筛选函数
g.check_out_lists = pattern_recognition_filter(context, g.check_out_lists)
# 其他筛选函数
g.check_out_lists = other_func_filter(context, g.check_out_lists)
# 排序
input_dict = get_check_stocks_sort_input_dict()
g.check_out_lists = check_stocks_sort(context,g.check_out_lists,input_dict,g.check_out_lists_ascending)
# 计数器归一
g.check_stocks_days = 1
return
最开始先确定股票池范围,接着用行业、概念、ST、退市这些基础条件筛掉明显不合适的股票。财务指标筛选是我特别重视的环节,比如净利润同比增长、市值、市盈率、净资产收益率这些数据,都是判断股票基本面的重要依据。有一次,我因为忽略了市盈率指标,选了一只高估值股票,结果行情一波动就被套住了,之后就格外谨慎。
交易执行:买卖时机的精准把控
python
def trade(context):
# 初始化买入列表
buy_lists = []
# 买入股票筛选
if g.buy_trade_days%g.buy_refresh_rate == 0:
# 获取 buy_lists 列表
buy_lists = g.check_out_lists
# 过滤ST股票
buy_lists = st_filter(context, buy_lists)
# 过滤停牌股票
buy_lists = paused_filter(context, buy_lists)
# 过滤退市股票
buy_lists = delisted_filter(context, buy_lists)
# 过滤涨停股票
buy_lists = high_limit_filter(context, buy_lists)
### _入场函数筛选-开始 ###
### _入场函数筛选-结束 ###
# 卖出操作
if g.sell_trade_days%g.sell_refresh_rate != 0:
# 计数器加一
g.sell_trade_days += 1
else:
# 卖出股票
sell(context, buy_lists)
# 计数器归一
g.sell_trade_days = 1
# 买入操作
if g.buy_trade_days%g.buy_refresh_rate != 0:
# 计数器加一
g.buy_trade_days += 1
else:
# 卖出股票
buy(context, buy_lists)
# 计数器归一
g.buy_trade_days = 1
trade函数就是具体执行买卖操作的地方。买入前还要再过滤一次,把停牌、涨停的股票排除掉。资金分配也有讲究,我设置了最大持仓数量,避免过度集中风险。卖出操作则主要考虑止盈止损,之前有一次没及时止损,眼看着盈利变亏损,所以现在对卖出条件设置得特别严格。
虽然现在这个risk_management函数还没写具体内容,但风险管理绝对是量化交易里的重中之重。我打算后续加上止损止盈规则、仓位控制这些功能,毕竟市场波动大,不做好风控很容易一夜回到解放前。
经验分享:量化交易的 “避坑指南”
刚开始写这个策略时,我也遇到过不少问题。比如回测结果很好,但实盘效果差强人意,后来发现是忽略了交易成本和滑点。还有选股指标的设置,太复杂了容易过拟合,太简单又选不出好股票,需要反复测试和调整。
建议刚接触量化交易的朋友,先从简单的策略入手,逐步熟悉平台和代码逻辑。多做回测,对比不同参数下的结果,但也要记住回测和实盘有差异,实盘交易时一定要控制好仓位,小步快跑。