Python技术

Python技术 's Blog


  • 首页

  • 标签

  • 归档

  • 关于

派森酱带你用 Python 实现中间人攻击

发表于 2021-02-08 | 分类于 python

封面

中间人攻击,顾名思义,就是客户端和服务端的通信被第三者拦截了,这样通信双方的通信内容就会被窃听。你可能会认为,没关系啊,窃听就窃听呗,反正又没什么重要的信息,那如果我告诉你,攻击者不但可以窃听你们的通信内容,甚至可以修改你们的通信内容,你还会这么认为么。

阅读全文 »

程序设计神器 之 实体

发表于 2021-02-07 | 分类于 python

程序处理的是概念

程序是什么?

简单说,程序是处理数据的计算机代码

几乎所有的程序都可以分为三部分

输入–> 处理 –> 输出

程序可以理解成一个加工处理数据的过程,或者工具

那么被加工的数据又是什么呢?

阅读全文 »

看到他留给世界的最后一篇作文,我慌了!

发表于 2021-02-06 | 分类于 python
1

据新浪娱乐讯,2月3日,赵英俊家人发表讣告,称赵英俊因病医治无效,于2021年2月3日14时33分在北京病逝,享年43岁。

阅读全文 »

如何像黑客一样优雅的使用命令行

发表于 2021-02-01 | 分类于 python

封面

提起黑客,我们脑海中浮现的第一个画面就是一动不动的坐在电脑前,眼睛注视着屏幕,伴随着手指在键盘上飞快的移动,屏幕上的字符也在不停闪烁,终于,在按下 Enter 键的那一刻,整栋大楼的系统瘫痪了,是不是觉得很酷呀。

阅读全文 »

个人品牌,我用 Python

发表于 2021-02-01 | 分类于 python

经常会有同学问,如果不是在工作中使用,学习 Python 还有什么用?难道只能自娱自乐吗?

当然不是,而且 Python 技能还是一个提升自身价值的超级法宝

阅读全文 »

吐血整理的Python 面试题,请务必收藏!

发表于 2021-01-28 | 分类于 python

年关将至,给年后准备跳槽的准备一份面试指南,希望大家在涨薪和成神的路上多一点指引!

阅读全文 »

用 Python 画了几面国旗

发表于 2021-01-27 | 分类于 python

国旗是一个国家的象征,它可以反映一个国家的特色和传统,国旗起源于近代的欧洲,是一个国家主权意识不断增强后的必然产物,本文我们使用 Python 来画几面国旗,使用的 Python 库是大家比较熟悉的 turtle。

阅读全文 »

疯狂!领证还要写Python!!!

发表于 2021-01-26 | 分类于 python

决定和女朋友去领证了,心里那个激动啊,无以言表!我们俩都是比较随性的,准备拿到户口本就去领。

可谁知女朋友回家拿户口本的时候,跟我说:最近可能领不了了!

what?到手的鸭子要飞了?我心里咯噔一下。

询问后才知道,丈母娘说领证可以,但是要选择一个良辰吉日,要求有俩:一个是看万年历,选取宜“婚假”的日子;一个是需要选择农历的双数日期,双数代表吉利。

听了之后,我拍着胸脯说没问题。接着准备去翻万年历了,可不想这时候女朋友来一句:你个呆子,还准备一天天地去翻啊?写个小程序不就1秒钟的事吗?

我拍了拍脑袋,对哦,还是老婆聪明!话不多说,打开电脑就开干。

阅读全文 »

强大!用 60 行代码自动抢微信红包

发表于 2021-01-25 | 分类于 python

春节来到,红包们大概率在微信各大群中肆虐,大家是否都一样不抢到红包们心里就感觉错过了一个亿,可总会被这事那事耽误而遗憾错过,下面用 Python 写一个自动抢红包代码

阅读全文 »

快到春节了,用 Python 实现一场烟花秀

发表于 2021-01-20 | 分类于 python

春节的脚步越来越近了,每逢春节很多地方都会燃放烟花来增添节日的气氛,然而因环境污染的加剧,近年来不少地方已经禁止燃放烟花了,为了弥补这个遗憾,本文我们来看一下如何使用 Python 来实现一场烟花秀。

阅读全文 »

我擦!发红包遇到了微信抖动!

发表于 2021-01-19 | 分类于 python
0

下午和老婆手牵手心连心去“好时光”照相馆拍照片,记录我们的美好时刻。

