日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

1.2 金融中的科技

現在,我們對Python已經有了大致的認識,接下來簡短地介紹一下科技在金融中的作用就很有意義了。這將使我們更好地評判Python在金融行業中已經承擔的任務,更重要的是,還可以評判未來承擔的任務。

在某種意義上,科技對于金融機構(例如與生物技術公司相比)或者財務部門(與其他企業職能部門相比,如后勤)沒有什么特別的作用。然而,近年來,在創新和監管的刺激下,銀行和其他金融機構(如對沖基金)越來越多地發展成為技術公司而不僅僅是金融中介機構。科技成為了全球幾乎所有金融機構的重要資產,具備導致競爭優勢和劣勢的潛力。某些背景信息可以解釋這種發展的原因。

1.2.1 科技投入

銀行和金融機構共同組成了每年在科技上投入最多的行業。因此,下面的陳述不僅說明科技對金融行業的重要性,也說明了金融行業對科技的重要性:

美國馬薩諸塞州弗雷明漢,2018年6月14日——根據國際數據公司(IDC)的一系列“金融服務IT開銷指南”稱,全球金融服務公司在信息科技(IT)上的開銷將從2018年的4400億美元增長到2021年的近5000億美元。

——IDC

特別是,銀行和其他金融機構正在參與業務及運營模式數字化的競爭:

2017年,北美地區銀行在新科技上的開銷高達199億美元。

銀行開發當前系統并致力于新的技術解決方案,以增強其在全球市場上的競爭力,吸引對新的網絡和移動科技感興趣的客戶。對于為銀行業提供新思路和軟件解決方案的全球金融科技公司來說,這是一個巨大的機遇。

——Statista

當今的大型跨國銀行通常雇傭數千名開發人員,以維護現有系統并構建新系統。具有大量科技需求的大型投資銀行每年的科技預算往往達到數十億美元。

1.2.2 作為業務引擎的科技

科技發展對金融行業的創新和效率增進也有貢獻。通常,這一領域的項目統稱為“數字化項目”:

金融服務業在過去數年中已經歷了科技先導的徹底變革。許多高管期望IT部門改進效率,促進游戲規則的創新——同時降低成本,繼續支持遺留系統。與此同時,金融科技初創企業正在逐步蠶食原有市場,提出對客戶友好的解決方案,這些方案是從頭開始設計的,不受遺留系統的阻礙。

——普華永道第19次年度全球CEO調查報告(2016年)

效率提高的副作用之一就是,金融機構往往必須在更為復雜的產品或者交易中尋求競爭優勢。這當然會使風險增大,并使風險管理、監控和監管越來越困難。2007年和2008年的金融危機說明了這些發展帶來的潛在危險。同樣,“算法和計算機失控”也給金融市場帶來潛在的風險;2010年5月的所謂“閃電崩盤”事件戲劇性地展現了上述風險,自動化賣出導致某些股票和股票指數在當日大幅度下跌。

1.2.3 作為進入門檻的科技和人才

一方面,在其他條件不變的情況下,隨著時間的推移,科技的進步會降低成本。另一方面,金融機構持續在科技上投入巨資,以增大市場份額、保持自身地位。在今天的金融市場上取得一席之地往往需要在科技和熟練人員上大規模投資。考慮衍生品分析領域的一個例子:

在整個軟件生命期中,采用內部OTC(衍生品)定價策略的公司僅在一個完整的衍生品庫的構建、維護和改進上就需要投入2500萬~3600萬美元。

——Ding 2010

構建一個完善的衍生品分析庫不僅成本高昂和費時,而且需要有足夠的專業人士來進行這項工作。這些專業人士必須有正確的工具和技術,才能完成相應的任務。隨著Python生態系統的發展,與10年前相比,這些工作變得更加高效,相關的成本也有了顯著的下降。第5部分介紹衍生品分析,僅用Python及標準庫就構建了一個規模雖小卻強大旦靈活的衍生品定價庫。

下面,我們引用另一段美國長期資本管理公司(LTCM)的陳述,以進一步支持關于科技和人才的觀點。LTCM曾是最受尊敬的計量對沖基金,但是在20世紀90年代末破產:

Meriwether在最新型計算機系統上花費了2000萬美元,并雇用一個由一流金融工程師成的團隊在LTCM操縱該系統,他們在康涅狄格州的格林尼治開始工作。這是行業級別的風險管理。

——Patterson 2010

Meriwether花費數百萬美元才能得到的計算能力,在今天只需要幾千美元就能實現。這種專業基礎設施每月的起始費用僅為幾美元。另一方面,大型金融機構的交易、定價和風險管理已經變得非常復雜,以致于現在必須部署具有數萬個計算核心的IT基礎架構。

