搭建过程
每个交易者都应该形成一套自己的交易系统。
很多交易者也清楚知道,搭建自己交易系统的重要性。现实中,从0到1往往是最难跨越的一步。
授人鱼不如授人以渔,为了帮助大家跨出搭建量化系统的第一步,我们决定推出这个主题系列。
这个系列中,我们用Python从0开始一步步搭建出一套ETF量化交易系统(选择ETF标的是因为对于普通交易者来说,ETF相对于选强势股难度要小,而且没有退市风险)。大家可以跟随着我们的实现路径来一起学习,从过程中掌握方法。
掌握了方法之后,你可以换成期货系统、比特币系统、美股系统,然后在实战中不断去完善自己的系统了。
搭建一套ETF量化交易系统涉及多个模块和组件的协同工作,包括数据源模块、量化策略模块、可视化模块、数据库模块、回测评估模块、自动交易模块等等。
DAY1链接如下:15天搭建ETF量化交易系统Day1—数据源模块
DAY2链接如下:15天搭建ETF量化交易系统Day2—图形显示模块
DAY3链接如下:15天搭建ETF量化交易系统Day3—上手经典回测框架
DAY4链接如下:15天搭建ETF量化交易系统Day4—玩转海龟交易策略
DAY5链接如下:15天搭建ETF量化交易系统Day5—打造实盘量化机器人
DAY6链接如下:15天搭建ETF量化交易系统Day6—打通同花顺自动交易
DAY7链接如下:15天搭建ETF量化交易系统Day7—全自动化交易系统
DAY8链接如下:15天搭建ETF量化交易系统Day8—强化自动交易模块
DAY9链接如下:15天搭建ETF量化交易系统Day9—玩大A必学网格策略
在量化交易系统中,仓位管理是一个至关重要的环节,它涉及到如何在不同的投资标的之间分配资金,从而在控制风险的同时实现稳定的收益。
本期我们结合之前学习的网格策略思想,给ETF量化系统设计一套仓位管理机制!
仓位管理思路
常见的仓位管理策略有很多,我们借鉴以下几种策略思想做综合使用。
采用固定比例仓位:交易每个品种使用固定的资金比例。例如,交易某个品种只使用总资金的5%进行买卖操作。这样有效地控制风险,确保投资者不会因某次交易的失败而遭受过大的损失。
采用阶梯式建仓:根据市场情况,逐步增加或减少仓位,以控制风险。通过网格策略思路划分增减仓位的幅度。
单笔最大亏损比例:设定一个单笔交易的最大亏损比例,当亏损超过这个比例时,立即平仓出局。例如,设定最大亏损比例为5%,当亏损超过这个比例时,投资者应立即停止该笔交易,以控制损失。
基于以上三种思路,我们设计一个“非对称式网格仓位管理策略”
1. 固定比例仓位分配
基础设定:首先,确定每个品种使用的资金占总资金的固定比例,比如纳指科技ETF使用10%的资金量,上证50ETF使用5%的资金量。如果我们的总投资资金为100万元,那么纳指科技ETF最多使用10万元,上证50ETF最多使用5万元。
目的:确保资金分散,避免因单一交易失败而对整体投资组合造成过大影响。
2. 网格策略建仓与减仓
我们回顾下网格策略的思想:
第一步是划定网格范围。确定网格的最高点和最低点,也就是划定震荡的范围。
第二步是等分网格数量。在最高价和最低价之间等分成网格。等分的间距一般为该股的日平均振幅。
第三步是标定网格价格。在网格线上都有一个价位,当股价触及这个价位时按这个价位买卖股票。
第四步是分配操作资金。将投入的总资金除以网格数量,得到每个网格可交易的资金量。比如投入1万元,那么最高点的网格持有1万元可用资金和0元股票市值,最低点的网格持有1万元的股票市值和0元可用资金。
网格的缺陷也很明显。
如果由震荡转为趋势行情的话,会出现比较尴尬的情况:“上升趋势突破高点后无筹码”、“下跌趋势跌破低点满仓亏损”。
对此,我们围绕传统的网格策略做以下的优化:
初步建仓:当择时信号出现时建仓,以买入价格为最高网格价格线,从而往下-1%、-2%、-3%再设置3档,总共3个网格4条价格线。资金根据4条价格线进行划分。
比如投入1万元,最低点的网格持有1万元的股票市值和0元可用资金,那么最高点的网格持有0.25万元股票市值和0.75万元可用资金。
亏损后波动加减仓:当股价在买入价以下的网格中波动时,在相应的网格线上加减仓。
3.止盈与止损
止损:当股价跌破最低的网格线后止损,避免进一步损失。
止盈:如果股价往上涨,超过买入价时说明判断正确,继续保持仓位,直到出现择时卖出信号后全部卖出,或者在最高网格线上盈利后回撤3%-5%,止盈卖出,保护盈利,锁定部分利润。
代码设计
接下来,我们把这个策略用Python来实现一番,关键代码如下:
class GridTradingStrategy:
def __init__(self, total_capital, asset_allocations, grid_sizes, stop_loss_ratio, profit_taking_ratio):
"""
初始化网格交易策略
:param total_capital: 总资金
:param asset_allocations: 资产分配字典,例如 {'纳指科技ETF': 0.1, '上证50ETF': 0.05}
:param grid_sizes: 网格大小列表,例如 [-2, -4, -6] 表示从买入价往下的百分比
:param stop_loss_ratio: 止损比例
:param profit_taking_ratio: 止盈回撤比例
"""
self.total_capital = total_capital
self.asset_allocations = asset_allocations
self.grid_sizes = grid_sizes
self.stop_loss_ratio = stop_loss_ratio
self.profit_taking_ratio = profit_taking_ratio
self.positions = {} # 存储每个资产的网格持仓情况
def calculate_allocation(self, asset):
"""
计算单个资产的资金分配
"""
return self.total_capital * self.asset_allocations[asset]
def setup_grid(self, asset, buy_price):
"""
设置网格并分配资金
"""
# 代码篇幅有限 此处省略
pass
def adjust_position(self, asset, current_price):
"""
根据当前价格调整持仓
"""
for price_thd in self.positions[asset]['grids']:
pass
def check_stop_loss(self, asset, current_price):
"""
检查是否需要止损
"""
if current_price < self.positions[asset]['buy_price'] * (1 - self.stop_loss_ratio):
print(f"Stopping loss for {asset} at {current_price}")
self.positions[asset]['current_holdings'] = 0 # 假设全部卖出
def check_profit_taking(self, asset, base_price, current_price, previous_high):
"""
检查是否需要止盈
"""
if current_price > base_price and current_price < previous_high * (1 - self.profit_taking_ratio):
print(f"Taking profit for {asset} at {current_price}, previous high was {previous_high}")
# 这里可以添加实际的卖出逻辑
代码实现后,我们对代码进行功能上的测试。
首先创建仓位管理策略实例,并初始化参数:
# 使用示例 if __name__ == "__main__":
strategy = GridTradingStrategy(
total_capital=1000000,
asset_allocations={'纳指科技ETF': 0.1, '上证50ETF': 0.05},
grid_sizes=[0, -1, -2, -3],
stop_loss_ratio=0.05,
profit_taking_ratio=0.05)
计算单个资产的资金分配 :
print(strategy.calculate_allocation('纳指科技ETF'))
设置网格并分配资金,其中每个网格线价格对应仓位大小:
strategy.setup_grid('纳指科技ETF', 1.759)
print(strategy.positions)
"""
{'纳指科技ETF':
{'buy_price': 1.759,
'grids': {1.759: 25000.0,
1.74141: 50000.0,
1.72382: 75000.0,
1.70623: 100000.0},
'current_holdings': 0,
'current_price': 1.759}}
"""
根据当前价格调整持仓:
strategy.adjust_position('纳指科技ETF', 1.759)
# Buy 25000.0 to 25000.0 units of 纳指科技ETF at 1.759
strategy.adjust_position('纳指科技ETF', 1.741)
# Buy 25000.0 to 50000.0 units of 纳指科技ETF at 1.741
strategy.adjust_position('纳指科技ETF', 1.757)
# Sell 25000.0 to 25000.0 units of 纳指科技ETF at 1.75
检查是否需要止盈止损:
strategy.check_stop_loss('纳指科技ETF', 1.65)
# Stopping loss for 纳指科技ETF at 1.65
strategy.check_profit_taking('纳指科技ETF', 1.759, 1.8, 1.9)
# Taking profit for 纳指科技ETF at 1.8, previous high was 1.9
总结
每种策略都有其适用场景和局限性,投资者应根据自身的投资目标、风险承受能力和市场状况来选择合适的策略。
同时,仓位管理策略应与其他投资策略和风险管理方法相结合,以实现更好的投资效果。在实施过程中,还需根据市场变化和策略效果进行持续调整和优化。
说明
此系列为连载专栏,完整代码会上传知识星球《玩转股票量化交易》!作为会员们的学习资料。
想要加入知识星球《玩转股票量化交易》的小伙伴记得先微信call我获取福利!
非星球会员需要的话,需要单独联系我购买!
知识星球介绍点击:知识星球《玩转股票量化交易》精华内容概览