拍完一组照片,在等待摄影师修图的时候,老婆站在我身后给我捶背,说我开车辛苦了,给我揉揉肩捶捶背。这待遇真是羡煞了路人甲,作为男人,这种满足感也是无与伦比的。

这时候,作为一个男人,咱也不甘示弱:掏出手机,打开微信,点击“转账”,输入520,转账留言还不忘附一句“么么哒”。

一气呵成之后,我提醒老婆赶紧看微信,老婆打开微信,刷了几下,啥都没看到,跑来问我说,看什么呀?

我提高嗓门说:给你发了个大包,你赶紧领了,过时不候哈!

哪里有大包嘛?你看看,啥也没收到呀!

听到这句话,我愣了一下,随即冒了一丝冷汗:没收到?难道我发错人了?完了完了,赶紧检查一下,要是发到另一个女孩的微信上就跳进黄河也洗不清了!

我赶忙打开手机,确认了三遍,没发错,这才松了一口气。我说你看,我已经发过去了,你没接收到,你是不是信号不好,你连 WiFi 看看!

老婆连了 WiFi,也还是没看到。我打开手机微博,刷新内容都没问题,心理一百个为什么。。。

这时候修照片的老板娘(据说像某位明星)跟我们说,照片修好了,让我们看看。我们看了之后说很满意,把我严肃的表情修成了微笑,很棒!

接着老板娘让我加她微信,把底片发给我。我微信扫一扫二维码,添加了微信。可是老板娘等了半天,也没有收到好友请求。我又添加了一次,还是一样的结果。我不信邪,切换到了另一张联通 5G 卡,又添加了一下,结果同样没收到。

我就郁闷了,这都 4G 加 5G ,一共 9G 了,怎么还是收不到请求呢?

结果让老婆添加,一次性就成功了。

当时贼郁闷,炫耀的红包老婆没有收到,明星老板娘的微信也没加上,今天这人品是咋啦?

1

草草收场之后,我们离开了影楼,老婆路上还念叨着红包,看着她可怜兮兮的样子,我心疼啊,于是我又拿起手机转了一个 520 过去,为了区分,我特意在转账留言后面加了一个企鹅发爱心的表情。

这次发过去她就看到了,以迅雷不及掩耳之势点了红包。令人意想不到的是,她收了红包之后,马上又冒出来一个,也就是之前没收到的那个,这时候也出现了。毫无意外,以抢红包的手速马上又点了一次,欣喜若狂地对我说:谢谢老公,两个红包都收到了!

这杀千刀的微信,害人啊!微信余额总共才 1000 出头,这一下子掏空了,接下来日子怎么过啊!大家可以理解我此时内心的 OS 吗?

2

晚上,回到家刷微博,无意间发现“微信bug”上了热搜,看到微信官方的微博,才知道自己被微信坑了:

微信团队表示,今天14点左右,部分微信用户遇到了消息收取延迟情况,原因是系统抖动,目前已经修复完成。

微信团队还宽慰大家:你家网络应该没啥问题。

我内心想:我家网络是没问题,我家家庭和睦关系差点遭殃!

3

看了这个解释,作为技术人员,我的第一反应当然是去了解一下什么是“系统抖动”,我去网上搜索相关资料,解释是这样的:

如果低优先级进程所分配的帧数低于计算机体系结构所需的最小数量,那么必须暂停该进程执行。然后,应调出它的所有剩余页面,以便释放所有分配的帧。这个规定引入了中级 CPU 调度的换进换出层。

事实上,需要研究一下没有“足够”帧的进程。如果进程没有需要支持活动使用页面的帧数,那么它会很快产生缺页错误。此时,必须置换某个页面。然而,由于它的所有页面都在使用中,所以必须立即置换需要再次使用的页面。因此,它会再次快速产生缺页错误,再一次置换必须立即返回的页面,如此快速进行。

这种高度的页面调度活动称为抖动。如果一个进程的调页时间多于它的执行时间,那么这个进程就在抖动。

系统抖动的原因是什么呢?

操作系统监视 CPU 利用率。如果 CPU 利用率太低,那么通过向系统引入新的进程来增加多道程度。采用全局置换算法会置换任何页面,而不管这些页面属于哪个进程。