1.2.4 不斷提高的速度、頻率和數據量

金融行業有一個方面最受科技進步的影響:金融交易決策和執行的速度及頻率。Lewis最近的著作(2014)生動而詳細地描述了所謂的“閃電交易”——也就是以可能的最高速度進行的交易。

一方面,可用數據的時間標度越來越小,使實時反應成為必需的能力。另一方面,交易的速度和頻率的提高使數據量進一步增大。這兩方面相互補充,推動了金融交易平均時間標度的系統性下降。這種趨勢在10年前就已經開始:

復興資本公司的“大獎章”基金在2008年獲得了80%的驚人增長率,它以閃電般速度的計算機抓住了市場極端活躍的機會。Jim Simons是當年世界盈利最高的對沖基金管理人,收入達到25億美元。

——Patterson 2010

單只股票30年的每日股價數據大致包含7500個報價。這類數據是大部分現代金融理論的基礎。例如,現代投資組合理論(MPT)、資本定價模型(CAPM)和風險價值(VaR)等理論都以每日股價數據為基礎。

相比之下,蘋果公司(AAPL)典型交易日報價次數大約為15000——兩倍于30年日終報價的數量(參見1.4小節的例子)。這帶來了許多挑戰。

數據處理

只考慮和處理股票或者其他金融工具的日終報價是不夠的。在每周的7天、每天的24個小時內,某些金融工具上發生的事情“太多了”。

分析速度

決策往往必須在幾毫秒甚至更短的時間內做出,有必要構建獨自的分析能力工具,并實時分析大量數據。

理論基礎

雖然傳統金融理論和概念遠稱不上完美,但是它們經受了時間的考驗(有些時候受到排斥);對于毫秒級計量能力很重要的今天,仍然缺乏在很長時間內證明是穩定的一致性概念和理論。

總體上,上述挑戰都只能由現代科技應對。令人有些驚訝的是,缺乏一致性理論的問題也常常通過技術方法處理。在這種情況下,高速算法利用的是市場微觀結構要素(例如,訂單流、買賣價差),而不依賴于某種金融推理方法。

1.2.5 實時分析的興起

金融行業中有一個學科的重要性正在強勁增長:金融和數據分析。這種現象與行業中速度、頻率和數據率飛速增長有緊密的關系。實際上,實時分析可以視為行業對這種趨勢的反應。

粗略地講,“金融和數據分析”指的是將應用軟件、科技,與(可能是先進的)算法、數據收集、數據處理及分析方法相結合,以獲得深刻的洞察力、做出決策或者滿足監管需求的學科。這類分析的例子包括銀行零售部門中某個金融產品定價結構的變化對銷售情況影響的估算。另一個例子是投資銀行衍生品復雜投資組合信用價值調整(CVA)的大規模隔夜計算。

金融機構在這種環境下主要面對兩種挑戰。

大數據

在“大數據”這一術語出現之前,銀行和其他金融機構就必須處理海量數據。然而,單一分析任務所處理的數據量隨著時間的推移而有了很大的增長,從而要求計算能力有所提高并有更大的內存與存儲能力。

實時經濟

過去,決策者只能依賴結構化的定期計劃、決策和風險管理過程,而今天決策者面對的是實時完成這些任務的需求。過去在后臺通過隔夜批量運行可以完成的任務,現在已經轉向前臺實時執行。

同樣,人們可以觀察到科技和金融/商業發展之間的相互作用。一方面,市場上出現了通過現代科技的應用不斷改進分析方法的速度和效率的需求。另一方面,科技的進步使幾年甚至幾個月之前認為不可能(或者由于預算約束而不可行)的新分析方法成為可能。

分析領域的一個重要趨勢是利用中央處理單元(CPU)的并行結構和通用計算圖形處理單元(GPGPU)的大規模并行結構。現在的GPGPU往往有1000多個計算核心,有時候有必要徹底反思并行性對不同算法的意義。用戶通常必須學習新的范型和技術才能利用這種硬件,這仍是障礙。

1.3 用于金融的Python

1.2節介紹了科技在金融中發揮作用的一些領域:

  • 金融行業中的科技成本;
  • 作為新業務和創新業務引擎的科技;
  • 作為金融行業進入門檻的科技;
  • 不斷提升的速度、頻率和數據量;
  • 實時分析的興起。

本節,我們分析Python如何幫助你應對這些方面的多種挑戰。不過首先讓我從更為基礎的方面——語言和語法介紹用于金融的Python。

1.3.1 金融和Python語法

