震惊!某知名DBA被巴菲特“坑”数万仍不停手,他持续砸钱的原因到底是什么?
文中参考文档点击阅读原文打开, 同时推荐2个学习环境:
1、懒人Docker镜像, 已打包200+插件:《最好的PostgreSQL学习镜像》
2、有web浏览器就能用的云起实验室: 《免费体验PolarDB开源数据库》
3、PolarDB开源数据库内核、最佳实践等学习图谱: https://www.aliyun.com/database/openpolardb/activity
巴菲特到底骗没骗人?某知名DBA用数据和亲身经历现身说法!
先说我的惨痛教训: 大概2年半前开始每周定投, 今年春节急用全卖了, 进去30, 出来23!
巴菲特劝年轻人坚持定投,是巴菲特说错了?还是我错了?听我慢慢叨来。
参考文档
https://github.com/digoal/blog/blob/master/202209/20220908_02.md
https://github.com/digoal/blog/blob/master/202209/20220906_03.md
https://github.com/digoal/blog/blob/master/202209/20220902_01.md
https://github.com/digoal/blog/blob/master/202110/20211029_02.md
巴菲特投资理念的理论支撑
巴菲特的投资理念是什么? 长线定投, 长线定投的理论支撑是什么?
长期定投不是投机倒靶, 长期定投是有社会价值的, 可以帮助上市公司筹集资金, 加大研发投入和生产. 投资人则在这中间获取企业业务发展带来的红利.
长线定投赚钱背后的逻辑(理论依据)是什么呢?
1、首先是代际转移理论(参考《理性乐观派》): 资源(生产资料、生产力)有限, 但是我们整个社区都假设并坚信通过未来的科技进步将获得更高的资源利用能力、生产效率; 例如石油、煤炭的过度开采虽然会造成环境破坏, 但是我们相信未来的科技进步会找到新的能源, 并填补过度开采造成的破坏. (这点和递弱代偿理论异曲同工)。
参考 《德说-第96期, 代际转移与创新、集智(全球脑)》
2、第二个是经济周期, 以及宏观调控手段, 维持适度的通胀, 有利于经济的发展. 需要刺激经济的时候通常会有降低商业银行在央行的存款准备金率, 让商业银行可以贷出去更多钱, 可能引起通胀. (货币总量增加. 参考阅读:《金融简史》.). 但是
有些国计民生相关商品并不是完全市场化的, 所以这些商品通胀率比较可控, 否则会引发动乱.银行放水时也需要有法律法规和相关监管配合, 防止投机倒把贷一堆钱去炒作钱滚钱. 失去了放水的意义. 放水可能希望的是去消费、投入研发或采购生产资料、促进生产....
3、第三是数学支撑: 微笑曲线
参考 《德说-第56期, 微笑曲线 - 基金定投》
4、严格的止盈线. 可不要太贪, 过了止盈线就卖掉, 重新开始定投.
5、不要过于分散, 例如就选一个投资对象(例如50, 500指数), 而且你的钱要能cover这只对象的整微笑周期.
有了理论支撑, 本文将使用真实数据以及PolarDB来证明巴菲特的投资理念.
证明过程
1、下载数据
巴菲特推荐的是投资指数, 单只股票可能经营不善而下市. 但是指数是由大量头部或者行业头部或者规模相似的数十或数百只股票构成, 比投资单只股票风险更低.
另外需要说明的是定投没有一次必须买N股的限制; 而股票交易有这个限制.
定投指固定周期、固定的投入资金、固定的买入标的; 例如每个交易日每次投入500买入中证500, 当期买入份额 = 500/当时一份该标的的价格;
为了让数据更有说服力, 我随意选了几只具有不一样鲜明特征的股票: 茅台、海立、ST热电.
其中两只比较糟糕的股票的数据, 现在已经跌破发行价了, 虽然如此, 巴菲特投资理念依旧成立.
下载20010101年到20220901的历史收盘价数据:
https://zhuanlan.zhihu.com/p/65662875
curl "http://quotes.money.163.com/service/chddata.html?code=0600519&start=20010101&end=20220901&fields=TOPEN;TCLOSE" -o ./0600519.SH.csv
curl "http://quotes.money.163.com/service/chddata.html?code=0600619&start=20010101&end=20220901&fields=TOPEN;TCLOSE" -o ./0600619.SH.csv
curl "http://quotes.money.163.com/service/chddata.html?code=0600719&start=20010101&end=20220901&fields=TOPEN;TCLOSE" -o ./0600719.SH.csv
转换处理一下编码的问题:
iconv -f GBK -t UTF-8 ./0600519.SH.csv > ./1.csv
iconv -f GBK -t UTF-8 ./0600619.SH.csv > ./2.csv
iconv -f GBK -t UTF-8 ./0600719.SH.csv > ./3.csv [postgres@d6b4778340d1 ~]$ head -n 5 1.csv 2.csv 3.csv
==> 1.csv <==
日期,股票代码,名称,开盘价,收盘价
2022-09-01,'600519,贵州茅台,1912.15,1880.89
2022-08-31,'600519,贵州茅台,1860.1,1924.0
2022-08-30,'600519,贵州茅台,1882.35,1870.0
2022-08-29,'600519,贵州茅台,1883.0,1878.82
==> 2.csv <==
日期,股票代码,名称,开盘价,收盘价
2022-09-01,'600619,海立股份,6.77,6.67
2022-08-31,'600619,海立股份,7.06,6.77
2022-08-30,'600619,海立股份,7.3,7.19
2022-08-29,'600619,海立股份,7.0,7.26
==> 3.csv <==
日期,股票代码,名称,开盘价,收盘价
2022-09-01,'600719,ST热电,5.01,4.9
2022-08-31,'600719,ST热电,5.34,5.05
2022-08-30,'600719,ST热电,5.38,5.32
2022-08-29,'600719,ST热电,5.33,5.38
...
2、导入到PolarDB for PostgreSQL. (如果你没有安装, 可以参考文末一键安装PolarDB.)
psql -h 127.0.0.1 -- 建表
create table t1 (c1 date, c2 text, c3 text, c4 numeric, c5 numeric);
-- 导入
copy t1 from '/home/postgres/1.csv' ( format csv, HEADER , quote '"');
-- 清除干扰数据
delete from t1 where c4 =0 or c5=0 ;
create table t2 (c1 date, c2 text, c3 text, c4 numeric, c5 numeric);
copy t2 from '/home/postgres/2.csv' ( format csv, HEADER , quote '"');
delete from t2 where c4 =0 or c5=0 ;
create table t3 (c1 date, c2 text, c3 text, c4 numeric, c5 numeric);
copy t3 from '/home/postgres/3.csv' ( format csv, HEADER , quote '"');
delete from t3 where c4 =0 or c5=0 ;
3、分析结果
你可以随意选择投入开始日期(建议选择一个较长的时间窗口, 证明跨过了一个周期), 经济越低迷的时候股价越低, 从那时开始投入是比较好的. 走低不用怕, 周期过去后总会上来的. (不经历风雨, 怎么见彩虹?)
如果你的投入周期足够长, 可以从任意时间开始投入, 总会遇到可以收割的时候.
绘制以上三只股票的数据曲线, 我们随意选择几个定投的起点: 高点, 中点, 低点. 每个交易日投入500元, 一年约12万左右. 观察一下定投多久可以开始盈利?
选定投起点如下:
茅台:
where c1 >= '2021-02-10' -- 最高位开始定投
where c1 >= '2014-08-17' -- 低位开始定投
where c1 >= '2018-02-02' -- 中位开始定投
海立:
where c1 >= '2015-06-15' -- 最高位开始定投
where c1 >= '2013-07-09' -- 低位开始定投
where c1 >= '2011-09-01' -- 中位开始定投
ST热电:
where c1 >= '2015-11-24' -- 最高位开始定投
where c1 >= '2008-11-03' -- 低位开始定投
where c1 >= '2018-02-01' -- 中位开始定投
设置止盈线:
不要太贪, 例如我们就选10%; (银行非常好的保本理财基本上也就4%到5%;)
SQL 如下:
select
c1, -- 日期
price, -- 当前价
round(cost_avg,4), -- 成本价
round(100 * ((price-cost_avg)/cost_avg) / ((c1-start_c1+1)/365.0), 2) as revenue_year_ratio, -- 年化收益率
rn * 500 as invest, -- 截止当前总投入. (假设每个交易日投入500)
round(rn * 500 * (1+ (price-cost_avg)/cost_avg ), 2) as v_value, -- 当前持有股票的价值
round(rn * 500 * (1+ (price-cost_avg)/cost_avg ), 2) - rn * 500 as v_make_money, -- 赚了多少钱
c1-start_c1 as keep_days -- 持有天数
from
(
select
c1,
c5 as price,
avg(c5) over w as cost_avg,
min(c1) over w as start_c1,
row_number() over w as rn
from t1 -- 茅台
where c1 >= '2021-02-10' -- 最高位开始定投
-- where c1 >= '2014-08-17' -- 低位开始定投
-- where c1 >= '2018-02-02' -- 中位开始定投
-- from t2 -- 海立
-- where c1 >= '2015-06-15' -- 最高位开始定投
-- where c1 >= '2013-07-09' -- 低位开始定投
-- where c1 >= '2011-09-01' -- 中位开始定投
-- from t3 -- ST热电
-- where c1 >= '2015-11-24' -- 最高位开始定投
-- where c1 >= '2008-11-03' -- 低位开始定投
-- where c1 >= '2018-02-01' -- 中位开始定投
-- 经济越低迷的时候股价越低, 从那时开始投入是比较好的.
-- 如果你的投入周期足够长, 可以从任意时间开始投入, 总会遇到可以收割的时候.
window w as (order by c1 range between UNBOUNDED PRECEDING and CURRENT ROW)
) t
where round(100 * ((price-cost_avg)/cost_avg) / ((c1-start_c1+1)/365.0), 2) >= 10 -- 大于止盈线年化10%的有多少天? 你可以自己设置.
order by c1;
结果如下:
茅台:
日期, 当前价格, 成本价, 年化收益率, 总投入, 股票价值, 赚了多少, 持有天数
c1 | price | round | revenue_year_ratio | invest | v_value | v_make_money | keep_days
------------+---------+-----------+--------------------+--------+-----------+--------------+-----------
2021-04-02 | 2162.0 | 2101.1988 | 20.31 | 16500 | 16977.45 | 477.45 | 51
..............
2021-12-27 | 2131.82 | 1946.7208 | 10.81 | 106000 | 116078.75 | 10078.75 | 320
2021-12-28 | 2138.18 | 1947.6197 | 11.09 | 106500 | 116920.24 | 10420.24 | 321
高点开始定投 (24 rows) 个交易日, 超过年化10% 低点开始定投 (1735 rows) 个交易日, 超过年化10%
中点开始定投 (749 rows) 个交易日, 超过年化10%
海立:
高点开始定投 (126 rows) 个交易日, 超过年化10%
低点开始定投 (521 rows) 个交易日, 超过年化10%
中点开始定投 (233 rows) 个交易日, 超过年化10%
ST热电:
高点开始定投 (127 rows) 个交易日, 超过年化10%
低点开始定投 (524 rows) 个交易日, 超过年化10%
中点开始定投 (85 rows) 个交易日, 超过年化10%
思考一下保险公司的很多投资型保险理财产品是靠什么盈利的? 例如每年投一两万, 连续投20年, 然后...年化利息大概3左右, 同时有一些大病保险赔款(基本上就是不死也残的那种).
止盈点计算方法
前面例子计算年化收益的方法实际上是不准确的, 因为不是每一笔钱都和第一笔一样投入了 (c1-start_c1+1)/365.0 年.
实际年化收益大约是2倍于以上算法:
-- 年化收益率
round(100 * ((price-cost_avg)/cost_avg) / ((c1-start_c1+1)/365.0), 2) as revenue_year_ratio,
为什么呢?
假设每天投入100元, 按日计息, 一笔钱存1年的年化收益为5%.
1年后实际得到的利息为:
postgres=# select sum(500), -- 总投入
sum(500)*0.05, -- 第一天就全部存入的年化收益
sum(500*0.05*(during/365.0)) -- 每天定投的年化收益
from generate_series(1,365) as during; sum | ?column? | sum
--------+----------+-----------------------------
182500 | 9125.00 | 4575.0000000000000000000000
(1 row)
得到结果:
1年共投入 182500
如果第一天一次性投入 182500, 那么利息是 9125
如果是每天投入 500, 那么利息是 4575
postgres=# select 9125.00/4575.0;
?column?
--------------------
1.9945355191256831
(1 row)
所以, 定投的实际年化利息目标大概应该设置为一把梭哈的一半左右.
定投的止盈点正确计算方法
例如你期望的年化收益是10%, 那么按本文提供的算法, 定投的止盈点应该设置为5%就卖出.
如果再考虑复利, 那么止盈点是动态变化的, 例如未考虑复利的止盈点是5%, 那么考虑复利则和持有年限有关.
postgres=# select (1.05^5 - 1)/5;
?column?
------------------------
0.05525631250000000000 -- 持有5年, 考虑复利止盈点 ~= 5.5%
(1 row)postgres=# select (1.05^10 - 1)/10;
?column?
------------------------
0.06288946267774414000 -- 持有10年, 考虑复利止盈点 ~= 6.3%
(1 row)
本期彩蛋- PG中文社区年度峰会7.12,13在杭州举行,欢迎报名参加
下周五6.28在长沙还有一场沙龙,欢迎附近的小伙伴来参加
文章中的参考文档请点击阅读原文获得.
欢迎关注我的github (https://github.com/digoal/blog) , 学习数据库不迷路.
近期正在写公开课材料, 未来将通过视频号推出, 欢迎关注视频号: