作为策略锦集的第一篇,我们结合当前A股市场的价值投资风向,向大家介绍极具实践意义的股息率选股策略。
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