2021年1月

万科

万科买点
万科买点

去年5月,因为提前还贷,全面退出了A股,随后就是一轮上涨行情,当初持仓的美的早已翻倍,可惜全错过了。

2021年第1个月,又开始入局A股了。

第一只选了万科,其实对万科也没什么研究,要说决策依据,有几个:

  1. 雪球大V小七滚雪球推荐并有持仓。他有不少分析,认可。
  2. 去年下半年出台的房企融资三条红线,利好龙头和稳健经营的房企,万科是其中之一。
  3. 2020年大盘涨的不错,但房地产没涨,万科也没涨。行业轮动,2021也该轮到了。
  4. 1.59的市净率外加12倍的市盈率,估值不高。利润也在年年增长,财务稳健。

总的来说,估值不高、风险可控。持仓比较安全,至于能赚多少,那看人品了,强求不来。如果下跌,那就继续加仓。

小米

小米买点
小米买点

与万科不同,小米买的还是有点担心的。

看好的理由也有有两条:

  1. 我最近几个月买了小米扫地机器人、鹿客智能锁、小米路由器和小米即热饮水机,都是小米或小米生态的。我意识到,当我要买一个一两千块以内的智能家居用品,又不想浪费时间看评测、挑选时,就会直接买小米。这有点像优衣库的品牌心智,「性价比」、「质量还可以」、「买小米未必最好,但多半不会错」。我觉得这个心智特别牛逼,也是我看好小米最重要的原因。
  2. 华为在海外折戟,小米趁机补上。小米去年下半年暴涨,主要得益于海外销量的大涨。实际上,在跨境电商AliExpress上,「xiaomi」长期位于3C的top词。

但也有些担心:

  1. 去年下半年到现在,已经涨了两倍多,当前估计并不低了。
  2. 我和我身边的人用小米IoT产品的不少,但用小米手机的却不多,我自己也不用小米手机。目前小米营收中,手机占比60%,IoT只占27%,除非有一天IoT的营收能超越手机,否则小米的估值还是受到手机销量的重大影响。
  3. 手机在一定程度上是IoT的中心,如果手机失利了,IoT也必然受损。
  4. 小米手机的问题,主要还在于自研能力,无法真正拿下高端市场。这点华为做的特别好,其策略就两点:一是自研芯片,除了实质的性能体验外,还塑造了自身高科技的企业形象;二是将拍照做到极致,我注意到外出集体活动需要拍照时,大家就会问「谁有华为手机,用华为手机拍」。希望小米手机在性价比之外,在功能和体验上,真正打造出自己的特色。
  5. 芯片受制于美国,是另一个潜在的,可能成为致命的风险。

同样总结一下,看好小米在IoT领域的品牌心智,以及快速占领华为海外市场的能力。而风险则在于手机业务没有特色,不确定性强,同时当前估值不低。——但我还是没忍住,建了仓,且观察一段时间。

快一个月没更博客了,只是因为沉迷国漫,看的天昏地暗。

看了多少自己都不记得了,豆瓣标记的有:

  1. 星辰变 第二季
  2. 武庚纪 第一季
  3. 武庚纪 第二季(以上都是12月底看的)
  4. 武庚纪 第三季(以下都是1月看的)
  5. 独步逍遥
  6. 地灵曲 第一季
  7. 地灵曲 第二季
  8. 武动乾坤 季一季
  9. 武动乾坤 第二季
  10. 凡人修仙传
  11. 元龙
  12. 仙风剑雨录
  13. 绝世武魂
  14. 全职高手 第一季
  15. 全职高手 特别篇
  16. 灵笼
  17. 画江湖之不良人 第二季(为了补第三季,二刷)
  18. 画江湖之不良人 第三季
  19. 雪鹰领主 第一季
  20. 雪鹰领主 第二季
  21. 画江湖之灵主(二刷)

竟然这么多,有点大学时刷日剧港剧的感觉。

大部分看完就忘了,几个值得推荐的:

首推《灵笼》,确实刷新了我对国漫剧情的认知,科幻题材,讲世界末日,最后一批人类的生存,有点美剧的感觉。剧情也有不少硬伤,但瑕不掩瑜。

其次是《画江湖之不良人》系列,说来是我入坑国漫的系列,2016年看完郑业成主演的剧版不良人不过瘾,找来动漫看,一发不可收拾。此前,一直觉得动漫是小朋友看的,哪怕是迪士尼的动漫电影,多半也是合家欢剧情,没什么意思。《不良人》改变了我的印象,而若森科技,成了我第一个叫的出名字的国漫公司。

