大家好,欢迎来到IT知识分享网。
有关量化选股业绩评价要从两方面来考虑:一个是收益率,另一个是风险指数(最大回撤)。量化选股需要考虑的是在承担多大的风险情况下的收益率情况(夏普比)
夏普比率衡量基金的风险收益比,即每承受一单位总风险,可以相较无风险利率产生多少超额收益。因此,夏普比率越大,代表基金的收益风险表现越好。夏普比率 =(基金年化收益率 – 无风险利率) / 基金年化波动率。举例来说,如果基金A的夏普比率为0.5,而同类型基金的平均夏普比率为0.2,则意味着基金A的风险收益表现优于同类型基金的平均水平。
多因子模型
基本概念
策略模型
多因子选股模型的建立过程主要分为候选因子的选取、选股因子有效性的校验、有效但冗余因子的剔除、综合评分模型的建立和模型的评价及持续改进5个步骤
1、候选因子的选取
候选因子可以是基本面指标,也可以是技术面指标,还可以是一下其他辅助指标,候选因子的选择主要依赖于经济逻辑和市场经验,但选择更多和更有效的因子无疑是增强模型信息捕获能力、提高收益的关键因素之一。
2、选股因子有效性的校验
3、有效但冗余因子的剔除
不同的选股因子可能由于内在的驱动因素相同等原因,所选出的组合在个股构成和收益等方面具有较高的一致性,因此其中的一些因子需要作为冗余因子剔除,而只保留同类中收益最好、区分度最高的因子。
4、综合评分模型的建立
根据模型所得出的综合平均分对股票进行排序,然后根据需要选择排名靠前的股票
5、模型的评价及持续改进
一方面,由于量化选股方法是建立在市场无效或弱有效的前提之下的,随着使用多因子选股模型的投资者数量的不断增加,有些因子会逐渐失效,而另一些新的因子可能被校验有效而加入到模型中;另一方面,一些因子可能在过去的市场环境下比较有效,而随着市场风格的改变,这些因子可能在短期内失效,而另外一些以前无效的因子会在当前市场环境下表现更好。
实战练习
首先建立了一个Multi_factor_stock_selection.py文件,用于存储选股函数
# coding=utf-8
from __future__ import print_function, absolute_import
from gm.api import *
import pandas as pd
import numpy as np
import datetime
"""
《量化投资策略与技术》:量化选股——多因子选股
多因子选股模型的建立过程主要分为候选因子的选取、选股因子有效性的校验、有效但冗余因子的剔除、综合评分模型的建立和模型的评价及持续改进5个步骤
STEP0:建立股票资源池,获取股票代码列表get_symbol_list_all()
STEP1:
STEP2:
STEP3:
STEP4:
STEP5:
"""
"""
函数名:get_symbol_list_all():
输入参数:null
输出参数:target_symbol_list 数据类型:list
函数作用:获取指定指数全部的成分股代码,目前这里选取了上证和中证几个重要的指数建立了股票资源池:可参考文章:https://blog.csdn.net/_26285867/article/details/140749688
"""
def get_symbol_list_all():
A_share_list = {"SHSE.000010": "SHANG_ZHENG180", "SHSE.000009": "SHANG_ZHENG380", "SHSE.000300": "HU_SHEN300",
"SHSE.000905": "ZHONG_ZHENG500", "SHSE.000906": "ZHONG_ZHENG800","SHSE.000852": "ZHONG_ZHENG1000"}
A_share_main = {"600", "601", "602", "603", "000", "001", "002", "003"} #沪深主板股票代码的开头
symbol_list_all = pd.DataFrame([])
for key in A_share_list.keys():
symbol_list = stk_get_index_constituents(key) # 获取指数成分股数据
symbol_list_all = pd.concat([symbol_list_all, symbol_list], ignore_index=True)
# symbol_list_all =symbol_list_all.append(symbol_list) #新语句中append已经弃用
symbol_set = symbol_list_all["symbol"].values
target_symbol_list= []
for symbol in symbol_set:#从股票池中寻找主板股票
if symbol[5:8] in A_share_main and symbol not in target_symbol_list:
target_symbol_list.append(symbol)
print("沪深主板股票资源池数量",len(target_symbol_list))
return target_symbol_list
"""
函数名:sort_symbol_by_finance_prime(symbol_list,time,filed,n = 5)
输入参数:symbol_list 数据类型:list 初始股票清单
输入参数:time 查询财务主要指标的时间
输入参数:filed 查询财务主要指标标的
输入参数:n 获得的目标股票个数
输出参数:target_symbol_top,target_symbol_down 输出排序前n个的股票及排序后n个的股票
函数作用:根据主要财务指标对股票池中的股票进行排序,输出前n个股票及后n个股票
"""
def sort_symbol_by_finance_prime(symbol_list,time,filed,n = 5):
last_day = get_previous_trading_date("SHSE",time)
choose_symbol_list = []
data = stk_get_finance_prime_pt(symbols=symbol_list, fields=filed, rpt_type=None, data_type=None, date=last_day, df=True)
finance_prime = data.sort_values(filed,ascending=False) #根据选择的因子对股票进行排序
finance_prime = finance_prime.dropna() #删除无效数据
finance_prime = finance_prime.reset_index(drop=True) #重置索引值
print(finance_prime)
target_list = finance_prime["symbol"].values #获得排序后的股票代码清单
target_symbol_top = target_list[:n] #取列表中前5只作为标的股票
target_symbol_down = target_list[-n:] # 取列表中前5只作为标的股票
print(target_symbol_top)
print(target_symbol_down)
return target_symbol_top,target_symbol_down
# 可以直接提取数据,掘金终端需要打开,接口取数是通过网络请求的方式,效率一般,行情数据可通过subscribe订阅方式
# 设置token, 查看已有token ID,在用户-密钥管理里获取
set_token('自己的token码')
# 查询历史行情, 采用定点复权的方式, adjust指定前复权,adjust_end_time指定复权时间点
day_time, hour_and_mins = str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')).split(" ") # Python time.strftime() 函数用于格式化时间,返回以可读字符串表示的当地时间;详细用法见 https://www.runoob.com/python/att-time-strftime.html
symbol_list = get_symbol_list_all()
filed = ["eps_basic"]
sort_symbol_by_finance_prime(symbol_list,day_time,filed)
回测中比较有效的基本面因子
我选择的掘金终端进行回测,所以以下分类和代号也是参考掘金终端中的分类方式,同时部分指标有可能是因为获取的数据不全而剔除,并未是因为因子无效而剔除,回测函数的代码如下:
# coding=utf-8 from __future__ import print_function, absolute_import from gm.api import * import os import Multi_factor_stock_selection def init(context): # 在init函数中设置全局变量 # algo执行定时任务函数,只能传context参数 # index股票池代码,沪深300 # num买卖股票数据,暂定5只 # schedule在指定时间自动执行策略算法, 通常用于选股类型策略,每月一次,早上9点31分执行定时任务 # date_rule执行频率,目前暂时支持1d、1w、1m,其中1w、1m仅用于回测,实时模式1d以上的频率,需要在algo判断日期 # time_rule执行时间, 注意多个定时任务设置同一个时间点,前面的定时任务会被后面的覆盖 context.num = 50 context.filed = ["roa"] schedule(schedule_func=algo, date_rule='1m', time_rule='09:31:00') #设置回测方式,定时任务 def algo(context): now = context.now #获取当前时间 order_close_all() #这里为例简化,全部清仓上一阶段股票 symbol_list = Multi_factor_stock_selection.get_symbol_list_all() target_symbol_top, target_symbol_down = Multi_factor_stock_selection.sort_symbol_by_finance_deriv_pt(symbol_list,now,context.filed,context.num) # for symbol in target_symbol_down:#买入排名后5名的股票 for symbol in target_symbol_top: #买入排名前5名的股票 order_target_percent(symbol=symbol,percent=1/context.num,order_type=OrderType_Market,position_side=PositionSide_Long) #执行买入操作 # 查看最终的回测结果 def on_backtest_finished(context, indicator): print(indicator) if __name__ == '__main__': ''' strategy_id策略ID,由系统生成 filename文件名,请与本文件名保持一致 mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST token绑定计算机的ID,可在系统设置-密钥管理中生成 backtest_start_time回测开始时间 backtest_end_time回测结束时间 backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST backtest_initial_cash回测初始资金 backtest_commission_ratio回测佣金比例 backtest_slippage_ratio回测滑点比例 backtest_match_mode市价撮合模式,以下一tick/bar开盘价撮合:0,以当前tick/bar收盘价撮合:1 ''' run(strategy_id='自己的策略ID', filename='Multi_factor_stock_selection_test.py', mode=MODE_BACKTEST, token='自己的token码', backtest_start_time='2021-03-01 09:00:00', backtest_end_time='2023-03-01 15:00:00', backtest_adjust=ADJUST_PREV, backtest_initial_cash=, backtest_commission_ratio=0.0001, backtest_slippage_ratio=0.0001, backtest_match_mode=1)
| 分类 | 名称 | 代号 | 前5名收益率 | 前5名回撤 | 后5名收益率 | 后5名回撤 |
|---|---|---|---|---|---|---|
| 财务衍生指标 | 稀释每股收益同比增长率 | eps_dil_yoy | 7.27% | -26.26% | -10.23% | -34.22% |
| 财务衍生指标 | EBIT(正推法) | ebit | 18.26% | -18.8% | -4.37% | -32.18% |
后续等有时间我再将多个因子融合试一下。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/118043.html