在金融環境中邁出使用Python第一步的大部分人都可能要攻克某個算法問題。這和想要解出微分方程、求取積分或者可視化某些數據的科學工作者類似。一般來說,在這一階段,對正規開發過程、測試、文檔或者部署沒有太多的要求。然而,這一階段似乎是人們特別容易愛上Python的時候,主要原因是Python的語法總體上和用于描述科學問題或者金融算法的數學語法相當接近。

我們可以通過一個簡單的金融算法——通過蒙特卡洛模擬方法估計歐式看漲期權的價值來說明這一現象。我們將考慮Black-Scholes-Merton(BSM)模型,在這種模型中期權的潛在風險遵循幾何布朗運動。

假定我們使用以下數值化參數進行估值:

  • 初始股票指數水平S0=100;
  • 歐式看漲期權的行權價格K=105;
  • 到期時間T=1年;
  • 固定無風險短期利率r=5%;
  • 固定波動率σ=20%。

在BSM模型中,到期指數水平是一個隨機變量,由公式1-1給出,其中z是一個標準正態分布隨機變量。

公式1-1 Black-Scholes-Merton(1973)到期指數水平

Python與金融:為什么將Python用于金融?

 

下面是蒙特卡洛估值過程的算法描述。

(1)從標準正態分布中取得I個(偽)隨機數z(i),i∈{1,2,…,I}。

(2)為給定的z(i)和公式1-1計算所有到期指數水平ST(i)。

(3)計算到期時期權的所有內在價值hT(i)=max(ST(i)−K,0)。

(4)通過公式1-2中給出的蒙特卡羅估算函數估計期權現值。

公式1-2 歐式期權的蒙特卡洛估算函數

Python與金融:為什么將Python用于金融?

 

現在,我們需要將這個問題和算法翻譯為Python代碼。下面的代碼將實現一些必要的步驟。

In [6]: import math
import numpy as np ?

In [7]: S0 = 100. ?
K = 105. ?
T = 1.0 ?
r = 0.05 ?
sigma = 0.2 ?

In [8]: I = 100000 ?

In [9]: np.random.seed(1000) ?
In [10]: z = np.random.standard_normal(I) ?

In [11]: ST = S0 * np.exp((r - sigma ** 2 / 2) * T + sigma * math.sqrt(T) * z) ?

In [12]: hT = np.maximum(ST - K, 0) ?

In [13]: C0 = math.exp(-r * T) * np.mean(hT) ?

In [14]: print('Value of the European call option: {:5.3f}.'.format(C0)) ?
Value of the European call option: 8.019.

? NumPy在這里作為主程序包使用。

? 定義模型并模擬參數值。

? 隨機數生成器種子值固定。

? 提取標準正態分布隨機數。

? 模擬期末價值。

? 計算期權到期收益。

? 計算蒙特卡洛估算函數。

? 打印輸出估算結果。

以下3個方面值得注意。

語法

Python語法與數學語法相當接近,例如參數賦值的方面。

翻譯

每條數學或者算法語句一般都可以翻譯為單行Python代碼。

向量化

NumPy的強項之一是緊湊的向量化語法,例如,允許在單一代碼行中進行10萬次計算。

這段代碼可以用于IPython或Jupyter Notebook等交互式環境。但是,需要頻繁重用的代碼一般組織為所謂的模塊(或者腳本),也就是帶有.py后綴的Python(文本)文件。本例的模塊如例1-1所示,可以將其保存為名為bsm_msc_euro.py的文件。

例1-1 歐式看漲期權的蒙特卡洛估值

#
# Monte Carlo valuation of European call option
# in Black-Scholes-Merton model
# bsm_mcs_euro.py
#
# Python for Finance, 2nd ed.
# (c) Dr. Yves J. Hilpisch
#
import math
import numpy as np

# Parameter Values
S0 = 100. # initial index level
K = 105. # strike price
T = 1.0 # time-to-maturity
r = 0.05 # riskless short rate
sigma = 0.2 # volatility

I = 100000 # number of simulations

# Valuation Algorithm
z = np.random.standard_normal(I) # pseudo-random numbers
# index values at maturity
ST = S0 * np.exp((r - 0.5 * sigma ** 2) * T + sigma * math.sqrt(T) * z)
hT = np.maximum(ST - K, 0) # payoff at maturity
C0 = math.exp(-r * T) * np.mean(hT) # Monte Carlo estimator

# Result Output
print('Value of the European call option %5.3f.' % C0)

這一小節中的簡單算法示例說明,Python的基本語法很適合為經典的科學語言二重奏——英語和數學來提供補充。在科學語言組合中添加Python能使其更加全面。我們現在擁有:

  • 用于寫作和談論科學、金融等問題的英語;
  • 用于簡潔、精確地描述抽象特征、算法、復數等并為其建模的數學;
  • 從技術上建立抽象特征、算法、復數等的模型并加以實現的Python。