第三则是《画江湖之灵主》,也是若森科技的,2016年看过,今天刚二刷完。片头就写着适合18岁以上观看,画面有些血腥暴力,但并不过份,即便如此,还是被各大平台下架了(据说剧情涉及迷信内容也是下架原因之一)。期待的续集也没有了。

《全职高手》,也看过杨洋的剧版,都不错。没有感情线的动漫,还真是少见。

《凡人修仙传》和《地灵曲》也还值得一看。

剩下的,没留太深刻的印象。

题外话,这些国漫不少是阅文集团作品改编,IP真是个宝藏,更坚定了我持仓阅文的信心。

文章提及的「今年」均指2020年,「去年」自然是2019年了。

例行总结,前几年的:

今年因为新冠疫情,外部环境不太好。我个人还算幸运,生活并没有受到太大影响,而且工作和投资都比预期的好,工作上完成了晋升,投资则获得了超过60%的收益。

工作

年初工作状态极差(2019年个人总结十分焦虑),当时所在业务的合作关系过于复杂,单纯如我hold不住。心里盘算着拿了年终奖后离职,一度看了「你为什么从阿里巴巴集团离职」下很多回答,对一些回答很有共鸣,比如GeekPlux的。也因此,我原本对绩效没有期待,却没想到H(主管)和L(二级主管)给了我375并让我准备晋升,弄得有点不好意思离职了。

但我明白,当时的困境并不是好绩效能解决的,最终还是提了离职,在与L沟通时,他提议让我留下来换到搜索业务试试,一来是我的老本行,二来搜索业务没有复杂的合作关系。综合考虑疫情和难得的晋升机会,最终决定留下来了,顺利完成了晋升也换到了搜索团队。下半年在新团队,未必做的很好,但顺利了很多。

如果说2020年最感谢谁,那一定是H和L两位老板,给了我极大的认可和帮助,也包容了我许多不足。

投资和财务

2019年总结中给2020年定的投资目标是:收益率20%,实际收益率61.69%。前几天投资总结一文,有详细内容,不再赘述。

从2019年7月开始使用beancount记账,2020是第一个完整的记账年度,分析账本挺有趣,摘录一些:

  • 支出最多的月份是4月,因为年终奖纳税;其次是12月,因为一些固定资产/投资折旧(我会对一些资产按年折旧);再次是9月,因为国庆去川渝玩了一圈,机酒等大额支出发生在9月。
  • 车子要花多少钱

    • 油费第一、停车费第二、保险第三、保养第四。
    • 日均油费17.4元。
    • 全年加油30次,月均超过2次,其中一次是四川旅行租车加的油
  • 在吃上,太专一了

    • 公司食堂379次
    • 4月开始在一家包子铺吃早餐,共光顾180次
    • 星巴克86次
  • 衣服基本没怎么花钱,理发6次,形象老土。
  • 花了5000多元在软件服务上:包括AWS、阿里云、苹果icloud、优爱腾会员、财新网会员、以及其它一些付费APP
  • 买了1200多元的书,但只看了2本。
  • 12月、1月和8月的电费,超过其它月份5倍以上,空调吃电太恐怖了。
  • ……

beancount支持BQL,类似SQL查询语句,特别强大,如果平时记账规范,可以挖掘很多有趣的数字。

生活

写到生活,总觉得平淡无奇,事情嘛,也有一些,比如:

  • 春节见了女朋友家长。
  • 国庆去四川旅行,足迹第一次延伸到西南地区。
  • 11月1日领养了一只猫咪(9月2日生日),取名年年。

满了30岁,反而没有前些年那么焦虑。不是因为通透了,只是不再抱有太多期待。好也好不到哪去,坏也坏到哪去,就是大多数人的人生。又想起罗曼·罗兰说的:

大多数人在20到30岁就已经过完自己的一生。一过了这个年龄段,他们就变成自己的影子,以后的生命只是在不断重复自己。

但,又隐隐觉得,不甘如此。

博客

今年写了69篇博客,相比去年翻倍了,基本实现了周更。

内容仍然偏生活化,没有特定主题。影评、互联网思考、生活旅行、投资日记都有。最满意的是每个月写的股票复盘,希望能够坚持下去。毕竟,仍然怀着「交易为生」的梦想。

年初给博客加了百度统计代码,全年来看,日均访问UV很少,剔除掉自己的访问,估计也就十几个吧。今年重新开了公众号,年初定了目标1000个粉丝,实际39个,汗。作为一个产品经理,最讨厌的便是所谓「流量思维」,却给自己定了这么蠢的目标,来年取消。

虽然访客不多,但有几位一直保持着互访,挺好。

书影行