现在假设进程在执行中进入一个新阶段,并且需要更多的帧。它开始出现缺页错误,并从其他进程那里获取帧。然而,这些进程也需要这些页面,因此它们也会出现缺页错误,并且从其他进程中获取帧。这些缺页错误进程必须使用调页设备以将页面换进和换出。当它们为调页设备排队时,就绪队列清空。随着进程等待调页设备,CPU 利用率会降低。

CPU 调度程序看到 CPU 利用率的降低,进而会增加多道程度。新进程试图从其他运行进程中获取帧来启动,从而导致更多的缺页错误和更长的调页设备队列。因此,CPU 利用率进一步下降,并且 CPU 调度程序试图再次增加多道程度。这样就出现了抖动,系统吞吐量陡降,缺页错误率显著增加。结果,有效内存访问时间增加,没有工作可以完成,因为进程总在忙于调页。

在本次微信事件中,我们通俗的理解为:

所谓系统抖动(thrashing),是一个计算机专业名词,指的是虚拟内存方案中的一种现象,通常是因为内存或其他资源耗尽或有限,导致无法完成所要执行的操作。

当上述情况发生时,程序就会通过操作系统发出请求,操作系统则试图从其他程序中调用所需资源,导致新的请求不能得到满足。

系统抖动发生时,系统时间会消耗在低速的I/O上,更多地进行页面交换而不是指令执行,进而大大降低系统效率。

用大白话说就是:微信消息收发系统的资源不够用了。

今天虽然钱包空了,感觉损失了几个亿,并且差点好事变坏事,但是经历了一次微信的重大事件,而且学到了点新知识,也算是不小的收获了!

阅读全文 »

用 Python + Appium 的方式自动化清理微信僵尸好友

发表于 2021-01-19 | 分类于 python

随着微信的使用时间越长,微信好友也越来越多,有些好友将你删除了你也不知道。当我们发消息的时候会出现下面扎心的一幕,然后默默将他删除

阅读全文 »

比特币涨疯了,区块链是什么鬼?

发表于 2021-01-11 | 分类于 python

2020 年底,数字货币鼻祖,比特币,高歌猛进,突破了惊人的 3万美元,直逼4万美元,再一次引起世人的眼球,又是一场褒贬不一,血雨腥风……

我们作为有头脑、有理智、有技术的人,不能像大多数人那样趋之若鹜,看个热闹就完了。那么这么厉害的、建立在计算机和网络之上的比特币,它的底层技术是什么呢?又,是如何才能实现的呢?

今天,我们用不到 50 行的代码,了解和领略一下比特币底层技术 —— 区块链的魅力吧,另外还有在实际项目中的应用噢,让同事刮目相看的机会来了,开干

什么是区块链

简单来说,区块链就是一系列的记录的集合,可以理解成数据库,不同的是,这些记录直接都通过一种类型链的东西串联在一起

如果链上的一个环节出了问题,那么它后面的记录就有问题,因此必须保证链上的记录都是真实可靠的链在一起的

也就是,后面的记录加入之前,需要和前面的数据关联起来才能加入

可想而知,这样的方式可以有效地防止数据被篡改,比如前面的数据被修改后,后面的数据与前面的数据将不匹配,很快就可以发现

这就是区块链的基本概念,就在这个简单的概念上,区块链催生了新的、完全数字化的货币,这些货币并不是由中心控制系统控制的,而是分布在整个互联网上,如比特币和莱特币。

而且区块链技术还在不断地革新,例如以太坊,Mixin 等等

区块链的原理

区块链的概念看起来挺简单的,实现原理是什么呢?

这里就需要了解一个概念,那就是 数子签名,也可以叫做 不对称加密

因为信息是由一系列字符成的,对于一个区块的记录来说,也可以看出一系列的字符,比如一个表示姓名和年龄的字符串:

name:Tom;age:18

对这个字符串进行 Md5 加密(一种常用的数字签名算法),会得到类似这样的字符串:

1
2
3
4
5
6
from hashlib import md5

m = md5()
m.update(b"name:Tom;age:18")
m.hexdigest()
# 'ca8d85b134922fe48d17bf36ceb38046'  当前记录的特征码

可以理解为记录的一个特征码

如果再来一条记录:name:Jim;age:19

特征码很好计算,不过怎么和上一条记录链接起来呢?

方法就是将上一个记录的特征码,一起编织在这一条的特征码中,例如:

lastHash:ca8d85b134922fe48d17bf36ceb38046;name:Jim;age:19