數學和Python語法 

幾乎沒有任何編程語言像Python這樣接近數學語法。因此,數值算法很容易從數學表示翻譯為Python實現。通過Python,我們可以在這些領域中高效地進行原型化、開發和代碼維護。

在某些領域中,使用偽代碼是常見的做法,這引入了第 4 個語言家族成員。舉個例子,偽代碼的任務是以更技術性的方式表示金融算法,不但與數學表示接近,而且還接近于技術實現。除了算法本身,偽代碼還考慮了計算機的工作原理。

采用這種方法一般是因為,使用大部分編程語言時,技術實現和正式的數學表現形式的距離相當“遙遠”。大部分編程語言都必須包含許多只在技術上需要的元素,但在數學和代碼中很難看到等價的元素。

時下,Python常常以偽代碼的方式被使用,因為它的語法和數學很類似,而且技術“開銷”可以控制到最低。這一點是通過該語言所體現的一些高層概念實現的,這些概念不僅有其優勢,也帶來了風險和其他代價。不過可以肯定,我們可在需求出現的時候使用Python,從一開始就遵循其他語言可能需要的嚴格實現和編碼方法。從這個意義上說,Python可以在兩個世界:高層次的抽象和嚴格的實現中提供最佳的平衡。

1.3.2 Python的效率和生產率

從較高的層次看,使用Python的好處可以從以下3個維度衡量。

效率

Python如何更快地獲得結果、節約成本、節約時間?

生產率

Python如何在相同的資源(人員、資產等)下完成更多的工作?

質量

Python能夠讓我們做哪些替代技術所不能做到的事情?

對這些特性的討論當然不可能很全面。然而,可以將某些特性作為出發點。

1.在更短的時間里得到成果

Python效率較為明顯的領域之一是交互式的數據分析。這些領域從IPython、Jupyter Notebook等有力工具和pandas之類的程序中庫獲益良多。

假設你是一位正在撰寫碩士論文的金融專業學生,對標普 500 指數感興趣,想要分析 1 年的歷史指數水平,以了解指數在這段時間內的波動性,你希望找到證據證明這種變動性與某些典型的模型假設相反,它是隨時間變動而非固定。而且,應該對結果進行可視化,你要進行的主要的工作如下:

  • 從網絡上下載指數水平數據;
  • 計算年化對數收益率的滾動標準差(波動率);
  • 繪制指數水平數據和波動性結果圖表。

這些任務很復雜,在不久之前還被認為是專業金融分析師才能完成的。而在今天,即使是金融專業的學生也可以輕松地對付這類問題。我們來看看具體的做法——此時還不用操心語法的細節。

In [16]: import numpy as np ?
import pandas as pd ?
from pylab import plt, mpl ?

In [17]: plt.style.use('seaborn') ?
mpl.rcParams['font.family'] = 'serif' ?
%matplotlib inline

In [18]: data = pd.read_csv('../../source/tr_eikon_eod_data.csv',
index_col=0, parse_dates=True) ?
data = pd.DataFrame(data['.SPX']) ?
data.dropna(inplace=True) ?
data.info() ?
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 2138 entries, 2010-01-04 to 2018-06-29
Data columns (total 1 columns):
.SPX 2138 non-null float64
dtypes: float64(1)
memory usage: 33.4 KB

In [19]: data['rets'] = np.log(data / data.shift(1)) ?
data['vola'] = data['rets'].rolling(252).std() * np.sqrt(252) ?
In [20]: data[['.SPX', 'vola']].plot(subplots=True, figsize=
(10, 6)); ?

? 導入NumPy和pandas。

? 導入matplotlib并配置Jupyter繪圖樣式和方法。

? pd.read_csv()可以讀取遠程或者本地存儲的逗號分隔值(CSV)形式數據集。

? 選取一個數據子集,刪除NaN(非數值)值。

? 顯示關于數據集的一些元信息。

? 以向量化的方式(在Python級別上“無循環”)計算對數收益率。

? 得出滾動年化波動率。

? 最后繪制兩個時間序列。

圖1-1展示了這一簡短交互會話所得到的圖形化結果。用幾行代碼就足以完成金融分析中的典型復雜任務:數據收集、復雜和重復的數學計算以及結果的可視化,令人覺得不可思議。從這個例子中可以看到,pandas使整個時間系列的處理變得就像浮點數上的數學運算那樣容易。

Python與金融:為什么將Python用于金融?

圖1-1 標普500收盤價和年化波動率

