0. 承前
如果想更加全面清晰地了解金融资产组合模型进化论的体系架构,可参考:
0. 金融资产组合模型进化全图鉴
1. 简述:四大估值指标对比
- 描述市净率(PB)含义:市净率衡量股票价格相对于每股净资产的比率。链接
- 描述市盈率(PE)含义:市盈率衡量股票价格相对于每股收益的比率。链接
- 描述市销率(PS)含义:市销率衡量股票价格相对于每股销售收入的比率。链接
- 描述股息率(DV)含义:股息率衡量每股分红相对于股票价格的比率。链接
2. 比喻:四大指标对比
2.1 简单对比
- 市净率(PB)关注"值多少钱"
小明的母鸡实际价值:
品种价值:1000元
买入价格:2000元
PB = 买入价格2000元 ÷ 实际价值1000元 = 2倍
含义:花了实际价值2倍的钱买鸡
- 市盈率(PE)关注"赚到的钱"
小明的母鸡一年:
卖蛋收入:365元
减去成本:165元
纯赚到了:200元
PE = 母鸡价格4000元 ÷ 纯赚200元 = 20倍
含义:要20年的纯利润才能赚回买鸡钱
- 市销率(PS)关注"卖出的钱"
小明的母鸡一年:
卖蛋收入:365元
不管成本:不考虑饲料费
PS = 母鸡价格4000元 ÷ 收入365元 = 11倍
含义:要11年的总收入才能买下母鸡
- 股息率(DV)关注"分到的钱"
小明的母鸡一年:
分到现金:100元(每年固定分钱)
买鸡价格:2000元
DV = 年分红100元 ÷ 买鸡价格2000元 = 5%
含义:每年能从买鸡钱中拿回5%
2.2 生动比喻
- 市净率就像问:
"这只鸡买贵了多少倍?"
- 比较买入价和实际价值
- 就像问:"溢价了几倍?"
- 市盈率就像问:
"这只鸡要多少年的'纯赚'才能回本?"
- 算的是扣除饲料钱后真正赚到的钱
- 就像问:"要攒多少年的私房钱才够?"
- 市销率就像问:
"这只鸡要多少年的'卖蛋钱'才能买下?"
- 只算卖蛋的总收入,不管花销
- 就像问:"要有多少年的营业额才够?"
- 股息率就像问:
"这只鸡每年能分到买鸡钱的百分之几?"
- 算的是固定能拿到手的钱
- 就像问:"租金回报率是多少?"
2.3 区别要点
- 主要区别
市净率(PB):看溢价程度
- 关注资产价值
- 比较购买溢价
- 适合评估购买性价比
市盈率(PE):看赚钱能力
- 考虑成本和开销
- 关注实际赚到的钱
- 适合评估盈利能力
市销率(PS):看卖货能力
- 不考虑成本开销
- 只关注卖出总额
- 适合评估市场占有率
股息率(DV):看分红能力
- 关注实际分到手的钱
- 类似租金回报
- 适合评估固定收益
3. 实际应用
3.1 选择建议
看价值投资用PB:
- 像买二手母鸡
- 要看是不是溢价太高
- 要有安全边际
看成熟企业用PE:
- 像养老母鸡
- 能稳定下蛋赚钱
- 预期比较稳定
看成长企业用PS:
- 像养小母鸡
- 还在成长期
- 暂时可能不赚钱
看稳定收益用DV:
- 像租出去的母鸡
- 能固定收租金
- 适合要稳定现金流
4. 总结
关注点:
- PB看"买贵了没有"
- PE看"要多久能回本"
- PS看"卖货能力如何"
- DV看"分红回报多少"
就像买母鸡:
- PB看是不是溢价太多
- PE看实际赚钱能力
- PS看卖蛋总收入
- DV看固定现金回报
5. 实现代码
def get_pb_data(ts_code=None, trade_date=None, start_date=None, end_date=None):
"""
获取股票的市净率(PB)数据
参数:
ts_code (str): 股票代码,如'600230.SH'
trade_date (str): 交易日期,如'20180726'
start_date (str): 开始日期,如'20180701'
end_date (str): 结束日期,如'20180731'
返回:
pandas.DataFrame: 包含股票代码、交易日期和PB值的数据框
"""
try:
# 初始化pro接口
pro = ts.pro_api()
# 设置要获取的字段
fields = 'ts_code,trade_date,pb'
# 根据不同的参数组合调用接口
if ts_code and trade_date:
df = pro.daily_basic(ts_code=ts_code, trade_date=trade_date, fields=fields)
elif ts_code and start_date and end_date:
df = pro.daily_basic(ts_code=ts_code, start_date=start_date, end_date=end_date, fields=fields)
elif trade_date:
df = pro.daily_basic(trade_date=trade_date, fields=fields)
else:
raise ValueError("请提供有效的参数组合")
return df
except Exception as e:
print(f"获取PB数据时发生错误: {str(e)}")
return None
def get_pe_data(ts_code=None, trade_date=None, start_date=None, end_date=None, pe_type='pe'):
"""
获取股票的市盈率(PE)数据
参数:
ts_code (str): 股票代码,如'600230.SH'
trade_date (str): 交易日期,如'20180726'
start_date (str): 开始日期,如'20180701'
end_date (str): 结束日期,如'20180731'
pe_type (str): PE类型,'pe'为普通市盈率,'pe_ttm'为滚动市盈率
返回:
pandas.DataFrame: 包含股票代码、交易日期和PE值的数据框
"""
try:
# 初始化pro接口
pro = ts.pro_api()
# 确保pe_type是有效的选项
if pe_type not in ['pe', 'pe_ttm']:
raise ValueError("pe_type必须是'pe'或'pe_ttm'")
# 设置要获取的字段
fields = f'ts_code,trade_date,{pe_type}'
# 根据不同的参数组合调用接口
if ts_code and trade_date:
df = pro.daily_basic(ts_code=ts_code, trade_date=trade_date, fields=fields)
elif ts_code and start_date and end_date:
df = pro.daily_basic(ts_code=ts_code, start_date=start_date, end_date=end_date, fields=fields)
elif trade_date:
df = pro.daily_basic(trade_date=trade_date, fields=fields)
else:
raise ValueError("请提供有效的参数组合")
return df
except Exception as e:
print(f"获取PE数据时发生错误: {str(e)}")
return None
def get_ps_data(ts_code=None, trade_date=None, start_date=None, end_date=None, ps_type='ps'):
"""
获取股票的市销率(PS)数据
参数:
ts_code (str): 股票代码,如'600230.SH'
trade_date (str): 交易日期,如'20180726'
start_date (str): 开始日期,如'20180701'
end_date (str): 结束日期,如'20180731'
ps_type (str): PS类型,'ps'为普通市销率,'ps_ttm'为滚动市销率
返回:
pandas.DataFrame: 包含股票代码、交易日期和PS值的数据框
"""
try:
# 初始化pro接口
pro = ts.pro_api()
# 确保ps_type是有效的选项
if ps_type not in ['ps', 'ps_ttm']:
raise ValueError("ps_type必须是'ps'或'ps_ttm'")
# 设置要获取的字段
fields = f'ts_code,trade_date,{ps_type}'
# 根据不同的参数组合调用接口
if ts_code and trade_date:
df = pro.daily_basic(ts_code=ts_code, trade_date=trade_date, fields=fields)
elif ts_code and start_date and end_date:
df = pro.daily_basic(ts_code=ts_code, start_date=start_date, end_date=end_date, fields=fields)
elif trade_date:
df = pro.daily_basic(trade_date=trade_date, fields=fields)
else:
raise ValueError("请提供有效的参数组合")
return df
except Exception as e:
print(f"获取PS数据时发生错误: {str(e)}")
return None
def get_dividend_yield_data(ts_code=None, trade_date=None, start_date=None, end_date=None, div_type='dv_ratio'):
"""
获取股票的股息率数据
参数:
ts_code (str): 股票代码,如'600230.SH'
trade_date (str): 交易日期,如'20180726'
start_date (str): 开始日期,如'20180701'
end_date (str): 结束日期,如'20180731'
div_type (str): 股息率类型,'dv_ratio'为普通股息率,'dv_ttm'为滚动股息率
返回:
pandas.DataFrame: 包含股票代码、交易日期和股息率值的数据框
"""
try:
# 初始化pro接口
pro = ts.pro_api()
# 确保div_type是有效的选项
if div_type not in ['dv_ratio', 'dv_ttm']:
raise ValueError("div_type必须是'dv_ratio'或'dv_ttm'")
# 设置要获取的字段
fields = f'ts_code,trade_date,{div_type}'
# 根据不同的参数组合调用接口
if ts_code and trade_date:
df = pro.daily_basic(ts_code=ts_code, trade_date=trade_date, fields=fields)
elif ts_code and start_date and end_date:
df = pro.daily_basic(ts_code=ts_code, start_date=start_date, end_date=end_date, fields=fields)
elif trade_date:
df = pro.daily_basic(trade_date=trade_date, fields=fields)
else:
raise ValueError("请提供有效的参数组合")
return df
except Exception as e:
print(f"获取股息率数据时发生错误: {str(e)}")
return None