Python 揭秘斐波那契定律,如何幫助碼農分析股票?| 技術頭條

2021-01-13 CSDN

作者 | 元宵大師

責編 | 胡巍巍

剖析斐波那契數列


對於斐波那契數列相信大家並不陌生,它指的是這樣一個數列:0、1、1、2、3、5、8、13、21、34、55、89、144、233…………這個數列究竟蘊含著什麼秘密呢?我們從以下三個問題展開對斐波那契數列的剖析:

(1) 斐波那契數列是怎麼由來的?

斐波那契數列是由義大利中世紀數學家斐波那契(Fibonacci,公元1175-1240)在他1202年著作的《算盤書》(Liber Abaci)中以兔子繁殖為例子所引出的。

在書中提出了一個有趣的問題:假設一對剛出生的小兔一個月後就能長成大兔,再過一個月就能生下一對小兔,並且此後每個月都生一對小兔,一年內沒有發生死亡,那麼一對剛出生的兔子,在一年內繁殖成多少對兔子?

依照假定條件計算,第一個月是一對兔子,第二個月長成了大兔,第三個月生下一對小兔總共由兩對兔子……

在並不知曉斐波那契數列隱含的規律情況下,我們手動推算得到了一年內兔子繁殖的情況,如下圖所示: 

由該繁衍規律得到的每個月兔子的數量組成了斐波那契數列,因此也稱為「兔子數列」。

發生在18世紀中期的澳大利亞野兔成災的故事體現了真實版的「兔子數列」驚人的增長速度。

當時英國殖民者為了滿足自己的狩獵愛好把歐洲野兔引進了澳大利亞,由於澳大利亞氣候溫暖、牧草豐富,為兔子提供了良好的生存條件,加上澳大利亞本土缺乏猛禽、黃鼠狼等兔子的天敵,兔子開啟了斐波那契數列式的增長,當時澳大利亞的生態遭到了嚴重破壞,繼而開始了人兔大戰……接下來讓我們逐步揭開斐波那契數列的秘密。

(2) 斐波那契數列的規律是什麼?

從[0、1、1、2、3、5、8、13、21、34、55、89、144、233…………]這個序列中可以發現,第一個元素為0,第二個元素為1,之後的每一個元素為之前兩個元素之和。在數學上,我們可以用遞歸的方法來定義斐波納契數列的生成規律,如下所示:

(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…

89 ÷ 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這個數值正是有名的「黃金分割」比例!這也是斐波那契數列又稱為黃金分割數列的原因。

實際上黃金分割的提出要遠早於斐波那契數列。假設線段總長為1,在線段上找到一個黃金分割點,將線段分割為A和B兩部分,B的長度為x,A的長度為1-x,如下圖所示: 

A與B的長度之比等於B與全長的比,這個比例就為黃金分割,比例關係如下所示: 

對該公式進行轉換,並求出x值,如下所示: 

於是B與全長的比為0.618,B與A的長度比為1.618,實際上它們指的是同樣線段的黃金分割比例。


 Python驗證數列的神奇


對於枯燥而繁瑣的計算類工作理應交給Python來做!上文提到斐波納契數列的生成規律是由遞歸方法來定義的,因此用Python遞歸函數生成數列會更直觀、更容易理解。代碼如下所示:

def Fibonacci_Generate(n):

    if n < 0:
        print('Input value is error')
        return -1
    elif n == 0:return 0
    elif n == 1:return 1
    else:
        return Fibonacci_Generate(n-1)+ Fibonacci_Generate(n-2)

分別繪製出包含10項和30項數值的斐波那契數列增長曲線,如下圖所示。 

繪製斐波那契數列增長曲線代碼如下所示:

def Fibonacci_sequence(n):

    fibs_list = []

    for i in 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()

從圖中斐波那契數列增長形式上可以看出,數列在初期增長緩慢,之後呈現出以1.618為底數的指數增長速度。

雖然使用遞歸函數生成數列優點是定義簡單,邏輯清晰,不過缺點是實現的效率極低,並且深層次遞歸調用時會導致棧溢出。

我們採用Python內置time模塊來測試下遞歸函數生成30項斐波那契數列所開銷時間。分別在代碼的開始和結束處添加time.perf_counter()函數,用於返回系統的運行時間,由於返回值的基準點是未定義的,所以只有連續調用的結果之差才是有效的代碼開銷時間。我們測得的執行時間為2.918秒。代碼如下所示:

start = time.perf_counter()
for i in np.arange(0, n): fibs_list.append(Fibonacci_Generate(i))
elapsed = (time.perf_counter() - start)
print("Time used:", elapsed)

理論上,所有的遞歸函數都可以寫成循環的方式,雖然循環的邏輯不如遞歸清晰,但在執行效率上循環優勢明顯,改用循環方式後所測得的執行時間僅僅為16.44微秒。代碼如下所示:


def Fibonacci_Generate_Loop(n):

    if n < 0:
        print('Input value is error')
        return -1

    elif n == 0:return [0]
    elif n == 1:return [0,1]
    else:
        result_list = [0,1]
        a, b = 0, 1
        for i in range(2, n + 1):
            a, b = b, a + b
            result_list.append(b)
        return result_list

在使用循環方式生成斐波那契數列時,必須要用列表來存儲每次計算得到的數值,為了讓代碼優雅起來,我們可以使用生成器來優化。所謂生成器其實是一種特殊的迭代器,內部支持了迭代器協議。

Python中提供生成器函數和生成器表達式兩種方式實現生成器,每次請求返回一個結果,不需要一次性構建一個結果列表,節省了內存空間。此處我們使用生成器函數方式實現生成器,這種方式編寫為常規的def語句,使用yield語句一次返回一個結果,在每個結果之間掛起和繼續它們的狀態。代碼如下所示:


def Fibonacci_Generate_iter(n):

    if n < 0:
        print('Input value is error')
        return -1

    elif n == 0:return [0]
    elif n == 1:return [0,1]
    else:
        a, b = 0, 1
        yield a
        yield b
        for i in range(2, n + 1):
            a, b = b, a + b
            yield b

上文還提到了斐波那契數列前一個數值除以後一個數值時,隨著數列的增長,商值為是趨於0.618的一個無理數。接下來我們用Python驗證一下。實現代碼如下所示:

def Fibonacci_divide(seq):

    div_list = []

    for i in 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(list(Fibonacci_Generate_iter(100)))

我們得到了斐波那契數列的Fn/Fn+1的前100項的結果,如下圖所示。從圖中可知,第八項與第九項的比值開始,之後的數值都趨於0.618左右。 

因此再一次驗證得到斐波那契數列是近似指數增長的形式,為了更確切的說明這個問題,我們看一下由數學家比內建立的斐波那契數列的通項公式,如下所示: 

由通項公式計算Fn/Fn+1的結果依然是0.618,如下所示:


 黃金分割率分析股價


斐波那契數列是大自然的一個基本屬性,尤其是數列中的黃金分割比例部分,它出現在繪畫、雕塑、建築等多個領域,人們不約而同地認為黃金分割比例是最完美的。

比如「斷臂的維納斯」雕塑,身高2.02米,她的肚臍正是黃金分割點,肚臍以上部分和肚臍以下部分之比接近於0.618。可見黃金分割比例是作用在人們潛意識中的一種客觀規律,有著極強的自然屬性,當然也包括在股市的分析中:股價一直遵循著高低相間的運行規律。

當股價走勢出現反轉時極有可能在黃金分割比例0.382、 0.618上遇到暫時的阻力或支撐,因此通過黃金分割比例尋找出上漲/下跌趨勢中的壓力位和支撐位,有助於交易者更好地判斷「入場」和「出場」的時機。

接下來以股票「新希望」的歷史數據為例,尋找股價的支撐位和壓力位。「新希望」 2019年1月至2019年6月的走勢圖如下所示: 

通常股價的拉升不會一步到位,大多採用螺旋式上漲,也就是說在新的上漲前,要有一波回撤,洗去浮動的籌碼來蓄勢待發,而回撤的幅度恰好符合黃金分割的比例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。


總結


本文以股價分析為應用場景介紹了斐波那契數列的神奇特徵,儘管斐波那契的黃金分割線可以幫助交易者提高判斷支撐位或阻力位的成功率。

但和其他的技術分析工具一樣,它也存在一定的局限性,比如單純以波段高點和波段低點的差值作為基準這個方式,在波動較大或者區間震蕩持續較久的行情下可靠性會降低,改進的方法可以將股價按序列值大小排序,取黃金分割比例所對應位置上的序列值,這樣可靠性會更高。

作者簡介:元宵大師,Python高級工程師,致力於推動人工智慧、大數據分析在金融量化交易領域中的應用。歡迎大家關注我的個人公眾號《元宵大師帶你用Python量化交易》。

【End】

 熱 文 推 薦 

☞任正非:華為鴻蒙將比安卓快 60%;小米回應主題侵權;VS Code 1.36發布 | 極客頭條

☞喬納森離開蘋果;李彥宏被潑水;Windows 公開 Linux 內核原始碼 | 開發者周刊

☞高管出走、手機夢碎,再上一線的周鴻禕如何拯救 360 至暗時刻?

☞被竇唯誇獎「音樂好」的刺蝟樂隊成員竟然是程式設計師

☞優秀工程師必備的一項技能,你解鎖了嗎?

☞以太坊暗網? 這群北大才子做到了...

☞智能文本信息抽取算法的進階與應用

☞人工智慧六十年技術簡史

☞淚目!Linux之父:我就是覺得蘋果太沒意思!

點擊閱讀原文,輸入關鍵詞,即可搜索您想要的 CSDN 文章。

相關焦點

  • Python 揭秘斐波那契定律,如何幫助碼農分析股票?|技術頭條
    這也是斐波那契數列又稱為黃金分割數列的原因。實際上黃金分割的提出要遠早於斐波那契數列。因此再一次驗證得到斐波那契數列是近似指數增長的形式,為了更確切的說明這個問題,我們看一下由數學家比內建立的斐波那契數列的通項公式,如下所示: 由通項公式計算Fn/Fn+1的結果依然是0.618,如下所示:黃金分割率分析股價斐波那契數列是大自然的一個基本屬性,尤其是數列中的黃金分割比例部分,它出現在繪畫、雕塑、建築等多個領域,人們不約而同地認為黃金分割比例是最完美的
  • python邏輯控制總結——斐波那契數列
    斐波那契數列斐波那契數列在數學上,是一個特殊的數列,它的特徵如下:1. 第一項和第二項均為1。2. 從第三項開始,每一項均是前面兩項的和。如下:我們嘗試在控制臺輸出一個斐波那契數列的前10項。新建一個test1.py,代碼如下:
  • python迭代器和生成器總結——新的斐波那契數列
    python迭代器題目:給定一個序列,循環輸出序列中的每個元素。通過一個for循環就可以實現,如下:for循環遍歷結果事實上,python中,提供了另一個工具來幫助遍歷,該工具稱之為迭代器。可以通過iter函數來獲取一個迭代器,通過next函數來獲取下一個元素。如下:
  • 斐波那契,神級般存在的技術分析工具!
    斐波那契是從費氏數列所衍生出來的一種技術分析工具。在眾多的技術分析工具裡面,斐波那契可以算是可參考價值最高的一種,也是筆者最喜歡用的分析工具。有興趣研究黃金切割的朋友,可以好好的去研究一下費氏數列之間的關聯性,個人認為基本的0.382、0.5、0.618 這三個參數並不足以對市場作出完整的分析。
  • 斐波那契策略對競彩是否有幫助?紅彩專家為你揭秘
    在參與競彩的過程中,可以找到各種各樣的投注技巧、策略、方法,斐波那契理論就是其中之一,但是斐波那契策略對競彩投注真的有效嗎?來看紅彩專家為你揭秘:斐波那契足球博彩策略的本質很簡單:投注平局,如果你輸了,再投注。重複此流程直到你贏為止。只有兩個附加和至關重要的規則要遵守:只有當概率高於2.618時才投注平局按照斐波那契順序增加博彩注額:1、1、2、3、5、8、13、21等。
  • 斐波那契策略對競彩是否有幫助?紅彩專家帶你揭秘
    在參與競彩的過程中,可以找到各種各樣的投注技巧、策略、方法,斐波那契理論就是其中之一,但是斐波那契策略對競彩投注真的有效嗎?來看紅彩專家為你揭秘:斐波那契足球博彩策略的本質很簡單:投注平局,如果你輸了,再投注。重複此流程直到你贏為止。
  • 斐波那契數列如何幫助我們快速換算英裡公裡?
    》,這次我們來看看這個神奇的數列如何幫助我們完成英裡和公裡的換算。上述(1)式就是著名的比內(Binet)公式,也是斐波那契數列的通項,請同學測試一下。根據比內公式,我們對斐波那契的相鄰兩項的比值求極限:
  • 如何進行股票分析:股票分析的三種分析方法
    對於股票市場,我們如何進行股票分析?股票投資的分析方法主要有如下三種分析方法:基本分析法,技術分析法、演化分析法,其中基本分析主要應用於投資標的物的價值判斷和選擇上,技術分析和演化分析則主要應用於具體投資操作的時間和空間判斷上,作為提高證券投資分析有效性和可靠性的重要補充。
  • 如何利用「斐波那契指標」交易盈利?這裡有份完整攻略
    毫無疑問,斐波那契指標是最受歡迎的工具之一。交易者用它在趨勢市場來尋找潛在的回調水平。這篇文章裡,我們看看斐波那契水平可以如何用於交易中。斐波那契數列斐波那契數列是由義大利數學家Leonardo Pisano在1170年的義大利發現的。簡單來說,斐波那契數列中,每個數字等於前兩個數字的和。
  • 手把手教你如何使用斐波那契回調線
    原標題:手把手教你如何使用斐波那契回調線 其他回調水平在市場中也較為敏感,比如斐波那契位。 在交易市場上,大多數的技術指標都具有滯後性,導致交易者在使用時不太好掌握。但是,斐波那契回調線具有提前性,能很好的幫助交易者掛單操作,提前布局。
  • 什麼是斐波那契?斐波那契在外匯交易中的用法
    斐波那契是一個很廣的學科,有關斐波那契,目前已經存在眾多的研究領域,小編將在以下兩方面展開講解:斐波那契回撤和斐波那契延伸。  外匯交易能自這一數學模型中獲得巨大收益,由於在外匯圖表中震蕩目標的現實,價格通常在震蕩模型內變化,緊密的追隨斐波那契率做為阻力和支撐水平.  斐波那契價格點數,或水平,對任何外匯貨幣對都可以提前計算,因此交易者可以根據他所使用的斐波那契外匯交易系統預測了解何時進場或離場.
  • 【投資心得】神奇的斐波那契均線(1)
    來源: 贏家論市 舉報   今天給大家帶來的是一種很有用的均線設置方法:斐波那契均線
  • 科悟學院介紹什麼是Python、python能做什麼?
    這是很多人想知道的,今天小編就給你揭秘一個行業——Python(AI人工智慧),有人會問python到底是什麼?能做什麼?下面科悟學院介紹什麼是python和python能做什麼,希望對於正在學習的你有所幫助。
  • 寫Python 代碼不可不知的函數式編程技術
    選自 Medium作者:Raivat Shah參與:魔王、Jamin本文對 Python 中的函數式編程技術進行了簡單的入門介紹。近來,越來越多人使用函數式編程(functional programming)。因此,很多傳統的命令式語言(如 Java 和 Python)開始支持函數式編程技術。
  • |python|電氣和電子工程師協會|編程...
    站在某種角度上說,能獲取並分析數據的人,離事物的真相也更進一步。Python 正是幫助我們抵達真相的工具。而這也是潘石屹選擇學習 Python 的原因,對商業地產而言,準確收集分析、預測市場數據太重要了!
  • 交易者必備——斐波那契回調線的絕妙用法
    本期《交易智慧》,將為大家介紹一個交易者常用的技術指標——斐波那契回調線,又稱黃金分割線。在交易市場上,大多數的技術指標都具有滯後性,導致交易者在使用時不太好掌握。但是,斐波那契回調線具有提前性,能很好的幫助交易者掛單操作,提前布局。而下文將會以概念介紹、基本用法以及實戰方法三個板塊解釋,該如何用好斐波那契回調線。
  • 初學者如何用「python爬蟲」技術抓取網頁數據?
    我們只需要耐心觀察並添加一些技術手段即可獲得大量有價值的數據。而這裡的「技術手段」就是指網絡爬蟲。 今天,小編將與您分享一個爬蟲的基本知識和入門教程:什麼是爬蟲?網絡爬蟲,也叫作網絡數據採集,是指通過編程從Web伺服器請求數據(HTML表單),然後解析HTML以提取所需的數據。
  • Python代碼性能調試和優化
    本文蟲蟲就給大家介紹一下如何調試Python應用的性能,以及怎麼對其進行優化。Python性能調試要進行Python性能,前提條件是要找出程序中的性能瓶頸。找出程序中影響程序性能的代碼。詳細性能分析cProfile性能分析另一個常用的方法是使用cProfile,它可以提供很多性能信息python3 -m cProfile -s time performance.py例子中,我們使用了cProfile模塊和time參數運行測試腳本,以便按內部時間(cumtime)對行進行排序。
  • 股市中神奇的斐波那契數
    斐波那契數列,又稱黃金分割數列。斐波那契數列在自然科學中有許多應用。比如松果、鳳梨、樹葉的排列、某些花朵的花瓣數(典型的有向日葵花瓣),蜂巢,蜻蜓翅膀,魯德維格定律、超越數e,黃金矩形、黃金分割、等角螺線,楊輝三角、十二平均律等。
  • 交易玄學:斐波那契數列
    斐波那契用一個螺旋的比例和形狀(如下圖)解釋了斐波那契數列:1、1、2、3、5、8、13、21、34……。在計算的過程中,發現了當時希臘人已知的黃金分割比例:1.618,所以斐波那契數列也被稱為黃金分割數列。按斐波那契比例形成的螺旋  斐波那契數列在期貨市場上有哪些應用?