將這個例子轉換到專業的金融環境中,可以看出金融分析師在應用提供高層次抽象的合適Python工具和庫的時候,能夠將焦點放在自身的領域上,而不用關心復雜的技術細節。分析師可以快速反應,幾乎實時地提供寶貴的調見,確保自己比競爭對手先行一步。這種效率的提高很容易轉換為可度量的財務效果。

2.確保高性能

一般來說,Python的語法相當簡潔,編碼效率相對高是為人們所接受的說法。但是,由于Python本質上是解釋型語言,因此存在一種偏見,認為Python對于金融學中的計算密集任務來說速度過于緩慢。確實,在某些特定的實現方法下,Python可能確實很慢,但是,它并不一定都那么緩慢——它可以在幾乎所有應用領域中表現出高性能。理論上,人們至少可以找到3種提高性能的策略。

慣例和范型

一般來說,Python可以用許多不同的方式得出相同的結果,但是這些方式的性能特性有相當大的區別;只要選擇合適的方式(如特定的實現方法、明智地使用數據結構、通過向量化避免循環或者使用pandas等特定庫),就可以顯著地改善效果。

編譯

現在,有許多高性能庫可以提供重要函數的編譯版本,或者將Python代碼靜態或者動態地(在運行時或者調用時)編譯為機器代碼,這種代碼的速度比純Python代碼要快好幾個數量級。比較流行的高性能庫有Cython和Numba等。

并行化

許多計算任務(特別是金融學中的計算任務)可以從并行執行中得到很大好處;這對Python來說不足為奇,可以輕松地實現。

使用Python實現高性能計算

Python本身不是一種高性能計算技術。但是,Python已經發展成為一種訪問當前高性能技術的理想平臺。在這個意義上,Python已經成為高性能計算的“黏合劑”語言。

本節堅持使用簡潔實用的例子介紹上述3種策略(后續的章節將詳細介紹這些策略)。金融分析中相當常見的任務之一是在大量數字上計算復雜的數學表達式。在這方面,Python本身就提供了所有必需的功能:

In [21]: import math
loops = 2500000
a = range(1, loops)
def f(x):
return 3 * math.log(x) + math.cos(x) ** 2
%timeit r = [f(x) for x in a]
1.59 s ± 41.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Python解釋程序在本例中需要1.6s的時間來完成250萬次函數f的計算。使用NumPy可以完成相同的任務,它提供了優化(也就是預先編譯)的函數來處理這種基于數組的運算:

In [22]: import numpy as np
a = np.arange(1, loops)
%timeit r = 3 * np.log(a) + np.cos(a) ** 2
87.9 ms ± 1.73 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

NumPy可以將執行時間大幅縮減到約88ms。甚至有一個庫是專門用于此類任務的,這個庫叫作numexpr,得名于“數值表達式”(Numerical Expressions)。它可以編譯表達式來改善NumPy通用功能的性能。例如,在執行期間避免ndarray對象在內存中復制:

In [23]: import numexpr as ne
ne.set_num_threads(1)
f = '3 * log(a) + cos(a) ** 2'
%timeit r = ne.evaluate(f)
50.6 ms ± 4.2 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

使用這種更特殊的方法可以進一步將執行時間降低至約50ms。而且,numexpr還內建了并行執行單獨運算的功能。這使我們能夠使用一個CPU的多個線程:

In [24]: ne.set_num_threads(4)
%timeit r = ne.evaluate(f)
22.8 ms ± 1.76 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

本例利用了4個線程,執行時間進一步下降到23ms,總體的性能提升了90倍。特別要注意的是,這類改善不需要修改基本問題/算法,也不用了解任何有關編譯和并行化問題的知識,即使是非專業人士也可以從較高的層次上去利用這種功能。當然,前提是你必須知道存在這些功能。

這個例子說明,Python提供了一些選項可以更好地利用現有資源,也就是提高生產率。利用并行化方法,可以在同樣的時間里完成3倍于串行化方法的計算,這只需要告訴Python使用多個CPU線程(而非僅使用一個線程)即可。

1.3.3 從原型化到生產

從執行速度的角度看,交互式分析的效率和性能當然是Python值得考慮的兩個好處。在金融學中使用Python的另一個好處初看似乎比較不起眼,但是細看之下就會發現它本身是一個重要的戰略因素。這就是以端到端(從原型化到生產)的方式使用Python的可能性。

當今全球金融機構的金融開發過程往往是一個分離的兩步式過程。一方面,量化分析師(quants,也稱寬客)負責模型開發和技術原型化。他們喜歡使用MatLab和R等工具和環境實現快速、交互式的應用程序開發。在開發的這一階段,性能、穩定性、異常管理、數據訪問分離和分析等問題都不重要。人們的主要目標是概念或者原型的驗證,原型用于展現某種算法或者整個應用程序必需的主要功能。

