首页  > 今日智库  > 

作为风险指标的股息稳定性算法(股息和红利怎么算)

  • 点击1544次
  • www.couwai.com
  • 评论0条
  • 导读股息和红利怎么算,灵感在之前的一篇文章中,我写了一篇关于使用现代投资组合理论 (MPT) 构建股息投资组合的文章。MPT 需要两件事:风险指标和回报指标。使用这两个指标执行多目标优化,其中风险最小化,回报最大化,从而创建“最佳”投资组合。对于寻求资本收益的投...

    作为风险指标的股息稳定性算法

    灵感

    在之前的一篇文章中,我写了一篇关于使用现代投资组合理论 (MPT) 构建股息投资组合的文章。MPT 需要两件事:风险指标和回报指标。使用这两个指标执行多目标优化,其中风险最小化,回报最大化,从而创建“最佳”投资组合。对于寻求资本收益的投资者来说,这些指标的定义相当明确,但对于股息投资者而言,它们就不那么明显了。

    在我之前的帖子中,我将风险定义为公司财务稳定性的函数(即使用资产负债表中的数据),并将回报定义为考虑当前股息率和预期股息增长的股息支付。这个风险指标有几个明显的问题:

      如何为可能没有必要资产负债表数据的其他资产(例如 ETF)定义风险?无法使用当前指标进行风险计算。

      这种风险定义实际上与股息收入无关,而是与公司在不破产的情况下继续支付股息的可能性有关。

      某些资产类型,例如需要高派息率的房地产投资信托基金,可能会被排除在投资组合之外,因为高派息率被认为是公司的不良特征,因为派息可能难以维持。

    在这篇文章中,我定义了一个新的风险指标,它只考虑支付股息资产的股息历史。我提出了一个基于积分的系统,该系统会惩罚跳过或削减股息的资产,并奖励它更频繁地支付股息。该指标在 Python 中实现,并用作以股息收入为中心的投资组合优化的风险指标。

    基于点的风险度量的定义

    首先,将定义风险指标。有两件事会破坏以股息为中心的投资组合,即削减股息和错过股息支付。我们将从后者开始。

    股息缺口

    要确定是否存在股息支付缺口,首先需要根据历史股息数据确定股息频率。这是通过区分(有序的)股息数据中行之间的日期并找出连续股息记录日期之间相隔多少个月来完成的。

    def __GetPayPeriod(self, dividend_history : pd.DataFrame) -> Tuple[int, List[decimal.Decimal]]: """ Determines the typical dividend pay frequency and difference between record dates as a number of months of an asset. """ diffs = [] for idx, _ in dividend_history.iterrows(): # iterate the dataframe if idx == len(dividend_history) - 1: continue # determine the number of months between consecutive dates diff = decimal.Decimal((dividend_history.iloc[idx]["recordDate"] - dividend_history.iloc[idx + 1]["recordDate"]) / np.timedelta64(1, 'M')).quantize(decimal.Decimal('1'), rounding=decimal.ROUND_HALF_UP) if diff == 0: ## fluke? bad reporting? continue diffs.append(diff) # return the mode (most frequent) dividend gap and all of the differences return stats.mode(diffs).mode, diffs

    在此代码中,如评论中所示,连续股息支付之间的差异是针对所有股息历史确定的。支付期被确定为最常见的差异。例如,如果分红频率为每季度一次,则此函数返回的模式应为3 (months)。连续股息支付之间的月数差异也将返回以用于评分函数。

    def __ScoreDividendGaps(self, dividend_frequency : int, dividend_date_diffs : List[decimal.Decimal]) -> int: """ Finds and counts any gaps in an assets dividend history dependent on the typical pay frequency. Will reward positive points for more frequent dividends (i.e. special dividends). The lower the score the better as this will indicate less risk. """ score = 0 for diff in dividend_date_diffs: if diff < dividend_frequency: # if paid more frequently lower risk score -= 1 if diff > dividend_frequency: # if paid less frequently increase risk score += diff # return risk "score" return score

    此方法用于使用股息支付的缺口来衡量资产的风险。如果没有差距,即支付时间比预先确定的支付频率更长,则分数应为 0。否则,分数会因差距的长度而增加(风险较高),并减少(风险降低)更多频繁支付股息(例如特别股息)。

    股息削减

    股息投资者的第二个主要担忧是股息削减,即资产的股息比之前的数额减少。这是通过确定股息减少的次数和股息减少的平均百分比来解释的。

    def __GetDividendCuts(self, dividend_history : pd.DataFrame) -> Tuple[float, int]: """ Finds and accumulates the count and total (percentage) of dividend cuts. """ # find the difference between consecutive dividend payment amounts (split adjusted) dividend_history["adjDividendDiffs"] = dividend_history["adjDividend"].diff() # find the percent the dividends were cut dividend_history["cut_pcts"] = dividend_history["adjDividendDiffs"] / (dividend_history["adjDividend"] + dividend_history["adjDividendDiffs"]) # find all of the cuts (more recent dividend was higher than the previous dividend) cut_pcts = dividend_history["cut_pcts"].loc[dividend_history["cut_pcts"] > 0] # determine the average percentage cut avg_cut = 0 if len(cut_pcts) <= 0 else cut_pcts.sum() / len(cut_pcts) # return the average percentage cut and the number of dividend reductions return avg_cut, len(cut_pcts)

    在上面的代码中,对 Pandas DataFrame 对象执行操作以查找股息削减的次数和股息减少的平均金额。这两个值被返回并用于风险度量的计算。

    绑在一起

    现在已经对股息投资者的噩梦进行了计算,需要汇总这些值以量化特定资产的风险。

    def GetRisk(self, ticker : str, fetcher : FMPFetcher) -> float: # fetch the dividend history from FMPCloud's API dividend_history = fetcher.fetch_dividend_history(ticker) if "historical" not in dividend_history: # there are no dividends, return return None # create a Pandas DataFrame from the returned JSON dividend_history = pd.DataFrame(dividend_history["historical"]) try: # attempt to convert the date to a timestamp dividend_history["recordDate"] = pd.to_datetime(dividend_history['recordDate'], format='%Y-%m-%d') except: print(dividend_history) return None # determine the pay frequency period, diffs = self.__GetPayPeriod(dividend_history) # score risk based on dividend pay gaps gap_score = self.__ScoreDividendGaps(period, diffs) # score risk based on dividend cuts accum_percent_cuts, div_cuts = self.__GetDividendCuts(dividend_history) # aggregate gap and cut scores (subject to fine-tuning) return decimal.Decimal(gap_score * 5) + decimal.Decimal(accum_percent_cuts) + decimal.Decimal(div_cuts)

    此逻辑确定资产的风险值。历史分红数据首先从FMPCloud 的 API中获取。然后,该数据由上面介绍的股息缺口和股息削减逻辑处理。最后,从函数返回的值被聚合成最终的风险指标。最终计算(汇总)会根据每个风险指标对个人投资者的重要性进行微调。

    Python 中的完整实现

    下面是此风险指标的完整 Python 代码。请注意,这不是一个独立的 Python 程序,而是执行 MPT 计算的更大程序的一部分。这在我之前的帖子中有更详细的讨论。

    from abc import ABC, abstractmethodfrom typing import Tuple, Listfrom FMPFetcher import FMPFetcherimport numpy as npimport pandas as pd import decimalfrom scipy import statsclass RiskMetric(ABC): @abstractmethod def GetRisk(self, ticker : str, fetcher : FMPFetcher) -> float: pass class PointBasedDividendRisk(RiskMetric): def __GetPayPeriod(self, dividend_history : pd.DataFrame) -> Tuple[int, List[decimal.Decimal]]: """ Determines the typical dividend pay frequency and difference between record dates as a number of months of an asset. """ diffs = [] for idx, _ in dividend_history.iterrows(): if idx == len(dividend_history) - 1: continue diff = decimal.Decimal((dividend_history.iloc[idx]["recordDate"] - dividend_history.iloc[idx + 1]["recordDate"]) / np.timedelta64(1, 'M')).qua if diff == 0: ## fluke? bad reporting? continue diffs.append(diff) return stats.mode(diffs).mode, diffs def __ScoreDividendGaps(self, dividend_frequency : int, dividend_date_diffs : List[decimal.Decimal]) -> int: """ Finds and counts any gaps in an assets dividend history dependent on the typical pay frequency. Will reward positive points for more frequent dividends (i.e. special dividends). The lower the score the better as this will indicate less risk. """ score = 0 for diff in dividend_date_diffs: if diff < dividend_frequency: score -= 1 if diff > dividend_frequency: score += diff return score def __GetDividendCuts(self, dividend_history : pd.DataFrame) -> Tuple[float, int]: """ Finds and accumulates the count and total (percentage) of dividend cuts. """ dividend_history["adjDividendDiffs"] = dividend_history["adjDividend"].diff() dividend_history["cut_pcts"] = dividend_history["adjDividendDiffs"] / (dividend_history["adjDividend"] + dividend_history["adjDividendDiffs"]) cut_pcts = dividend_history["cut_pcts"].loc[dividend_history["cut_pcts"] > 0] avg_cut = 0 if len(cut_pcts) <= 0 else cut_pcts.sum() / len(cut_pcts) return avg_cut, len(cut_pcts) def GetRisk(self, ticker : str, fetcher : FMPFetcher) -> float: dividend_history = fetcher.fetch_dividend_history(ticker) if "historical" not in dividend_history: return None dividend_history = pd.DataFrame(dividend_history["historical"]) try: dividend_history["recordDate"] = pd.to_datetime(dividend_history['recordDate'], format='%Y-%m-%d') except: print(dividend_history) return None period, diffs = self.__GetPayPeriod(dividend_history) gap_score = self.__ScoreDividendGaps(period, diffs) accum_percent_cuts, div_cuts = self.__GetDividendCuts(dividend_history) return decimal.Decimal(gap_score * 5) + decimal.Decimal(accum_percent_cuts) + decimal.Decimal(div_cuts)

    结论

    在这篇文章中,我提出并解释了一种改进的股息投资组合风险指标,该指标将通过现代投资组合理论进行优化。这篇文章是对上一篇文章的补充,该文章更详细地描述了 MPT 以及如何对支付股息的股票执行 MPT 优化。这种增强的风险指标允许包含更多资产类型(例如 ETF),并解决了我之前的风险指标的一些问题。

  • 股息和红利怎么算,万字干货!一篇文章帮你搞明白估值,解读市盈率、市净率、市销率

    这是一篇节省你大量时间的干货文章。文中,有主流估值方法的起源,有主流估值方法的适用范围,并且也把估值方法的局限性也讲清楚了。作者:网叔点财来源:雪球一、常见的估值方法说实话,估值并不难。常见的估值方法也就那么几种:简单一些的,算算市盈率(P...

    2023-03-19 29585阅读 832人支持 386篇回答
  • 个人所得税|“利息、股息、红利所得”个人所得税的处理(股息和红利怎么算)

    “利息、股息、红利所得”,是指个人因拥有“债权”和“股权”而取得的“利息”、“股息”和“红利”。一、“利息、股息、红利所得”的范围◆“利息”,即货币的“使用费”,是货币所有人(债权人)因贷出货币或货币资本而从借款人(债务人)处所获得的“报酬...

    2023-03-19 4049阅读 0人支持 0篇回答
  • 股息和红利怎么算,理财——买卖股票的股息分红是如何缴税的?

    股息红利税是指对上市公司的分红征税,红利所得税属于“个人所得税”范畴。根据《个人所得税法》的有关条款,个人因持有中国的债券、股票、股权而从中国境内公司、企业或其他经济组织取得的利息、股息、红利所得,需按20%的比例缴纳个人所得税。红利税是指...

    2023-03-19 9777阅读 2人支持 1篇回答
  • 国际税收(股息和红利怎么算)

    一,国际税收的含义国际税收:是国家之间对跨国纳税人行使各自的税收管辖权的过程中,所发生的国际间的税务关系。国际税收的存在是以国际间的经济交往为前提的。由于商品、资本、人员等在国与国之间的流动,出现了跨国所得、跨国财产和跨国纳税人,各国在行使...

    2023-03-19 8700阅读 1人支持 0篇回答
  • 股息和红利怎么算,财务分析之股息率

    前面介绍的财务指标基本上都是说明企业的盈利能力,但是企业把钱装进口袋并不代表投资者也能把钱装进口袋,如果企业告诉你我如何如何赚钱,但是你一分钱也没得到,是不是瞬间觉得这个赚钱和自己没半毛钱关系,今天介绍的这个指标就是用来描述如果企业吃肉了,...

    2023-03-19 3217阅读 0人支持 0篇回答
  • 股息和红利怎么算,股息红利要入账 税务处理分情形

    按照注册地和上市地划分,广义的中国上市公司大致可以分为三类:一是境内上市公司,主要特点是境内注册、境内上市,主要经营活动位于中国境内;二是红筹境外上市公司,主要特点是境外注册、境外上市,但主要经营活动位于中国境内;三是红筹境内上市公司,主要...

    2023-03-19 8628阅读 0人支持 0篇回答
  • 股息和红利怎么算,指数基金投资(四):股息率、分红率、派息率

    本文跟大家聊下分红相关的一些概念,为下一篇红利系列指数做个简单的准备。跟股票分红相关的几个基础概念主要有:股息、股息率、分红、分红率、除权、除息、填权、贴权等,再就是分红之后是否交税、股息率如何使用。最后解答很多人的一个疑惑,分红之后自己手...

    2023-03-19 5497阅读 5人支持 4篇回答
  • 股息和红利怎么算,股市知识丨股息红利的分类有哪些?

    免责声明:本文任何观点和建议仅供阅读者参考,不构成对证券买卖的出价或询价。在任何情况下,我们不对任何投资做出任何形式的担保。股市有风险,投资需谨慎!股息红利是股东的一项投资权益,它以股份为单位计算实际金额,比如10股派发1.2元。当上市公司...

    2023-03-19 9547阅读 15人支持 0篇回答
  • 山东省潍坊市商业学校,山东省潍坊商业学校召开全校开学及工作动员大会

    本报讯:(潍坊日报社全媒体记者 田清春 通讯员 赵涛 韩学慧 魏南南)2月4日,山东省潍坊商业学校召开全校开学及工作动员大会,部署学期开学工作,对本学期工作进行全面动员,提出“夯实基础、创新模式、重点突破、提质创优”的年度工作思路。会议由副...

    2023-03-23 5940阅读 0人支持 0篇回答