书只读了两本,邱国鹭的《投资中最简单的事》和达利欧的《原则》,都很推荐。前者通俗易懂,非常适合炒股入门;后者讲的一些工作和生活原则,值得学习,只是觉得达利欧的行文,略显啰嗦。

影视剧看了55部,绝大多数剧情都回忆不起来了。值得推荐的有:

其中《天道》都不知看了第几遍了,向往丁元英的投资境界。

另外值得一提的是,本年度依然在追《斗罗大陆》,其实剧情已经没什么吸引力了,更像是一种习惯,一种有始有终的执念,毕竟已经追了一年多了。

2021

2021年希望更聚焦一些,只定三个目标:

  • 投资收益30%
  • 年度阅读主题:心理学。至少精读《心理学与生活》和《社会心理学》
  • 跑步/徒步累计100公里

最后年年压轴。

2020年1-11月都有写复盘,依次如下:

12月不单独写了,与全年总结合并。

综合收益

综合收益
综合收益

上表是2020年每月的收益记录,包括当月和年内两个统计口径。

  • 港美股:收益大部分来自上半年,下半年收益较少。累计61.69%,算是跑赢美股各大指数,但还是输给了A股创业板指,创业板指太恐怖了。
  • A股:因为急用钱,A股5月便全部退出了,当时唯一持仓美的集团,现在已经翻倍了,如今看当时的决策不够明智。
  • 基金:退出A股后,又不想错过A股红利,所以增加了基金定投。消费、医药、5G和沪深300指数各一只。5G和医药拖了后腿,整体收益只有10.56%,跑输指数。

A股退出、基金又是无脑定投,所以我大部分时间在研究港美股。下图港美股帐户的全年走势。12月底中芯国际拉了一把,否则全年收益在50%左右。但元旦后,中芯国际又萎了。

富途账户
富途账户

股票交易

12月交易了两笔,阅文集团和中芯国际各加仓一次,加仓成本分别是57.6和19.42。

全年来看,交易过的个股如下,目前仅持仓阅文集团和中芯国际。

2020年个股汇总
2020年个股汇总

基金交易

2020年基金汇总
2020年基金汇总

12月继续定投4只基金,无其它操作。

几只重点股票

1、最成功与最失败的交易

B站交易过程
B站交易过程

都是B站。

上图显示了B站的交易过程,交易过两轮。

第一轮在2019年15元不到的时候就建仓了,20多下车,后来又第二次上车,但可惜的是,第二次上车也只在30刀就清仓了。两轮的累计收益预计也有100%左右,但相比于现在100刀的价格,还是少赚了很多。

2020年关于B站的两篇记录:

2、运气最好的交易

爱奇艺交易过程
爱奇艺交易过程

是爱奇艺。上图是交易过程,同样有两轮交易。

第一轮,买入不久传出腾讯收购爱奇艺而大涨,并在最高点抛售。大幅回调后重新建仓,并开始缓慢爬坡,但因第三季度不理想的财报而开始下跌。下跌过程中,我也逃出来了,虽然没有逃在最高点,但也不是最低点。保住了部分利润。如果继续持仓,现在则是亏损的状态了。

2020年关于爱奇艺的两篇记录:

3、最自信的交易

阅文集团交易过程
阅文集团交易过程

是阅文集团。这只股票我持仓两三年了,在二三十的位置,我推荐给过很多人。只凭一个信念:版权是无价的,而且,我会阶段性的迷恋腾讯动漫(大多是阅文作品改编的),并充值腾讯会员。

虽然阅文涨幅不是最多的,但因为仓位重,今年在阅文上赚的金额最多。不出意外,我会继续持有。

2020年关于阅文的两篇记录:

4、最投机的交易

中芯国际的交易过程
中芯国际的交易过程

是中芯国际。

阅文、B站和爱奇艺,都是互联网公司,我非常熟悉他们的业务。所以在买入时,我清楚自己买了什么。对中芯国际则不同,我并不熟悉半导体行业。所以,买中芯国际有很强的赌的成份,赌中国的国运昌盛。如果冷静下来,其实中芯国际的不确定性非常高,特别是如今复杂的国际关系之下,基本美国一句话,就能决定中芯国际的生死,对投资来说,这是非常不利的局面。

2020年关于中芯国际的记录:

策略和心理

1、长期看好与短期(大幅)波动

今年的交易中,我特别喜欢把B站和爱奇艺放一起对比。这两只,我都非常看好的。但我都没有持仓太久。在B站上,我后悔卖掉了,但在爱奇艺上,我又非常庆幸逃出来了。无论是后悔或庆幸的价格,放在5年的框架上也许都不值一提,但关键的问题在于:

