Python语言非常优美,语法简洁而功能强大,容易上手,学好Python能干很多事情:比如爬虫,数据分析呀,机器学习啊,web开发,其实Python还能帮你赚钱,比如自己做一个量化分析的小工具,去年我就用这个工具赚了一笔。
我个人炒股买基金很多年了,算是一个资深的老股民,炒了这么多年,也没有怎么赚钱,直到我去年自己写了一个量化的小工具,量化投资其实非常有名,很早就在华尔街运用了,越是在不成熟的市场,越容易赚钱!下面我来举一个小例子,来看看用数据量化分析一个基金的投资:
一.基金爬取和清洗
1.数据的爬取
网上有很多网站都有基金的数据,这里我爬取了某财经网站的一只基金!大家都知道去年白酒涨的非常猛,于是我挑一只我比较喜欢的白酒的基金来分析一下
一共是245个交易日的数据(2017/03/16-2017/03/14),有4个重要的维度:基金净值,涨幅,基金净值涨跌,累计净值。
2.数据的清洗
数据爬取之后做基本的处理:
查看有无异常值,有无缺省值:
增加一个对上涨和下跌的标识符,用1表示上涨,用-1表示下跌,0表示平
我们的交易一定是在周一到周五,所以增加一个维度为星期几
处理完的数据如下:
二.数据进行量化分析
量化分析是一门科学,里面有很多知识要学,除了用到Python的数据处理,还有统计学和金融的相关知识,涉及到很多交易模型的设计,对股票分析里面有比如海龟交易法, Fama-French 的三因子模型等等,比较复杂这里,我从基金入手做一个粗浅的分析:
1.统计周一到周五跌的概率
这只基金一年的涨幅大概了近40%,还是相当不错的,买基金最简单的招数就是基金定投,但是周一到周五到底哪一天最划算呢?
我们统计了近一年的交易数据,发现周五下跌的概率比较大,也就是说周五定投比较合适,因为买基金肯定是跌的时候买比较划算.
2.把一年的数据按月进行切片分析
我们把一年的数据按照12个月进行切片,然后看它们的累积涨幅:
发现这个基金全年12个月,只有2个月是跌的,其他10个月都是在涨,而且有5月的涨幅都在5%以上,这样的基金相当牛逼!
也就是说全年有83%的月概率都在上涨,有近四层的月都是涨幅5%以上,要知道很多年化率一年的涨幅才5%,这里一个月就能到达,真是一只好基金啊!
3.定投哪种方式性价比最高
前面我们知道了周五是跌的概率最大的,那么如果我们下面按照三种方法去买基金,看看哪种方式的收益最好,资金占用最小:
每日定投买,不管涨跌,每天买(土豪啊)
每周定投买,不管涨跌,每周买(小资啊)
双周定投买,不管涨跌,每2周买(白领啊)
--------------------每日:--------------------
本金:245000,总额:329048.58,收益:84048.58
总份额:205270.0
收益率:34.31%
--------------------每周一:--------------------
本金:46000,总额:61608.456112,收益:15608.46
总份额:38385.0
收益率:33.93%
--------------------每双周一--------------------
本金:23000,总额:30208.8334057,收益:7208.83
总份额:19192.0
收益率:31.34%
--------------------每周二--------------------
本金:48000,总额:63982.9523013,收益:15982.95
总份额:40317.0
收益率:33.3%
--------------------每双周二--------------------
本金:24000,总额:31617.4115635,收益:7617.41
总份额:19998.0
收益率:31.74%
--------------------每周三--------------------
本金:50000,总额:67292.1152093,收益:17292.12
总份额:41979.0
收益率:34.58%
--------------------每双周二--------------------
本金:25000,总额:32934.0338654,收益:7934.03
总份额:20831.0
收益率:31.74%
--------------------每周四--------------------
本金:50000,总额:67156.8739297,收益:17156.87
总份额:41816.0
收益率:34.31%
--------------------每双周四--------------------
本金:25000,总额:33652.1085203,收益:8652.11
总份额:20993.0
收益率:34.61%
--------------------每周五--------------------
本金:50000,总额:67621.2869066,收益:17621.29
总份额:41897.0
收益率:35.24%
--------------------每双周五--------------------
本金:25000,总额:33625.0310915,收益:8625.03
总份额:21095.0
收益率:34.5%
综上上面几种做法,发现土豪买法,收益其实并不是最高的,还不如白领的每2周买一次呢!而且土豪每日投资法的资金占用是每双周近10倍,资金消耗太大了。而每周投资的方法收益是上面所有策略里面最高的近35%的年收益!
要知道一般的理财产品5个点左右,好一点也就8-9%,35%的年化率其实是非常非常高了!量化投资小试牛刀,就这么厉害,那么有没有办法获得更高的收益,比如在股票市场进行量化呢,当然可以,需要系统的学习量化理论和投资策略模型。
区块链
它是比特币或其他加密货币进行交易的数字账本,账本按时间顺序记录并对外公开。
在更一般的术语中,它是一个公共数据库,新数据存储在一个名为块的容器中,并被添加到一个不可变链(后来的区块链)中添加了过去的数据。在比特币和其他加密货币的情况下,这些数据是一组交易记录。当然,数据可以是任何类型的。
区块链技术已经催生了新的、完全数字化的货币,如比特币和莱特币,这些货币并不是由中央政府发行或管理的。因此为那些认为今天的银行系统是骗局或终将失败的人带来了新的自由。区块链所包含的以太坊技术对分布式计算进行了变革创新,它引入了一些有趣的概念,比如智能合约。
在本文中,我将用不到50行的Python2代码来做一个简单的区块链。我称它为SnakeCoin。
首先将定义块将是什么样子。在区块链中,每个块都存储一个时间戳和一个索引。在SnakeCoin中,需要把两者都存储起来。为了确保整个区块链的完整性,每个块都有一个自动识别散列。与比特币一样,每个块的散列将是块索引、时间戳、数据和前块哈希的加密哈希。数据可以是你想要的任何东西。
importhashlibashasher
classBlock:
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()
defhash_block(self):
sha = hasher.sha256()
sha.update(str(self.index) +
str(self.timestamp) +
str(self.data) +
str(self.previous_hash))
returnsha.hexdigest()
这一步后有块结构,但现在是创建区块链,所以需要向实际的链中添加块。如前所述,每个块都需要上一个块的信息。但是按照这个说法就有一个问题,区块链的第一个区块是如何到达那里的呢?不得不说,第一个块,或者说是起源块,它是一个特殊的块。在很多情况下,它是手动添加的,或者有独特的逻辑允许添加。
下面将创建一个函数简单地返回一个起源块以便产生第一个区块。这个块是索引0,它具有任意的数据值和“前一个哈希”参数中的任意值。
importdatetimeasdate
defcreate_genesis_block():
# Manually construct a block with
# index zero and arbitrary previous hash
returnBlock(0,date.datetime.now(),"Genesis Block","0")
现在已经创建好了起源块,接下来需要一个函数,以便在区块链中生成后续的块。这个函数将把链中的前一个块作为参数,创建要生成的块的数据,并使用适当的数据返回新块。当新的块哈希信息来自前面的块时,区块链的完整性会随着每个新块而增加。如果不这样做,外部组织就更容易“改变过去”,用全新的方式取代已有的链条。这一系列的散列可以作为加密的证据,有助于确保一旦将块添加到区块链,它就不能被替换或删除。
defnext_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
returnBlock(this_index,this_timestamp,this_data,this_hash)
大部分的工作已经完成,现在可以创建区块链了。在这次的示例中,区块链本身是一个简单的Python列表。列表的第一个元素是起源块。当然,还需要添加后续的块,因为SnakeCoin是最小的区块链,这里只添加20个新的块。可以用for循环来生成新块。
# Create the blockchain and add the genesis block
blockchain = [create_genesis_block()]
previous_block = blockchain[0]
# How many blocks should we add to the chain
# after the genesis block
num_of_blocks_to_add = 20
# Add blocks to the chain
foriinrange(0,num_of_blocks_to_add):
block_to_add = next_block(previous_block)
blockchain.append(block_to_add)
previous_block = block_to_add
# Tell everyone about it!
print"Block #{} has been added to the blockchain!".format(block_to_add.index)
print"Hash: {} ".format(block_to_add.hash)
下面来测试一下目前产生的区块链。
看到了吧,这就是区块链。如果希望在控制台中查看更多信息,可以编辑完整的源文件并打印每个块的时间戳或数据。
这就是SnakeCoin要提供的所有东西。为了使SnakeCoin规模达到今天生产区块链的规模,必须添加更多的功能,比如服务器层,以跟踪多台机器上的链变化,以及在给定的时间段内限制添加的块数量的工作算法。
想要获取更多学习资料
扫描右方二维码加入本群
关注菜鸟Python笔记公众号,与你分享更多Python有用的知识。