金沙网站官方网站

首页 > 正文

Python 揭秘斐波那契定律,如何帮助码农分析股票

www.6r6e3v4d0k.com2019-07-15
金沙城娱乐场官网平台

9e585778c0bd43009ae674459d9ffa4d

Fibonacci序列的剖析

Python学习交流组:1004391443

我相信Fibonacci序列对任何人都不陌生。它指的是这样一个序列:0,1,1,2,3,5,8,13,21,34,55,89,144,233 .这个系列包含哪些秘密?我们从以下三个问题分析Fibonacci序列:

(1)Fibonacci序列是如何产生的?

Fibonacci序列来自意大利中世纪数学家Fibonacci(1175-1240),他的1202书《算盘书》(Liber Abaci)以兔子繁殖为例。

假设一对新生兔可以在一个月内长成一只大兔子,然后一个兔子可以在一个月内出生,然后每个月出生一对兔子,一年内不会发生死亡。一年内为新生兔喂养了多少对兔子?在第一个月,一对兔子,第二个月成为一只大兔子,第三个月共生了一对兔子两只兔子.

在Fibonacci序列的隐含法则的情况下,我们在一年内手动计算了兔子的繁殖情况,如下图所示:

ba29202ce0aa470d896513b63f088526

通过该生殖法获得的每月兔数量构成斐波那契序列,因此也称为“兔序列”。

18世纪中期发生的澳大利亚野兔灾难的故事反映了真实版兔子系列的惊人增长率。

件,加上澳大利亚本土缺乏猛禽,黄鼠狼等兔子的天敌,兔子开启了斐波那契数列式的增长,当时澳大利亚的生态遭到了严重破坏,继而开始了人兔大战.接下来让我们逐步揭开斐波那契数列的秘密。

(2)斐波那契数列的规律是什么?

从[0,1,1,2,3,5,8,13,21,34,55,89,144,233 ..]这个序列中可以发现,第一个元素为0,第二个元素为1,之后的每一个元素为之前两个元素之和在数学上,我们可以用递归的方法来定义斐波纳契数列的生成规律,如下所示:

当N=0时,F(N)=0

当N=1时,F(N)=1

当n> 1时,F(n)=F(n-1)+ F(n-2)

(3)斐波那契数列神奇之处在哪?

斐波那契数列存在许多神奇的性质,我们不妨对斐波那契数列中相邻的两个数求商值当前一个数值除以后一个数值时可以得到以下的结果:

0÷1=0

1÷1=1

1÷2=0.5

2÷3=0.6666 .

3÷5=0.6

5÷8=0.625

8÷13=0.615 .

13÷21=0.619 .

21÷34=0.617 .

34÷55=0.618 .

55÷89=0.617 .

XX89÷144=0.618 .

144÷233=0.618 .

.

我们注意到从21除以34到系列的无穷大,商是一个无理数,趋于0.618!

相反,当后一个值除以前一个值时,结果如下:

1÷0=0

1÷1=1

2÷1=2

3÷2=1.5

5÷3=1.67

8÷5=1.6

13÷8=1.625

21÷13=1.615 .

34÷21=1.619 .

55÷34=1.618 .

89÷55=1.618 .

144÷89=1.618 .

相应的除法从34除以21开始,直到该系列是无限的,并且商是一个趋于1.618的无理数! 0.618和1.618令人惊讶地相互对立,0.618的值是着名的“黄金分割”比例!这就是Fibonacci序列也被称为黄金分割的原因。

事实上,黄金分割比斐波那契序列早得多。假设线段的总长度为1,则在线段上找到黄金分割点,线段分为A和B两部分.B的长度为x,A的长度为1-x,如下图所示:

82248f8548a045168997534b813e5817

A与B的长度之比等于B与全长的比率。这个比例是黄金的,比例关系如下:

5588fb351aa94650aff77a8d2d6848b7