然后得到特征码:

1
2
3
4
5
6
from hashlib import md5

m = md5()
m.update(b"lastHash:ca8d85b134922fe48d17bf36ceb38046;name:Jim;age:19")
m.hexdigest()
# '82391695a3760b2de1c92d512b83cc14'  当前记录的特征码

这样就完成了记录直接的链接

经验一条记录是否被修改,或者连续,只需要对这条记录和其上一记录一起重算一次特征码就好了

当然,比特币,或者由实际应用的区块链会更为复杂,比如字段、加密算法等

实现一个区块链

下面,我们来实现一个比较完整的区块链

首先定义一个区块类:

1
2
3
4
5
6
7
8
9
10
11
12
class Block:
    def __init__(self, index, timestamp, data, previous_hash):
        self.index = index
        self.timestamp = timestamp
        self.data = data
        self.previous_hash = previous_hash
        self.hash = self.hash_block()

    def hash_block(self):
        sha = hasher.sha256()
        sha.update((str(self.index) + str(self.timestamp) + str(self.data) + str(self.previous_hash)).encode("utf-8"))
        return sha.hexdigest()
  • 初始化方法中,初始化了当前区块的索引、时间戳、数据(业务相关的信息)、紧前区块(上一个区块)的特征值,和当前区块的特征值
  • hash_block 根据初始化中的一些信息,得到一个特征值,就是用它来计算当前区块的特征值

接下来,区块链中的第一个区块的特征值如何计算,它的紧前特征值是什么?

我们来定义一个产生 起始区块 的方法:

1
2
3
def create_genesis_block():
    # 手工创建第一个区块,其索引为 0,且随意取给紧前特征值 '0'
    return Block(0, date.datetime.now(), "Genesis Block", "0")

然后,我们定义一个生成新区块的方法:

1
2
3
4
5
6
def next_block(last_block):
    this_index = last_block.index + 1
    this_timestamp = date.datetime.now()
    this_data = "Hey! I'm block " + str(this_index)
    this_hash = last_block.hash
    return Block(this_index, this_timestamp, this_data, this_hash)
  • 参数是 紧前 区块对象
  • 对索引做递增处理
  • 得到当前时间戳
  • 产生区块业务数据(为了简便只做了相对固定的内容)
  • 记录上个区块的特征值
  • 最后根据以上信息,得到一个新区块

现在所有的基础工作已经完成了,我们建立一个区块数据库,即区块链,并计入第一个区块

1
blockchain = [create_genesis_block()]

最后我们模拟一个产生区块的过程:

1
2
3
4
5
6
7
8
9
10
11
# 设置产生区块的个数
num_of_blocks_to_add = 20

# 产生区块并加入区块链
for i in range(0, num_of_blocks_to_add):
    previous_block = blockchain[-1]
    block_to_add = next_block(previous_block)
    blockchain.append(block_to_add)
    # 发布当前区块的信息
    print("Block #{} has been added to the blockchain!".format(block_to_add.index))
    print("Hash: {}\n".format(block_to_add.hash))

运行后,我们可以得到如下结果:

Block #1 has been added to the blockchain!
Hash: 788ec79310315740f7df959e03c8788f102c3e02d6b6ce6488ed7b7d04cc3e01

Block #2 has been added to the blockchain!
Hash: 5b6c6e0be9659ae359356015ffe9ba9e4645f181d848bfd5127dd24d29f1747c

Block #3 has been added to the blockchain!
Hash: c40e3accb5de25728770754f24d7504cc72b8138d465f5d8f1b84ad149c9b59c

Block #4 has been added to the blockchain!
Hash: 9a118b7c8b90aaab2fe6a59dd84224adb90ba4af8aaa03bf4c9b08799cc81d9b

Block #5 has been added to the blockchain!
Hash: f8fbd5b6684d926fb96dd36b89f61db3c868...<省略>...

显示的结果就是区块链上的信息

实际当中,是在分布式环境下运行的,需要考虑更多的因素,如调度,合并,以及选举等,加密算法也需要更为安全,例如常用的是 椭圆曲线加密算法(ECC), 来加强区块链的安全性和可靠性,但最基本的实现逻辑是一样的。

应用

有句虐心的话:

明白了很多道理,却还是过不好这一生

虽然粗浅地了解了区块链的基本概念和实现,然而有什么用呢?

既不能取改比特币(再说也不需要改),也不能创建一个区块链应用(虽然不是不可能)