长期看好,但短期出现30%甚至50%回调的时候,该如何自处。特别的,当这种回调触及到成本线时,还有多大信心继续持有。

即使是非常坚定的看好,50%回调也不改信心。但面对50%波动背后的利润空间,有几个人不动心。我今年就碰到不只一次,从30%浮盈直接回调到成本线,实在是太折磨人了,基本上都没扛住,最终在成本线退出。有退出继续下跌的,也有退出后马上上涨的。

小幅回调,其实已经做到心如止水了。面对大幅回调,我想可能需要弄清楚两点:

  • 回调的原因,有没有基本面的问题。比如,最近阿里巴巴就回调了30%左右,我觉得它的基本面没有问题,这种回调只是暂时的。
  • 摆正心态,追求合理的利润,不妄想抓到每一个波动。30%的波动利润空间很大,但应该明白,我们不可能抓住每个波动,不可能拿到所有的利润。——我原本对61.69%的收益不太满意,但想到这里,也就释然了。

2、白马股策略

我理解的白马股是指那些长期绩优,市场竞争优势已经形成的公司,通常是行业top级。比如茅台、美的、阿里、腾讯、京东等。

这些股票,我觉得很多时候是可以闭着眼睛买的,我当时美的的成本就比较高,买入后一直跌(没记错的话,浮度一度达到30%以上),但我丝毫不会担心,因为我相信他们一定会涨回来,最后无非是赚多赚少的问题。投资中,这种「安心」的感觉很重要。

当然,如果真的闭着眼睛买,年化收益就全看运气了。其实,这类股票经常会因为一些负面新闻导致短期大幅回调(经常能在30%以上),此时,就是最佳的出手时机。例子也不少,比如:

  • 2018年初:Facebook数据泄露事件
  • 2018年底:京东的刘强东事件
  • 2020年底:阿里遭遇反垄断调查事件——已经跌了30%了,后续行业让我们拭目以待

趁负面消息抄低白马股,是非常容易的策略,只要心态平和,实现年化20%的收益不是难事。当然,要实现三年十倍股,也是不太可能的。

3、黑马股策略

这里所说的黑马,是那些市值不高,但成长性好,未来有机会翻10倍的股票。

这个策略我也还在摸索,特别难,但有一点是清楚的:白马股,不熟悉的也能买,多半也不会出事。但黑马股,一定要非常熟悉公司及对应的行业。这也意味着,并没有简单的套路,必须深入研究公司和行业。

2021的期许

  • 30%以上收益。
  • 继续降低交易频次。
  • 可能的话,找出下一个B站。

本博客有个微言小义系列,其实是个人微博的备份,但一直是手动维护,有些麻烦。这两天捣腾了一个Python脚本,能自动抓取微博内容并生成微言小义格式的文章,昨天发布的微言小义(2020.12)已用这个脚本重新生成。

需要用到:

  1. 登录微博获取cookie和user-agent
  2. 微博翻页接口:https://weibo.com/ajax/statuses/mymblog?uid=5384740764&feature=0&page=1
  3. 长微博展开接口:https://weibo.com/ajax/statuses/longtext?id=JyRAoxq9w
  4. 第三方Python库requests

为实现真正的存档,实现了:

  1. 尽可能获取全文
  2. 获取了转发微博
  3. 下载图片到本地
  4. 因微博的短链被拦截,尽可能将短链替换为原始链接

非科班,代码能力很烂,脚本只是在我的电脑上(macOS+Python3.8)跑通了,完整代码分享如下:

import requests
from datetime import datetime
import random
import time

# 设定时间,只抓取YYYYMM之后的内容
YEAR_MONTH = datetime.strptime('202012','%Y%m') 

# 换上自己的cookie和user-agent
HEADERS={
    'cookie': '',
    'user-agent': ''
}