转换公式并找到x值,如下所示:

7b6dc78431ce468486e81ad76f2a2077

因此,B与全长的比率为0.618,B与A的长度比为1.618。实际上,它们指的是同一线段的黄金比例。

fd2d93fc4945485583d2512e32f5daa8

Python验证了该系列的神奇之处

对于无聊和繁琐的计算工作,应该对Python做!上面提到的Fibonacci序列生成规则是通过递归方法定义的,因此使用Python递归函数更直观,更容易理解序列的生成。代码如下所示:

Def Fibonacci_Generate(n):

如果n <0:

打印('输入值为错误')

返回-1

Elif n==0: return 0

Elif n==1:返回1

否则为:

返回Fibonacci_Generate(n-1)+ Fibonacci_Generate(n-2)

含有10和30个值的Fibonacci序列生长曲线分别绘制,如下图所示。

172783ceb5d444f2b5eb712222957392

d8c72a777e4d4e5ca00c2c2b7836ec67

用于绘制斐波那契序列增长曲线的代码如下:

Def Fibonacci_sequence(n):

Fibs_list=[]

对于i中的np.arange(0,n): fibs_list.append(Fibonacci_Generate(i))

Plt.plot(np.arange(n),fibs_list,c='g',marker='o',ls='dashed')

Plt.title('Fibonacci sequence:{}'。format(n))

Plt.show()

从图中Fibonacci序列的生长形式可以看出,该序列在初始阶段生长缓慢,然后显示指数增长率,基数为1.618。

虽然使用递归函数生成序列的优点是定义简单且逻辑清晰,但缺点是实现效率极低,深度递归调用可能导致堆栈溢出。

我们使用Python内置时间模块来测试递归函数的开销时间,以生成30个Fibonacci数。在代码的开头和结尾添加time.perf_counter()函数以返回系统的运行时间。由于返回值的参考点未定义,因此只有连续调用之间的差异才是有效的代码开销时间。我们测量的执行时间是2.918秒。代码如下所示:

Start=time.perf_counter()

对于i中的np.arange(0,n): fibs_list.append(Fibonacci_Generate(i))

Elapsed=(time.perf_counter() - start)

打印('时间使用:',已过去)#Time使用: 2.917980852

理论上,所有递归函数都可以以循环方式编写。虽然循环的逻辑不像递归那样清晰,但循环优势在执行效率方面是显而易见的。切换到循环模式后测量的执行时间仅为16.44微秒。代码如下所示:

#使用循环

Def Fibonacci_Generate_Loop(n):

如果n <0:

打印('输入值为错误')

返回-1

Elif n==0: return [0]

Elif n==1:返回[0,1]

否则为:

Result_list=[0,1]

a,b=0,1

对于i在范围(2,n + 1):

a,b=b,a + b

Result_list.append(b)中

返回result_list

使用循环生成Fibonacci序列时,必须使用列表来存储每个计算的值。为了使代码更优雅,我们可以使用生成器来优化它。所谓的生成器实际上是一个内部支持迭代器协议的特殊迭代器。

Python提供生成器函数和生成器表达式来实现生成器。每个请求都返回一个结果。您不需要一次构建结果列表,从而节省了内存空间。这里我们使用生成器函数来实现生成器,它被编写为常规def语句,使用yield语句一次返回一个结果,在每个结果之间挂起并继续它们的状态。代码如下所示:

#使用iterrows()

Def Fibonacci_Generate_iter(n):

如果n <0:

打印('输入值为错误')

返回-1

Elif n==0: return [0]

Elif n==1:返回[0,1]

否则为:

a,b=0,1

收益率

产量b

对于i在范围(2,n + 1):

a,b=b,a + b

产量b

以上还提到了Fibonacci序列的先前值。除了后一个值,随着系列的增长,商是一个非理性数,趋于0.618。接下来我们将使用Python验证它。实现代码如下:

