我是靠谱客的博主 腼腆小虾米,这篇文章主要介绍量化白马股轮动策略,现在分享给大家,希望可以做个参考。

股票数据的获取见均线策略第一篇,回测的数据分析见均线策略第三篇。

不同的策略在于Strategy类中的买入卖出的判断。

首先什么是白马股,白马股,是指长期绩优、回报率高并具有较高投资价值的股票。因其有关的信息已经公开,业绩较为明朗,同时又兼有业绩优良、高成长、低风险的特点,因而具备较高的投资价值,往往为投资者所看好。以上来自百度百科。

关注过公众号招财大牛猫的朋友一定对白马股比较熟悉,由于ipo的提速,监管层对概念股的打压,蓝筹绩优股从2017年至今都表现较好,白马股更是涨幅感人。该策略是从大牛猫推荐的50只白马股作为选股池,每15个交易日调仓一次,调整为这期间涨幅最大的5只,其实也是一种趋势策略,认为趋势不会轻易反转,强者恒强的思路。

找不到股社区的原贴了,50只股票的list如下:

code_list = ['600519', '000858', '002304', '002415', '002236', '600597', '603288',
                 '000895', '601318', '601336', '000651', '000333',
                 '600036', '600104', '600816', '600674', '600690',
                 '002081', '600886', '000625', '600887','000423', '600276',
                 '000963', '600535', '600271', '002294', '300072', '000538', '600066', '000002',
                 '002271', '600406', '600900', '002027', '000063', '002594', '601238', '600518',
                 '600703', '600309', '002310', '002466', '002142', '601111', '601211', '600487',
                 '002008', '600383', '600660']

不用回测也知道这个策略效果很好,因为市场已经验证过了,本篇只是借这个思路,coding下轮动策略的实现方式。

strategy类下的成员变量与其他成员函数见均线策略第二篇,本篇就不赘述了,重点记录下轮动的实现方式。


def change_position(self, date):
#按date之前15天涨幅排序
sorted_yield_df = self.get_sorted_yield(date)
#code: open_price,去除停盘的股票,将可买的股票按顺序加入到available_buy_dict中,此处全部加入的原因
#而不是只加入要买的5只,是为了避免购买每只股票的额度可能都不够买1手,导致最终的持仓不够5只股票。
available_buy_dict = OrderedDict()
for code in sorted_yield_df['code']:
df = self.data_repository.get_onecode_df(code)
if df[df['date'] == date].empty:
continue
else:
buy_open_price = float(df[df['date'] == date]['open'])
available_buy_dict[code] = buy_open_price
#求得持仓股票中是否可卖
available_sell_dict = {}
for code in self.position_dict.keys():
df = self.data_repository.get_onecode_df(code)
if df[df['date'] == date].empty:
available_sell_dict[code] = 0
else:
sell_open_price = float(df[df['date'] == date]['open'])
available_sell_dict[code] = sell_open_price
#sell operation 卖出持仓中不在top5中的
for code in list(self.position_dict.keys()):
amount = self.position_dict[code]
sell_open_price = available_sell_dict[code]
#卖出既不在待买清单的,又可以卖掉的股票
if code not in available_buy_dict and amount > 0 and sell_open_price > 0:
commission = self.cal_cost_function(sell_open_price, amount)
#更改现金
self.cash += sell_open_price * amount
self.cash -= commission
#更改持仓
del self.position_dict[code]
#加入trade记录, -1代表卖出操作
self.trade.add_trade(code, sell_open_price, amount, date, -1, commission)
#从待买清单中按顺序购买满剩余仓位,最多持有5只股票
for code in available_buy_dict.keys():
if len(self.position_dict) >= 5:
break
if code not in self.position_dict:
buy_open_price = available_buy_dict[code]
amount = self.get_buy_amount(code, buy_open_price)
if amount > 0:
commission = self.cal_cost_function(buy_open_price, amount)
# 更改现金
self.cash -= buy_open_price * amount
self.cash -= commission
# 更改持仓
self.position_dict[code] = amount
# 加入trade记录,+1为买入标识
self.trade.add_trade(code, buy_open_price, amount, date, 1, commission)


def get_sorted_yield(self, date):
yield_list = []
for code in self.code_list:
df = self.data_repository.get_onecode_df(code)
df = df[df['date'] <= date].tail(self.step_day)['close']
if df.empty:
yield_in_step_day = 0
else:
yield_in_step_day = df.iloc[-1] / df.iloc[0]
yield_list.append(yield_in_step_day)

(1)首先回测日之前的15个交易日内,每只股票的涨幅值,并从大到小排列;(2)从这些里面逐一判断回测日是否停盘(即df[df['date'] == date].empty是否为True),没有停盘的加入到available_buy_dict中,key为股票code,value为买入的开盘价(因为回测策略是按开盘价买入),因为加入到dict中的顺序是按收益率的高低加入的,普通dict是按key的unicode码排序的,而不是加入的顺序,故该处使用的OrderedDict;(3)逐一判断持仓的股票回测日的卖出价格并加入到available_sell_dict中,如果某只股票回测日停盘,则卖出价为0,同样key为股票code,value为卖出的开盘价;(4)先遍历持仓,并卖出不在available_buy_dict中并且可卖(即sell_dict中对应的值大于0)的股票,卖出后改变cash与持仓;(5)再买入剩余的位置。




最后

以上就是腼腆小虾米最近收集整理的关于量化白马股轮动策略的全部内容,更多相关量化白马股轮动策略内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部