估值打分交易系统
基本步骤(用作战游戏类比)
黑暗时代(获取原材料,比如皮革/石头等): 获取全部股票的历年财报数据,指数成分股占比,比例复权和定点复权的OHLC数据等
封建时代(矿石冶炼和标准件生产,比如制造剑鞘/螺丝钉/铁锭等): 计算股票的e/p,d/p,cf/p以及指数e/p,d/p,cf/p
合成时代(将标准件设计组合成自己的兵器不断打磨翻新): 将各个初级估值指标合成综合的一个估值指标,考虑多个维度
混战时代(沙盘推演与战术制定) 用自己打磨好的兵器(比如估值指标)在历史中进行量化回测,压力测试,策略优化等,改进自己的作战方案.
帝王时代: 前期经过原材料开采(数据源),标准件和工具生产(基本指标和工具开发),神兵锻造(合成量化指标),沙盘推演和战术制定(量化回测优化策略),小规模部队尝试作战(beta测试),最终进入大远征(大规模资金开始跟投策略)游戏结束
初加工阶段
股息率(d/p)
计算股息率: 最新的分红送股列表中查看过去1年的end_date对应的cash_div(税后实际分红现金)
过去一年现金分红 = 对cash_div求和(条件: end_date<=最新的end_date && end_date>最新的end_date-1年)
股息率 = 过去一年现金分红 /实时股价(不复权)
示例 2025年02月end_date列表: 2024-09-30,2023-12-31,2023-09-30,2022-12-31. 选取其中的(2023-09-30,2024-09-30]部分求cash_div总和
注意:
使用过去三年的分红总和,平滑分红波动 或者 只看去年的数据
可以考虑融资对应的真实股东回报率而不是仅仅看分红
使用end_date(分红送股对应的利润分配年度)而不是ann_date(预案公告日)或者ex_date(除权除息日),因为后者不规律
使用cash_div而不是其他数据
每年年报的数据到第二年4月左右才会更新,但是end_date写的是去年的12.31
实施公告日之前,理论上是不能够知道股票分红数据(比如2025年初不能知道2024年年报对应的分红).回测的时候为了避免引入未来函数,比如假设在实施公告日之前,分红数据我都是不知道的
for dt in OHLC.index:
#只能看到今天之前的分红送股数据
dividend = div[pd.to_datetime(div['imp_ann_date'])<dt]
if len(dividend) == 0: #如果没有分红送股数据
OHLC.loc[dt, 'div_1Y'] = 0 #过去1年股息率为0
continue
# 查看最新的一次分红季度,记录前一年的分红总和(包含这次)
end_date = pd.to_datetime(dividend.iloc[0]['end_date'])
end_date = end_date - relativedelta(years=1)
cash_div = 0
for index,row in dividend.iterrows():
if pd.to_datetime(row['end_date']) <= end_date:
break #不记录一年前之前的分红数据
cash_div += row['cash_div']
OHLC.loc[dt, 'div_1Y'] = cash_div / OHLC.loc[dt,'close'] #记录股息率
指数估值数据
计算出每个个股的e/p,d/p,cf/p,之后加权平均一下(权重就是指数成分股的占比)
理解: 指数每部分钱生钱的速度都不一样,需要加权平均一下就是所有平均钱生钱的速度
注意: 可以用e/p但是不能用pe