写在前面
最近在看《赌神数学家》这本书,在此书的第四部分“圣彼得堡悖论的故事”的“香农的恶魔”这一小节中,讲了香农自己对于股票的投资策略。在这一小节中,有一个股票价格和香农调整后的投资组合折线图,正好也学过了用python绘制折线图,想想自己能不能绘制出这个图。下面简单介绍一下股票价格的随机游走和香农的投资策略。
股票:起始价为1美元,每时间单位价格翻倍或减半的概率相等;
香农投资策略:假设你的起始资金为1000美元,其中500美元买股票,另外500美元存入现金账户。假设第一天股票价格减半,那么你的总资产就变成了750美元,其中包括250美元股票和500美元现金。此时的投资组合中,现金投资比例较大。为了保持平衡,你要从现金账户中取出125美元用来购买股票。这样,新的投资组合就变成375美元股票+375美元现金,与最初比例相同。重复上述做法。假设第二天股票价格翻倍,那么375美元的股票价值就变成了750美元,加上375美元现金,你的总资金一共是1125美元。这一次你要卖掉一些股票,然后把钱存入现金账户,最终保持股票与现金的投资都为562.50美元。
代码部分
直接上代码喽!代码注释我解释的比较清楚
#encoding=utf-8
from random import choice
import matplotlib.pyplot as plt
class RandomWalk():
def __init__(self,num_point=20):
#设置股票波动次数(默认20次)
self.num_point=num_point
#初始化时间轴x
self.x_value=[0]
#初始化每股价格1$
self.y_value=[1]
#初始化香农的现金1$
self.y_cash=[1]
#定义随机游走和香农投资组合的方法
def drawRandomWalkAndShannonPortfolio(self):
while(len(self.x_value)<self.num_point):
#每单位时间价格翻倍或减半概率相等
y_multiple=choice([2,1/2])
#设置单位时间
x_time=1
#计算下一个点的x值(实际上x每个单位时间+1),y_value(股票值)和y_cash(香农现金值)
next_x=self.x_value[-1]+x_time
next_y=self.y_value[-1]*y_multiple
next_c=self.y_cash[-1]/2*y_multiple+self.y_cash[-1]/2
#将next_x、next_y和next_c放入列表
self.x_value.append(next_x)
self.y_value.append(next_y)
self.y_cash.append(next_c)
rw=RandomWalk()
rw.drawRandomWalkAndShannonPortfolio()
#绘制股票价格折线
plt.plot(rw.x_value,rw.y_value,label="Stock Prices",c="red")
#绘制香农调整后的投资组合折线
plt.plot(rw.x_value,rw.y_cash,label="Shannon's Adjusted Portfolio",c="blue")
#设置折线图的一些基本信息
plt.title("Stock Prices and Shannon's Adjusted Portfolio")
plt.xlabel("Time")
plt.ylabel("Dollar")
plt.legend()
plt.show()
运行结果如下图(因为是随机游走,所以每次运行的结果不一样很正常)
写在后面
在理想情况下,股票的这种随机游走条件下,香农的投资策略可以让资金稳定增长。在现实生活中香农的投资策略显然不可行,因为高额的交易的手续费不允许你频繁交易。