Def Fibonacci_divide(seq):

Div_list=[]

对于i中的np.arange(0,len(seq)-1):

Div_list.append(SEQ [I]/SEQ第[i + 1])

Plt.plot(np.arange(len(div_list)),div_list,c='g',marker='o',ls='dashed')

Plt.title('Fibonacci Fn/Fn + 1:{}'。format(div_list [-1]))

Plt.show()

Fibonacci_divide(列表(Fibonacci_Generate_iter(100)))

我们得到Fibonacci序列中Fn/Fn + 1的前100项的结果,如下图所示。从图中可以看出,第八项与第九项的比率开始,随后的值趋于大约0.618。

a38151c1d8d1473aa88420555d5b9bbb

因此,再一次验证Fibonacci序列是近似指数增长的一种形式。为了更准确地说明这个问题,让我们看一下由数学家Bene建立的Fibonacci序列的一般公式,如下:p>

c296add35a6b42d496d933f02775b949

从通式计算Fn/Fn + 1的结果仍为0.618,如下所示:

98b9bdba998b4e94af4d1c3c78b12086

da4bc9486e7f4821a81485b130753161

黄金分割率分析股价

Fibonacci序列是自然界的基本属性,尤其是系列中黄金分割的比例。它出现在许多领域,如绘画,雕塑,建筑等。人们都认为黄金比例是最完美的。

例如,“维纳斯断臂”雕塑,身高2.02米,肚脐是金点,肚脐上部与肚脐下部的比例接近0.618。可以看出,黄金比例是一种客观规律,作用于人的潜意识,具有强烈的自然属性。当然,它也包括在股市的分析中:股票价格始终遵循高低的规律。

当股价走势逆转时,很可能会遇到黄金比率0.382和0.618的暂时阻力或支撑。因此,交易者通过黄金比率找到上/下趋势中的压力水平和支撑位是有帮助的。更好地判断“入场”和“出场”的时间。

接下来,以股票“新希望”的历史数据为例,找出股票价格的支撑位和压力水平。 “新希望”2019年1月至2019年6月的图表如下:

7c83c26b5cf64b5b88a3b794893720c4

通常情况下,股票价格不会一步上涨,而且大部分股票价格将会螺旋式上涨。也就是说,在新的上涨之前,会有一波回撤,冲走浮动筹码以获得动力,并且回撤将与黄金重合。该部门的比例为0.618。

在“新希望”半年期间,股价呈现上涨趋势。中间有几个短期回撤走势。我们使用黄金比率来计算回撤的位置。计算公式为(最大 - 最小值)*黄金比例+最小值,实现方法如下:

Fib_max=df_stockload.Close.max()

Fib_maxid=df_stockload.index.get_loc(df_stockload.Close.idxmax())

Fib_min=df_stockload.Close.min()

Fib_minid=df_stockload.index.get_loc(df_stockload.Close.idxmin())

Fib_382=(Fib_max-Fib_min)* 0.382 + Fib_min

Fib_618=(Fib_max-Fib_min)* 0.618 + Fib_min

接下来验证黄金分割比例判断支撑/阻力位的有效性,如下图所示,第一轮回撤位置正好在黄金分割率0.618所处位置,即11.61。

b95488781142477aad74bac5e4d584a1

539a6065573c4f1b8b2edc37d8f5faa0

总结

本文以股价分析为应用场景介绍了斐波那契数列的神奇特征,尽管斐波那契的黄金分割线可以帮助交易者提高判断支撑位或阻力位的成功率。

但和其他的技术分析工具一样,它也存在一定的局限性,比如单纯以波段高点和波段低点的差值作为基准这个方式,在波动较大或者区间震荡持续较久的行情下可靠性会降低,改进的方法可以将股价按序列值大小排序,取黄金分割比例所对应位置上的序列值,这样可靠性会更高。

XX
热门浏览
热门排行榜
热门标签
日期归档