15天搭建ETF量化交易系统Day10—借用网格思想做仓位管理

abc4823924b912064faf0272a624de05.png

搭建过程

b4dd5fec4f7508462bee94f5595dc49d.png

每个交易者都应该形成一套自己的交易系统。

很多交易者也清楚知道,搭建自己交易系统的重要性。现实中,从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量化系统设计一套仓位管理机制!

b58ec84fdfe8f38057778c587086a3aa.png

仓位管理思路

461b3b478afa8523c7fef382127f3910.png

常见的仓位管理策略有很多,我们借鉴以下几种策略思想做综合使用。

  • 采用固定比例仓位:交易每个品种使用固定的资金比例。例如,交易某个品种只使用总资金的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%,止盈卖出,保护盈利,锁定部分利润。

14ad0a196bfad6e7203d28abc81e292a.png

代码设计

b5dbe70089c2a25e9e18e5162f994be1.png

接下来,我们把这个策略用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

fbeb1e9248bccb163c36a09e2246d8b6.png

总结

5e62faca913e2453e81073cf6dc10251.png

每种策略都有其适用场景和局限性,投资者应根据自身的投资目标、风险承受能力和市场状况来选择合适的策略。

同时,仓位管理策略应与其他投资策略和风险管理方法相结合,以实现更好的投资效果。在实施过程中,还需根据市场变化和策略效果进行持续调整和优化。

说明

此系列为连载专栏,完整代码会上传知识星球《玩转股票量化交易》!作为会员们的学习资料。

想要加入知识星球《玩转股票量化交易》的小伙伴记得先微信call我获取福利!

非星球会员需要的话,需要单独联系我购买!

知识星球介绍点击:知识星球《玩转股票量化交易》精华内容概览

c75847f5b7e038aff9d54f6b55bdbb40.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值