市场上的投资者是有偏好的, 有时候会偏好价值股, 有时候偏好成长股, 有时候偏好大盘股, 有时候偏好小盘股。由于投资者的这种不同的交易行为,形成了市场风格, 因此在投资中,利用市场风格的变化,进行轮动投资会比一直持有的效果好很多。
小编是个很粗犷的人,所以经常被老板骂不精细,这次也是选了个很粗犷的策略:
1 )当上证指数 20 日均线在 30 日均线上方时,买入流通盘绝对数值最小的股票前五名
2 )反之,则买入国家持股绝对数值比较大的前五名 我说的绝对数值,是相对于比值计算来说的啊,因为这里用比值也不太好,各种因素太多,做人,有时候简单点更犀利。
代码如下,加空白行不到 30 行,里面我定的是每月 10 号调仓,你懂得, 10 号前老板给我发工资。
def init(context):
context.bench_mark="sha-600498"
schedule_function(change_stocks,DateRule.month(10),TimeRule.once_per_day() )
ma20=SMAFactor(20,"close")
reg_factor("ma20",ma20)
ma30=SMAFactor(30,"close")
reg_factor("ma30",ma30)
def change_stocks(context,data):
for pos in context.portfolio.positions.keys():
order_target(pos,0)
out20=factor_output("ma20","shz-000001")["ma20"]
out30=factor_output("ma30","shz-000001")["ma30"]
if out20>out30:
chase_little(context,data)
else:
for pos in context.portfolio.positions.keys():
order_target(pos,0)
follow_country(context,data)
def chase_little(context,data):
df = get_fundamentals("share_limit_sale").sort(['share_limit_sale'],ascending=False).head(5)
for stock in df.get("share_limit_sale").keys():
order_percent(stock,18)
def follow_country(context,data):
df = get_fundamentals("share_limit_sale_country").sort(['share_limit_sale_country'],ascending=False).head(5)
for stock in df.get("share_limit_sale_country").keys():
order_percent(stock,18)
我们看看回测结果,还是蛮犀利的,胜过大盘很多很多。
我相信看到这里你也会有更多想法:
1 )更多轮动思路,不一定纠结与国家持股
2 )更多精细的控制,包括加入止损止盈等等
3 )更复杂的仓位控制
如果你真的是程序员,进入镭矿 raquant量化平台亲自试试吧。