不过这种思想可以在很多地方得到应用

这里我列举一个我实际工作中的例子:

在一个项目上,需要实现一个审计日志功能,基本要求就是需要连续并防篡改

如果不了解区块链的算法的话,可能需要考虑半天,然后得到一个蹩脚的方式,比如用额外的记录来控制日志记录,或者记录关联关系(之前确实这么干过)

现在,只需要在记录中增加两个字段:上一个记录的特征码 和 当前特征码

再实现一个,根据指定字段,计算特征码的方法

为了便于识别,再加一个检验方法,就好了

除了这样的应用,你还能想到哪些应用呢?欢迎留言交流

总结

截至写稿(2021年1月9日),比特币的价格已经接近 27 万了,如此受热捧(也不是一直这么热,理财有风险,投资需谨慎),而其内在原理竟然如此简单

基于加密算法就可以完成可以承载巨大信息量的数据货币世界,这就是所谓 越简单的, 就越有效和稳定 的恰当解释

无论什么事物,总有其内在的基本原理和理论做支撑,只有了解和掌握了其内部原理,才能更好地认识一个事物,我们只需要多一些好奇心,多一点耐心就好,比心

参考

  • 区块链白皮书: https://bitcoin.org/bitcoin.pdf
  • https://zhuanlan.zhihu.com/p/28595570
  • https://zhuanlan.zhihu.com/p/101907402

示例代码:https://github.com/JustDoPython/python-examples/tree/master/taiyangxue/blockchain

阅读全文 »

都 2021 年了,居然还有人在手写测试数据

发表于 2021-01-10 | 分类于 python

封面

平时我们在开发程序的时候,总免不了需要造一些假数据来验证自己的程序功能是否正常。那么你是通过什么方式来造假数据的呢,不会每次都是手写「测试数据、test」吧。

阅读全文 »

Python 小项目实战了解一下?

发表于 2021-01-08 | 分类于 Python 小项目实战了解一下?

最近无论是北方还是南方都迎来了强冷空气的袭击,北风呼呼吹,我所在的城市这两天则可随处溜冰,城市道路结冰橙色预警,全省交通到处管制、小学幼儿园停课休息;上班路上的行人则是小心翼翼怕摔跤;老家韭菜坪的风景更美,给大家来带张照片感受感受:

韭菜坪雪景1

韭菜坪雪景2

言归正传,今天的文章来点有趣的小项目实战,希望给繁忙工作中的朋友们减减压,也给这个严冬增添几分暖色;详细项目请见后文。

用 Python 画彩虹线

用 Python turtle 画个转圈圈的彩虹线,实现思路如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 导入 turtle 包
import turtle
# 打开画笔
q = turtle.Pen()
# 设置背景颜色
turtle.bgcolor("white")
sides = 7

# 设置彩虹线
colors =["red","orange","yellow","green","cyan","blue","purple"]
for x in range(360):
     q.pencolor(colors[x % sides])
     q.forward(x*3 / sides+x)
     q.left(360 / sides+1)
     q.width(x * sides/200)

实现结果如下: 彩虹图

用 Python 实现有趣的图片转字符游戏

实现思路如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#用 Python 实现图片转字符
from PIL import Image
import os

#设置参数输入像素的灰度值
def g2s(gray):
    pixel_str='''$#%@&MNBEFRWYLIkbtj?*984532menocvzst{}[]1|()<>=+~-;:i^"'. '''
    length=len(pixel_str)
    # 字符之间的灰度区间
    plus=255/length
    # str_gray表示字符所代表的灰度值
    str_gray=0
    for i in range(length):
        str_gray = str_gray + plus
        if gray <=str_gray:
            return pixel_str[i]

def img2str(img_path,save_path,num=0):
    txt_path=os.path.join(save_path,'img.txt')
    f=open(txt_path,'w')
    f.write('')
    # 因为此目录有可能已有内容,所以先清空
    f.close()
    # a表示在文件的末尾添加
    f=open(txt_path,'a')

    # 因为有些图片尺寸过于大,所以添加了一个修改大小的功能
    im=Image.open(img_path)
    if num==0:
        pass
    else:
        im=im.resize( ( int(im.size[0]/num),int(im.size[1]/num) ) )

    # 直接将图片转换成灰度模式
    im=im.convert('L')
    for y in range(im.size[1]):
        for x in range(im.size[0]):
            s=g2s(im.getpixel((x,y)))
            f.write(s)
        f.write('\n')
    f.close()

