导语:作为策略锦集的第一篇,我们结合当前A股市场的价值投资风向,向大家介绍极具实践意义的股息率选股策略。
无论是初入市场的新手,还是经历市场风雨后的老手,每个投资者都会面临“如何选股”的问题,凯利.赖特在2011年出版的《选股,一定要看股息》中讲述了股息价值投资策略,并独具匠心地指出,对于那些理解和重视股息收益的投资者,股市会给予他们丰厚的利润作为回报。杰里米J.西格尔在《投资者的未来》一书中阐述了一个重要观点:高股息率股票具备长期投资价值。《约翰聂夫的成功投资》一书介绍了他在执掌温莎基金31年间,投资组合增长55倍,平均年复利回报率13.7%,平均超出市场收益率3.15%,而温莎基金7大选股策略之一就是高股息率,年均3.15%的超额收益中2%来自于股息收入,尤其是熊市中股息收益起到重要的保护作用。
那么股息率到底是什么,为何国内外专业投资者将其作为选股的重要参考标准之一?
股息率全称为股息收益率,是股息与股票价格之间的比率。其公式为:股息率 = (股息/股票买入价)*100%,如果连续多年个股股息率超过1年期银行存款利率,则这只股票视为收益型股票,股息率越高则越吸引人。其次股息是上市公司给予投资者的回报。一般来说,一家公司的股息率越高,则一定程度上说明企业的盈利状况越好。投资高股息率的股票,可以让投资享有足够的安全边际,在一般行情里也能获取不错收益。
如何构建简单的股息率投资策略呢?
每个月第一个交易日,将当天开盘的沪深300指数成分股股票,按股息率数值从大到小排序,筛选出前10只个股作为持仓。
以下为策略实现的基本信息:
策略实现难度:1
实现过程中所需要用到的API函数,ps:通过SuperMind量化交易平台API文档快速掌握:
需要用到的API函数 | 功能 |
---|---|
init() | 初始化函数 |
run_monthly() | 按月定时运行函数 |
get_index_stocks() | 获取指数成分股代码 |
get_last_datetime() | 获取前一个交易日或者前一分钟的时间 |
get_factors() | 查询因子数据 |
context.portfolio.available_cash | 获取账户当前可用资金 |
order_target() | 按目标股数下单 |
order_target_percent() | 按目标市值占比下单 |
本策略的编写难点主要集中在SuperMind量化交易平台的函数使用上,以下重点讲述函数使用上的注意点:
1.定时运行函数一共有4个,包括:按月定时、按周定时、按日定时、自定义定时。其函数使用只需确定两点:1.定时运行哪个函数,2.具体定时。本策略由于按月选股调仓交易,那么选择run_monthly函数,需要将交易函数trade定时运行,具体定时为每月第一个交易日,结果即为:run_monthly(trade,date_rule=1)
2.确定需交易股票的过程中,由于列表list内部数据顺序可变,于是代码中主动创建空列表,通过append和remove来删除添加操作。否则每次回测的结果都会因为买卖顺序的改动而有细微的差异。
3.股息率指标获取,采用get_factors函数,该函数内至少确定3点:
A.获取哪些股票的因子。
B.获取哪些因子数据。
C.获取哪个时间点的数据
其次你也可以在获取函数中额外添加筛选条件或者排序条件等等,ps:排序条件需写在order_by()。
策略回测区间:2021.01.01-2022.12.31
回测资金:1000000
回测频率:日级
回测结果:红色曲线为策略收益率曲线,蓝色曲线为对应的基准指数收益率曲线
策略源代码:
import pandas as pd
import numpy as np
# 初始化函数,全局只运行一次
def init(context):
context.n = 10 #设置最大持仓数量
run_monthly(handle_bar,date_rule=1)
#将handle_bar交易函数设置定时运行:每个月第一个交易日
context.stock = [] #储存上期的股票池
## 开盘时运行函数
def handle_bar(context, bar_dict):
#执行选股函数:dividend_rate(context,bar_dict),并将结果导入,该股票列表是需要买入的个股。
needstock_list = dividend_rate(context,bar_dict)
#获取上期持仓个股
holdstock_list = list(context.stock)
#确定本期需要卖出的个股
sell_list = list(set(holdstock_list)-set(needstock_list))
#执行卖出操作,运用for循环,逐个操作。
for s in sell_list:
order_target(s,0)
#确定本期需要买入的个股,其余即为继续持仓的个股
buy_list=[]
for i in needstock_list:
if i in holdstock_list:
pass
else:
buy_list.append(i)
#确定可用资金,平分分配至需买入的个股
n=len(buy_list)
cash=context.portfolio.available_cash/n
#执行买入操作
for s in range(0,n,1):
stock=list(buy_list)[s]
order_target_percent(stock,0.1)
#操作完毕,将选股结果放到上期股票池储存变量中,以备下次使用。
context.stock = frozenset(needstock_list)
#选股函数,用于筛选沪深300指数成分股中的股息率前10的个股
def dividend_rate(context,data):
#获取上一个交易日的日期
ldate = get_last_datetime().strftime('%Y%m%d')
#获取沪深300指数成分股内的所有个股
stock_list = get_index_stocks('000300.SH',ldate)
#通过因子函数,获取交易日当天的全市场个股的股息率指标,并以股息率指标从大到小排序。
dividendrate=get_factors(query(factor.symbol,
factor.dividend_rate_12_months,
).filter(factor.symbol.in_(stock_list),
factor.date==ldate).order_by(factor.dividend_rate_12_months.desc()))
#获取前10只股票的代码
needstock_list=[]
for s in range(0,context.n,1):
needstock_list.append(dividendrate.iloc[s]['factor_symbol'])
#完成函数,输出即为10只股票代码,作为策略的股票池
return needstock_list