一旦原型完成,IT部門中的開發人員接管工作,他們負責將現有原型代碼翻譯為可靠、易于維護和高性能的生產代碼。這一階段中,通常在用于滿足生產性能的C++或者JAVA語言中有一個范型轉換的過程。而且,正規的開發過程還要用它專業工具、版本控制等技術。

這種兩步式方法會產生一些意外的結果。

效率低下

原型代碼不能重用;算法必須實現兩次;多余的工作消耗時間和資源;轉譯時產生的風險。

多種技能集

不同部門展現不同的技能集合,使用不同的語言實現“相同的工作”。

遺留代碼

代碼必須以不同的語言存在和維護,并使用不同的實現風格(例如,從架構的觀點上看)。

另一方面,使用Python可以實現合理化的端到端過程——從最初的交互式原型化步驟到高可靠性、易于維護的生產代碼。不同部門之間的溝通變得更加簡單,工作人員的培訓也更為合理,只有一種主要語言覆蓋金融應用構建的所有領域,還避免了在開發過程不同步驟中使用不同技術造成的低效和冗余性。總而言之,Python可以為金融應用開發和算法實現提供一致性的技術框架。

1.4 數據驅動和人工智能優先的金融學

1.4.1 數據驅動金融學

最重要的一些金融理論(如MPT和CAPM)可以追溯到上世紀50年代和60年代。然而,它們仍然是經濟、財務、金融工程和商業管理領域教育的基石。這可能令人驚訝,因為大部分此類理論的實證支持相當貧乏,而證據往往完全與理論相反。另一方面,它們的流行性也是可以理解的,因為它們接近于人們對金融市場表現的期望,而且,它們是建立在一些吸引人(通常過于簡單)的假設之上的簡潔數學理論。

科學方法(如物理學)始于數據(如來自試驗或者觀察的數據),然后得出假設和理論,并用數據加以測試。如果測試結果是肯定的,那可以對這些假設和理論進行提煉,并以合適的方法記錄下來,例如以研究型論文的方式發表。如果測試結果是否定的,假設和理論將被拋棄,并開始尋找復合數據的新理論。由于物理定律在一段時間里是穩定的,所以一旦發現并對齊進行了完備的測試,那么在最佳狀況下,通常可以認為是永遠成立的。

(計量)金融學的歷史大部分與科學方法相悖。在許多情況下,理論和模型是在簡化的數學假設下“從頭”開發的,目標是發現金融學核心問題的簡練回答。金融學的流行假設是,金融工具的回報呈標準正態分布,各種利率之間呈線性關系。由于這些現象在金融市場上很難看到,這些簡單理論的實證往往很缺乏,也就不值得驚訝了。許多金融理論和模型都是首先提出公式、證明并發表,然后才進行實證測試的。在某種程度上,這當然是因為上世紀50年代或者70年代甚至更晚的時候,還不存在合適形式的金融數據,而今天就連攻讀金融學士學位的學生都能得到這些數據。

20世紀90年代初期到中期,金融機構所能得到的此類數據急劇增加。今天,甚至進行金融研究或者參與算法交易的個人都可以得到大量的歷史數據,也可以通過流服務得到實時數據。這使我們可以專注于科學方法,科學方法通常從數據開始,然后得出思路、假設、模型和策略。

用一個簡單的例子就可以說明,如今在本地機器上利用Python和Eikon Data APIs訂閱大規模專業數據有多么簡單。下面的例子是讀取的蘋果公司股票常規交易日中一個小時的分筆交易數據。讀取的報價數據(包括交易量信息)大約有15000條。由于股票代碼為AAPL,所以路透金融工具代碼(RIC)為AAPL.0:

In [26]: import eikon as ek ?

In [27]: data = ek.get_timeseries('AAPL.O', fields='*',
start_date='2018-10-18 16:00:00',
end_date='2018-10-18 17:00:00',
interval='tick') ?

In [28]: data.info() ?
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 35350 entries, 2018-10-18 16:00:00.002000 to
2018-10-18
16:59:59.888000
Data columns (total 2 columns):
VALUE 35285 non-null float64
VOLUME 35350 non-null float64
dtypes: float64(2)
memory usage: 828.5 KB

In [29]: data.tail() ?
Out[29]: AAPL.O VALUE VOLUME
Date
2018-10-18 16:59:59.433 217.13 10.0
2018-10-18 16:59:59.433 217.13 12.0
2018-10-18 16:59:59.439 217.13 231.0
2018-10-18 16:59:59.754 217.14 100.0
2018-10-18 16:59:59.888 217.13 100.0

? Eikon Data API需要訂閱和API連接才能使用。