# 获取单条微博内容,不含转发内容。
def get_one_weibo(wb_json_obj):
    mblogid = wb_json_obj['mblogid']
    wb_url = 'https://weibo.com/5384740764/' + mblogid
    created_at = datetime.strptime(wb_json_obj['created_at'].replace('+0800',''),'%a %b %d %H:%M:%S %Y')
    created_at_str = time.strftime('%Y-%m-%d %H:%M')
    user_name = wb_json_obj['user']['screen_name']

    if wb_json_obj['isLongText'] == True:
        long_data = requests.get('https://weibo.com/ajax/statuses/longtext?id='+mblogid,headers=HEADERS).json()['data']
        text_raw=long_data['longTextContent'].replace('\u200b','').strip()
        if 'url_struct' in long_data.keys():
            text_raw=replace_url(text_raw, long_data['url_struct'])
    else:
        text_raw = wb_json_obj['text_raw'].replace('\u200b','').strip()
    
    if 'url_struct' in wb_json_obj.keys():
        text_raw = replace_url(text_raw, wb_json_obj['url_struct'])
    
    
    pic_ids = wb_json_obj['pic_ids']
    pic_text = ''
    for pic_id in pic_ids:
        pic_url = wb_json_obj['pic_infos'][pic_id]['original']['url']
        pic_name = download_pic(pic_url)
        pic_text = pic_text + '![[' + pic_name + ']]' + '\n'
    
    wb_text = '@{user_name}:{text_raw}\n\n{pic_text}'.format(
        user_name=user_name, 
        text_raw=text_raw ,
        pic_text=pic_text
    ) 
    
    return {
        'wb_time': created_at,
        'wb_url': wb_url,
        'wb_user': user_name,
        'wb_text': wb_text
    }

# 获取单条微博,若有转发含转发内容
def get_single_weibo(wb_json_obj):
    org_weibo=get_one_weibo(wb_json_obj)
    if 'retweeted_status' in wb_json_obj.keys():
        re_weibo=get_one_weibo(wb_json_obj['retweeted_status'])
        full_text = '* [{time}]({url})\n\n{org_text}\n> {re_text}\n\n'.format(
            time=org_weibo['wb_time'],
            url=org_weibo['wb_url'],
            org_text=org_weibo['wb_text'],
            re_text=re_weibo['wb_text'].strip().replace('\n','<br/>')
        )
    else:
        full_text = '* [{time}]({url})\n\n{org_text}\n\n'.format(
            time=org_weibo['wb_time'],
            url=org_weibo['wb_url'],
            org_text=org_weibo['wb_text'],
        )

    if 'url_struct' in wb_json_obj.keys():
        full_text=replace_url(full_text, wb_json_obj['url_struct'])
        
    return {
        'wb_time': org_weibo['wb_time'],
        'full_text': full_text
    }

 

# 获取一页微博,且要求时间在YEAR_MONTH(含)之后
def get_page_weibo(page_no,YEAR_MONTH):
    page_url = 'https://weibo.com/ajax/statuses/mymblog?uid=5384740764&feature=0&page=' + str(page_no)
    wb_req = requests.get(page_url, headers=HEADERS)
    if wb_req.json()['ok'] != 1:
        return {
            'page_no': page_no,
            'ok': wb_req.json()['ok'],
            'date_stop': False,
            'my_wb_list': []
        }
    else:
        wb_list = wb_req.json()['data']['list']
        my_wb_list = []
        date_stop = False
        for wb in wb_list:
            single_wb = get_single_weibo(wb)
            time = single_wb['wb_time']
            if time >= YEAR_MONTH:
                my_wb_list.append(single_wb)
            else:
                date_stop = True
        return {
            'page_no': page_no,
            'ok': 1,
            'date_stop': date_stop,
            'my_wb_list': my_wb_list
        }


# 获取一个月的微博
def get_month_weibo(YEAR_MONTH):
    month_weibo = []
    for page_no in range(1,100):
        time.sleep(random.random()*5)
        page_weibo = get_page_weibo(page_no, YEAR_MONTH)
        month_weibo.append(page_weibo)
        if page_weibo['date_stop'] == True:
            break
    return month_weibo


# 下载图片到pic文件夹,图片名加weibo-yyyymm前缀,并且返回图片的名称
def download_pic(url):
    pic_name = 'weibo-' + YEAR_MONTH.strftime('%Y%m') + '-' + url.split('?')[0].split('/')[-1]
    pic_req = requests.get(url)
    with open('pic/'+pic_name, 'wb') as f:
        f.write(pic_req.content)
    return pic_name

# 将微博文本中的短链替换为原始长链
def replace_url(text, url_struct):
    for url in url_struct:
        md_url='[{url_title}]({long_url})'.format(url_title=url['url_title'], long_url=url['long_url'])
        text=text.replace(url['short_url'], md_url)
    return text


# 将微博写入md文件,并返回抓取失败的页面
def work():
    month_weibo = get_month_weibo(YEAR_MONTH)
    md_content = ''
    page404 = []

    for page in month_weibo:
        print(page['page_no'],': ',page['ok'], '\n')
        for weibo in page['my_wb_list']:
            md_content = weibo['full_text'] + md_content
            
    file_name = '微言小义({time}).md'.format(time=YEAR_MONTH.strftime('%Y%m'))
    with open(file_name,'w') as f:
        f.write(md_content)
        
work()

print('done')