if __name__=='__main__':
    img2str(r'test.jpg', r'D:\Python_test', 4)

测试图片:

实现效果如下:

总结

今天的文章主要是使用 Python 实现小项目减减压,希望对大家有所帮助!

示例代码 Python 小项目实战了解一下?

阅读全文 »

做时间的朋友,必须知道收益咋算

发表于 2021-01-04 | 分类于 python

新年好,我们度过了艰难的 2020,迈进了 2021 的征程,在新年伊始,我们一起学习一个新技能,使我们能拥有看到未来的眼睛

比起对时间、精力的投资,对金钱的投资更容易理解和显现

那么面对纷繁复杂的投资种类,哪个才是对我们有利的呢?当然要看收益率高呀

那如何计算收益率呢?

年化复合回报 15% 意味着什么

如果有一个投资标的,年化复合收益率是 15%,那么 100 年后(虽然我们可能活不了这么久),能获得少倍的收入?

虽然我们可以写成计算公式,但我们的大脑并不适合计算小数的幂运算,

对于这个问题,计算公式是:

\[(1+15\%)^{100}=?\]

这样用 Python 一行代码就搞定:

1
2
(1+0.15)**100
# 1174313.4507002793

对,你没看错,是 117 万倍!,也就是投入一块钱,最终收益竟然是 117 万

这个并非假设的例子,2019 年的时候,可⼝可 乐公司上市⼀百周年。⼈们算了⼀下,在这⼀百年间,可⼝可乐公司竟然为股东创造了 15% 的年化复合回报率!

果然,收益率是很大程度上反映了投资标的的好坏

定投的收益

定投就是,定期定额,持续对某个标的的投资,可以参见《定投到底好不好 —— python 告诉你答案》

对于一个具有某个平稳收益率的标的,使用定投策略,在一段时间后,能获得多少收益呢?

通过设定收益率、定投周期、定投额度,就可以算出来,不过手工计算比较麻烦,可以直接使用 Numpy 提供的 FV 函数很方便的计算

FV 函数参数是:

  • rate, 收益率
  • nper:投资期数
  • pmt:每期定投金额
  • pv:期初已有金额,即现值
  • when:表示各期计算收益的时间点,期初为 0,期末为 1,默默为期末

假设,按月定投,每月定投 1000,月收益率为 10%,定投 12 个月,即一年的最终金额是多少:

1
2
3
import numpy_financial as npf
npf.fv(0.1, 12, -1000, 0)
# 21384.28376721003
  • 注意:numpy 将在 1.2 及以后版本,会将经济类公式去除,而专门用模块 numpy_financial 做经济类公式库,为了升级方便,建议使用 numpy_financial
  • numpy_financial 通过 pip install numpy-financial 安装
  • numpy 中 负数表示投入,正数表示获取,因此 -1000 表示投入 1000

如果在同样的条件下,想要在某个时间点,收获一定的金额,每期应该投入多少呢?比如一年后要得到 5万元,计算每月的投入

1
2
3
import numpy_financial as npf
npf.pmt(0.1, 12, 0, 50000)
# -2338.165755014362

可以得出,每月至少投入 2338.17 元

pmt 与 fv 的区别只是后面的两个参数含义不同

分别是,期初金额和终值金额

定期不定额的收益率

定投虽好,不过实际操作中难免有各种异常情况,漏投,或多投在所难免,甚至将一部分提现

这种情况下如何计算自己的收益率呢?

我们可以利用 irr 这个函数,其全称为(Internal Rate of Return),即内部报酬率,不过名称还是不太明显,我们看看如何应用吧

假设有一个定投项目,下面是每期定投的金额和支出:

期数 投入 提现 实际投入
1 -1000 0 -1000
2 0 100 100
3 -1500 200 -1300
4 -2000 0 -2000
5 -800 6000 5200

注意,金额都是相对于投资者来说的,负数为支出,正数为收入

我们做如下计算

1
2
3
4
import numpy_financial as npf
pmts = [-1000, 100, -1300, -2000, 5200]
npf.irr(pmts)
# 0.10969579295711918

pmts 为每期投入金额,因为是可变的,所有存入数组里

最终得到的结果是,不定额投资 5 期, 最终收益率为 10.96%