? 讀取蘋果公司(AAPL.0)股票分筆數據。

? 顯示最后5行數據。

Eikon Data API不僅提供了對結構化金融數據(如歷史報價數據)的訪問,還可以訪問新聞等非結構化數據。下面的例子讀取一小部分新聞的元數據。

In [30]: news = ek.get_news_headlines('R:AAPL.O Language:LEN',
date_from='2018-05-01',
date_to='2018-06-29',
count=7) ?

In [31]: news ?
Out[31]:
versionCreated 
2018-06-28 23:00:00.000 2018-06-28 23:00:00.000
2018-06-28 21:23:26.526 2018-06-28 21:23:26.526
2018-06-28 19:48:32.627 2018-06-28 19:48:32.627
2018-06-28 17:33:10.306 2018-06-28 17:33:10.306
2018-06-28 17:33:07.033 2018-06-28 17:33:07.033
2018-06-28 17:31:44.960 2018-06-28 17:31:44.960
2018-06-28 17:00:00.000 2018-06-28 17:00:00.000

text 
2018-06-28 23:00:00.000 RPT-FOCUS-AI ambulances and robot doctors: Chi...
2018-06-28 21:23:26.526 Why Investors Should Love Apple's (AAPL) TV En...
2018-06-28 19:48:32.627 Reuters Insider - Trump: We're reclaiming our ...
2018-06-28 17:33:10.306 Apple v. Samsung ends not with a whimper but a...
2018-06-28 17:33:07.033 Apple's trade-war discount extended for anothe...
2018-06-28 17:31:44.960 Other Products: Apple's fast-growing island of...
2018-06-28 17:00:00.000 Pokemon Go creator plans to sell the tech behi...
storyId 
2018-06-28 23:00:00.000 urn:newsml:reuters.com:20180628:nL4N1TU4F8:6
2018-06-28 21:23:26.526 urn:newsml:reuters.com:20180628:nNRA6e2vft:1
2018-06-28 19:48:32.627 urn:newsml:reuters.com:20180628:nRTV1vNw1p:1
2018-06-28 17:33:10.306 urn:newsml:reuters.com:20180628:nNRA6e1oza:1
2018-06-28 17:33:07.033 urn:newsml:reuters.com:20180628:nNRA6e1pmv:1
2018-06-28 17:31:44.960 urn:newsml:reuters.com:20180628:nNRA6e1m3n:1
2018-06-28 17:00:00.000 urn:newsml:reuters.com:20180628:nL1N1TU0PC:3

sourceCode
2018-06-28 23:00:00.000 NS:RTRS
2018-06-28 21:23:26.526 NS:ZACKSC
2018-06-28 19:48:32.627 NS:CNBC
2018-06-28 17:33:10.306 NS:WALLST
2018-06-28 17:33:07.033 NS:WALLST
2018-06-28 17:31:44.960 NS:WALLST
2018-06-28 17:00:00.000 NS:RTRS
In [32]: story_html = ek.get_news_story(news.iloc[1, 2]) ?

In [33]: from bs4 import BeautifulSoup ?

In [34]: story = BeautifulSoup(story_html, 'html5lib').get_text() ?

In [35]: print(story[83:958]) ?
Jun 28, 2018 For years, investors and Apple AAPL have been beholden to
the iphone, which is hardly a negative since its flagship product is
largely responsible for turning Apple into one of the world's biggest
companies. But Apple has slowly pushed into new growth areas, with
streaming television its newest frontier. So let's take a look at what
Apple has planned as it readies itself to compete against the likes of
Netflix NFLX and Amazon AMZN in the battle for the new age of
entertainment.Apple's second-quarter revenues jumped by 16% to reach
$61.14 billion, with iPhone revenues up 14%. However, iPhone unit sales
climbed only 3% and iPhone revenues accounted for over 62% of total Q2
sales. Apple knows this is not a sustainable business model, because
rare is the consumer product that can remain in vogue for decades. This
is why Apple has made a big push into news,

? 讀取一小部分新聞的元數據。

? 讀取一篇文章的全部文本,形式為HTML文檔。

? 導入BeautifulSoup HTML解析庫并進行后續操作。

? …以純文本方式(str對象)提取內容。

? 打印新聞的開頭。

盡管這兩個例子很淺顯,但它們說明,通過Python包裝器庫和數據訂閱服務,可以以標準化、高效的方式得到結構化和非結構化的金融歷史數據。在許多情況下,個人甚至可以使用FXCM集團、LLC等交易平臺來免費獲得類似的數據集。一旦在Python級別上得到數據(獨立于原始來源),就可以利用Python數據分析生態系統的全部功能了。

數據驅動金融學

