第四章:经典量化策略集锦

第一篇:投资高股息股票 






导语:作为策略锦集的第一篇,我们结合当前A 股市场的价值投资风向,向大家介绍极具实 


践意义的股息率选股策略。 






一、股息率策略阐述 






    无论是初入市场的新手,还是经历市场风雨后的老手,每个投资者都会面临 “如何选 


股”的问题,凯利.赖特在2011 年出版的 《选股,一定要看股息》中讲述了股息价值投资策 


略,并独具匠心地指出,对于那些理解和重视股息收益的投资者,股市会给予他们丰厚的利 


润作为回报。杰里米J.西格尔在《投资者的未来》一书中阐述了一个重要观点:高股息率股 


票具备长期投资价值。 《约翰聂夫的成功投资》一书介绍了他在执掌温莎基金31 年间,投 


资组合增长55 倍,平均年复利回报率13.7%,平均超出市场收益率3.15%,而温莎基金7 大 


选股策略之一就是高股息率,年均3.15%的超额收益中2%来自于股息收入,尤其是熊市中 


股息收益起到重要的保护作用。  






    那么股息率到底是什么,为何国内外专业投资者将其作为选股的重要参考标准之一? 






    股息率全称为股息收益率,是股息与股票价格之间的比率。其公式为: 


         股息 


 股息率=          *100%,如果连续多年个股股息率超过 1 年期银行存款利率,则这 


       股票买入价 


只股票视为收益型股票,股息率越高则越吸引人。其次股息是上市公司给予投资者的回报。 


一般来说,一家公司的股息率越高,则一定程度上说明企业的盈利状况越好。投资高股息率 


的股票,可以让投资享有足够的安全边际,在一般行情里也能获取不错收益。 






    如何构建简单的股息率投资策略呢? 






    每个月第一个交易 日,将当天开盘的沪深300 指数成分股股票,按股息率数值从大到小 


排序,筛选出前10 只个股作为持仓。 






    以下为策略实现的基本信息: 






    策略实现难度:1 


    实现过程中所需要用到的API 函数,ps:通过 MindGo 量化交易平台 API 文档快速掌握: 






需要用到的API 函数          功能 






initialize()         初始化函数 






run_monthly()        按月定时运行函数 






get_index_stocks()   获取指数成分股代码  






get_last_datetime()  获取前一个交易 日或者前一分钟的时间  




----------------------- Page 70-----------------------


get_factors()            查询因子数据  






account.available_cash   获取账户当前可用资金 






order_target()           按目标股数下单 






order_target_percent()   按目标市值占比下单 






二、代码示意图 






三、编写释义 






    本策略的编写难点主要集中在MindGo 量化交易平台的函数使用上,以下重点讲述函数 


使用上的注意点: 






    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() 。 




----------------------- Page 71-----------------------


四、最终结果 






策略回测区间:2014.01.01-2018.01.28 


回测资金:100000 


回测频率:日级 


回测结果:红色曲线为策略收益率曲线,蓝色曲线为对应的基准指数收益率曲线 






策略源代码: 






import pandas as pd 


import numpy as np 


#================================初始化函数============================= 


def initialize(account): 


    account.n = 10 #设置最大持仓数量 


    run_monthly(trade,date_rule=1) #将trade 交易函数设置定时运行:每个月第一个交易 日 


    account.stock = [] #储存上期的股票池 


#================================主函数 (选股+交易)===================== 


def trade(account, data): 


    #执行选股函数:dividend_rate(account,data) ,并将结果导入,该股票列表是需要买入的个 


股。 


    needstock_list = dividend_rate(account,data) 


    #获取上期持仓个股 


    holdstock_list = list(account.stock) 


    #确定本期需要卖出的个股 


    sell_list = list(set(holdstock_list)-set(needstock_list)) 


    #执行卖出操作,运用for 循环,逐个操作。 


    for s in sell_list: 


        order_target(s,0) 


    #确定本期需要买入的个股,其余即为继续持仓的个股 


    buy_list=[] 




----------------------- Page 72-----------------------


    for i in needstock_list: 


        if i in holdstock_list: 


            pass 


        else: 


            buy_list.append(i) 


    #确定可用资金,平分分配至需买入的个股 


    n=len(buy_list) 


    cash=account.available_cash/n 


    #执行买入操作 


    for s in range(0,n,1): 


        stock=list(buy_list)[s] 


        order_target_percent(stock,0.1) 


    #操作完毕,将选股结果放到上期股票池储存变量中,以备下次使用。 


    account.stock = frozenset(needstock_list) 


#=========选股函数,用于筛选沪深300 指数成分股中的股息率前10 的个股=========== 


def dividend_rate(account,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,account.n,1): 


        needstock_list.append(dividendrate.iloc[s]['factor_symbol']) 


    #完成函数,输出即为 10 只股票代码,作为策略的股票池 


    return needstock_list 




----------------------- Page 73-----------------------

猜你喜欢

转载自blog.csdn.net/wuyusheng314/article/details/80279319
今日推荐