有了这个函数赶紧算算那些保险方案,看看承诺的收益率是否与实际相符

不定期不定额的收益率

直接在看问题,一般都会被难到,不知如何下手

但实际上这种投资操作更为实际,有钱就投,没钱不投,钱多多投,钱少少投,才是我们平常人的投资风格

如何计算收益率呢?

xirr 闪亮登场

xirr 源自于 Excel 中的计算公式

看起来问题很复杂,而 xirr 函数却很简单,即 收益率=xirr(资金流, 日期流)

不过遗憾的是 numpy-financial 模块中并未提供 xirr 函数,需要引入另外的算法

GitHub 找到了一个简单的库 https://github.com/Tacombel/XIRR.py

下载其中的 XIRR.py 放在根目录下,引用即可

假设有这样的投资记录

日期 现金
2019-02-04 -300.3
2019-06-17 -500.5
2019-11-18 741.153
2020-04-27 -600.6
2020-10-19 1420.328547

来计算看看

1
2
3
4
5
6
7
8
9
10
11
12
13
from XIRR import xirr
import datetime

dates = [datetime.date(2019, 2,4), 
datetime.date(2019, 6, 17), 
datetime.date(2019,11, 18),
datetime.date(2020,4, 27),
datetime.date(2020,10, 19)]

values = [-300.3,-500.5,741.153,-600.6,1420.328547]

xirr(values, dates)
# 输出为: 0.779790640991537

实际的收益率为 77.98%

有了 irr 和 xirr 两个函数,投资世界是否变得清晰多了

总结

如果有什么方法让流失的时光留住,那就对时间做定投,正如在 2020 总结篇 中说的:做时间的朋友,成为长期主义者

我们知道长期主义者与非长期主义者的最大区别在于,对待积累的方式

只有让流走的时间、精力、金钱积攒起来,发挥价值,才能使我们走的更远更宽

期望今天的分享能让你从另外的角度上看待投资,让我们以更快的速度成长,比心~

参考

  • https://github.com/Tacombel/XIRR.py
  • https://github.com/xiaolai/spreadsheets-for-investors

示例代码:https://github.com/JustDoPython/python-examples/tree/master/taiyangxue/rate-of-return

阅读全文 »

2020 年 GitHub 上十大最火 Python 项目,看完之后我裂开了

发表于 2021-01-02 | 分类于 python

封面

GitHub 作为程序员每天必逛的网站之一,上面有着太多优秀的开源项目,今天派森酱就带大家来梳理下在过去的一年里,GitHub 上最火的 Python 项目 Top10。

阅读全文 »

一文教你如何在网上选车牌

发表于 2020-12-25 | 分类于 python

年底买车的朋友很多,有朋友买了车,但却为车上牌发愁,因为卖车的告诉他,上牌选号时间只有几分钟,他要在几分钟内从50个号码中选出自己的车牌号。虽然只是个号牌,但谁都想选个好号码,毕竟可能要用一辈子,而且没准以后还增值。但这要在几分钟内决定,真是比高考还紧张。后来我跟他说为啥不先在网上预选下,他才知道还能网上选号,赶紧跟他一起操作了一把。今天就为大家简单介绍下操作,以后卖车再也不用为选号发愁了。

阅读全文 »

一起来用 Python 做个是男人就坚持100秒游戏

发表于 2020-12-22 | 分类于 python

相信大家在初中电脑课上都偷偷玩过 Flash 游戏–是男人就坚持 100 秒,在游戏中无数的小球随机运动,玩家用鼠标控制大球,当大球碰撞到小球后,游戏结束,显示坚持的时间。今天我们一起来开发这个小游戏吧。

阅读全文 »

用 Python 给微信头像加个圣诞老人(平安果)小图标

发表于 2020-12-22 | 分类于 python

圣诞老人是西方神话里圣诞节前夜给小孩子赠送礼物的人物,在国内的圣诞节中,除了圣诞老人,苹果(平安果)也是一个特色元素,本文我们看一下如何使用 Python 给自己的微信头像加一个圣诞老人或苹果小图标。

阅读全文 »
1 2 … 17
Python Geek Tech

Python Geek Tech

一群热爱 Python 的技术人

332 日志
52 分类
45 标签
RSS
GitHub 知乎
Links
  • 纯洁的微笑
© 2019 - 2021 Python Geek Tech
由 Jekyll 强力驱动
主题 - NexT.Mist