近年來,數據成了金融業的推動力。即使最大、最成功的對沖基金也自稱是“數據驅動”的,而非“金融驅動”的。越來越多的服務產品向大小機構及個人提供海量數據。Python通常被選為與這些API交互、處理和分析數據的編程語言。

1.4.2 人工智能優先金融學

由于通過編程API能夠取得大量金融數據,所以在金融問題(如算法交易)上應用人工智能(AI)方法、特別是機器與深度學習(ML,DL)就變得非常容易,也更有成果了。

Python可以稱得上AI界的“寵兒”。它往往被AI研究人員和從業者選為編程語言。從這個意義上說,金融領域從不同領域的發展中得益,這些領域有時甚至與金融沒有太大的聯系。舉個例子,深度學習所用的TensorFlow開源程序庫是google公司開發和維護的,用于其母公司Alphabet自動駕駛汽車的制造和銷售上。

TensorFlow當然和股票自動算法交易一點關聯都沒有,但卻可以用于預測金融市場的變動。最廣泛使用的Python ML程序庫是scikit-learn。下面的代碼以高度簡化的方式說明:ML 分類算法如何用來預測期貨價格變動方向,并以這些預測為基礎制定一個算法交易策略。首先,導入數據,準備期貨數據(定向滯后對數收益率數據)。

In [36]: import numpy as np
import pandas as pd

In [37]: data = pd.read_csv('../../source/tr_eikon_eod_data.csv',
index_col=0, parse_dates=True)
data = pd.DataFrame(data['AAPL.O']) ?
data['Returns'] = np.log(data / data.shift()) ?
data.dropna(inplace=True)

In [38]: lags = 6

In [39]: cols = []
for lag in range(1, lags + 1):
col = 'lag_{}'.format(lag)
data[col] = np.sign(data['Returns'].shift(lag)) ?
cols.append(col)
data.dropna(inplace=True)

? 選擇蘋果公司(AAPL.0)歷史日終數據。

? 計算整個歷史數據內的對數收益率。

? 生成帶有定向滯后對數收益率數據(+1或者−1)的DateFrame列。

接下來,為支持向量機(SVM)算法、模型擬合和預測步驟實例化一個模型對象。圖1-2說明,根據預測買進和賣出蘋果公司股票的基于預測交易策略的表現勝過被動的基準股票投資方法。

Python與金融:為什么將Python用于金融?

圖1-2 基于ML的算法交易策略與被動基準投資的對比(蘋果公司股票)

In [40]: from sklearn.svm import SVC

In [41]: model = SVC(gamma='auto') ?

In [42]: model.fit(data[cols], np.sign(data['Returns'])) ?
Out[42]: SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)

In [43]: data['Prediction'] = model.predict(data[cols]) ?

In [44]: data['Strategy'] = data['Prediction'] * data['Returns'] ?

In [45]: data[['Returns', 'Strategy']].cumsum().apply(np.exp).plot(
figsize=(10, 6)); ?

? 實例化模型對象。

? 根據期貨和標簽數據(全部是定向的)擬合模型。

? 使用擬合模型創建預測(樣本內),這同時是交易策略的頭寸(買入或者賣出)。

? 根據預測值和基準對數收益率計算交易策略的對數收益率。

? 繪制基于ML交易策略表現與被動基準投資表現的對比曲線。

這里采用的簡化方法沒有考慮交易成本,也沒有將數據集分為訓練和測試子集。但是,這個例子說明,至少從技術意義上,將ML算法應用到金融數據有多么簡單。在實踐中,需要考慮一些重要的因素(參見Lopez de Prado(2018))。

人工智能優先金融學

AI將像對待其他領域一樣,重塑金融行業。通過編程API功能可以取得大量金融數據,這成為了該領域的引擎。

作為數據驅動金融學的自然延伸,不管從研究還是從業者的角度,金融學中的人工智能當然也是一個令人癡迷和興奮的領域。不過,這些技術與方法對人工智能優先金融學同樣重要。

1.5 結語

Python作為一種語言,但更多的是作為生態系統,是金融業理想的技術框架。它的特性中有許多好處,比如簡潔的語法、高效的開發方法和原型化及生產的易用性等。利用Python大量的可用庫和工具,我們似乎能夠應付當今金融業中分析、數據量和頻率、依從性及監管所引發的大部分問題。即使在較大型的金融機構中,它也具備提供單一、強大、一致性的框架,簡化端到端開發和生產工作的潛力。

此外,Python已經成為人工智能、特別是機器與深度學習工作者選擇的編程語言。因此,Python對于數據驅動金融學和人工智能優先金融學來說也是合適的語言,這兩種當今的趨勢將從根本上重塑金融學和金融行業。

分享到:
標簽:金融
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定