今天给大家介绍一个非常简单但是却的确有效果的一个投资策略 - 均仓策略
首先我们提一下什么叫做仓位? 仓位管理是投资里面非常重要的一个环节。如果完全持有现金的话,那仓位就是空仓;同理,如果全部买入了标的(股票、基金、期货等)那么就叫做满仓。
顾名思义,均仓的意思就是平均仓位,达到50-50的管理方法。在投资的过程中,保持50%的现金和50%的投资标的。这样可以做到进可攻退可守的地位。这种方法在股票投资里也算是一种比较简单傻瓜式的投资策略吧。
没有看见有其他的文章对这种简单的策略做一个详细介绍,下面以股票投资为例子,来写一下关于这个投资策略的简单应用。
投资步骤:
1. 初次买入:买入半仓价值的股票
2. 设定均仓条件:时间or涨跌幅度
当买入后,我们只需要等待。设定一个去均仓的条件,一般有时间或涨跌幅度两种方式。比如:我们可以考虑每一个周或者更长的时间一个月等来均仓;如果以价格涨跌程度的话,那么当涨跌超过5%,我们都可以考虑均仓一次。
3. 均仓方法:当达到第二步中的均仓条件时,需要对仓位进行管理,使得手中的现金和股票市值仍旧相等。如果股票市值大于现金则卖出;如果股票市值小于现金则买入
通俗来讲,如果当股票市值大于现金,则说明之前涨了,这个时候我们可以考虑卖出一些来兑现。相反,如果股票市值低于现金,说明之前跌了,则我们需要继续买入来降低成本。
4. 均仓金额: abs(股票市值-现金)/2
我们以两者之差的1/2为需要均仓的金额,当跌了就买入均仓金额价值的股票,如果涨了就卖出这些金额的股票。当完成之后,手中的现金和股票市值又会回归相等。
以上就是均仓策略的一个基本的思路。一般来讲,以时间为条件的均仓使用较少,就着重讲一下价格涨跌幅度均仓方法。当每次完成均仓之后,都是以最新的均仓价格为新的起始为准,重新计算应该涨跌的均仓价位。这样可以避免均仓之后,当前价格仍然远大于或小于平均标的价格的涨跌幅度。
下面是我自己尝试写的一段量化策略代码(这里以价格涨跌5%为均仓条件):
# 导入函数库
from jqdata import *
# 初始化函数,设定基准等等
def initialize(context):
# 设定沪深300作为基准
set_benchmark('000300.XSHG')
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 输出内容到日志 log.info()
log.info('初始函数开始运行且全局只运行一次')
# 过滤掉order系列API产生的比error级别低的log
# log.set_level('order', 'error')
### 股票相关设定 ###
# 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
## 运行函数(reference_security为运行时间的参考标的;传入的标的只做种类区分,因此传入'000300.XSHG'或'510300.XSHG'是一样的)
# 开盘前运行
run_daily(before_market_open, time='before_open', reference_security='000300.XSHG')
# 开盘时运行
run_daily(market_open, time='open', reference_security='000300.XSHG')
# 收盘后运行
run_daily(after_market_close, time='after_close', reference_security='000300.XSHG')
g.last_trade_price = 0
## 开盘前运行函数
def before_market_open(context):
# 输出运行时间
log.info('函数运行时间(before_market_open):'+str(context.current_dt.time()))
# 给微信发送消息(添加模拟交易,并绑定微信生效)
# send_message('美好的一天~')
# 要操作的股票:平安银行(g.为全局变量)
g.security = '000001.XSHE'
## 开盘时运行函数
def market_open(context):
log.info('函数运行时间(market_open):'+str(context.current_dt.time()))
security = g.security
last_trade_price = g.last_trade_price
cash = context.portfolio.available_cash
# 取得当前的现金
if context.portfolio.positions_value ==0:
order_value(security, context.portfolio.starting_cash/2)
g.last_trade_price = context.portfolio.positions['000001.XSHE'].price
elif abs(last_trade_price-context.portfolio.positions['000001.XSHE'].price) / last_trade_price >0.05:
print(last_trade_price)
print(context.portfolio.positions['000001.XSHE'].price)
print('-------')
print(cash)
print(context.portfolio.positions_value)
do_juncang(context)
g.last_trade_price = context.portfolio.positions['000001.XSHE'].price
print(context.portfolio.available_cash)
print(context.portfolio.positions_value)
print(context.portfolio.available_cash+context.portfolio.positions_value)
def do_juncang(context):
security = g.security
cash = context.portfolio.available_cash
order_value(security, (cash-context.portfolio.positions_value)/2)
## 收盘后运行函数
def after_market_close(context):
log.info(str('函数运行时间(after_market_close):'+str(context.current_dt.time())))
#得到当天所有成交记录
trades = get_trades()
for _trade in trades.values():
log.info('成交记录:'+str(_trade))
log.info('一天结束')
log.info('##############################################################')
然后使用聚宽平台来进行策略回测,可以看到策略收益为大概33%,跑输了沪深300 哈哈哈 大概是因为选择回测的标的股票平安银行大盘股 股价波动幅度不是很大 走势也不是太好吧
均仓策略算不上一个优秀的策略,但是也还是一个不错的方法。主要比较适用于震荡行情中,下面总结一下:
优点:1. 简单无脑傻瓜式方法,易于操作 。 2.适用于震荡行情,可以来来回回吃到波段的利润。因为据统计大盘超过半数时间都是在震荡行情的,选择波动大的股票标的优势更大。3. 可以抵抗一些行情出现变化的回撤现象,也可以克服因为市场下跌而不敢补仓的情况。关键在于,要严格按照均仓策略进行操作。
缺点:1. 如果出现单边上涨则均仓策略会导致利润偏小,过早的卖出手中的股票。2.如果出现单边下跌则会导致后续所需要的资金量要求大。3.因为无脑傻瓜式操作,不考虑其他额外的因素,可能出现紧急情况无法变通。
均仓策略有一定可以优化的空间,之后再做分享介绍。如果这篇文章对你有帮助,不妨给我点个赞或者关注,谢谢!