Python與金融:為什麼將Python用於金融

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代碼。下面的代碼將實現一些必要的步驟。

<code>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./<code>

❶ NumPy在這裡作為主程序包使用。

❷ 定義模型並模擬參數值。

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

❹ 提取標準正態分佈隨機數。

❺ 模擬期末價值。

❻ 計算期權到期收益。

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

❽ 打印輸出估算結果。

以下3個方面值得注意。

語法

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

翻譯

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

向量化

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

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

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

<code>#
# 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)/<code>

這一小節中的簡單算法示例說明,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 年的歷史指數水平,以瞭解指數在這段時間內的波動性,你希望找到證據證明這種變動性與某些典型的模型假設相反,它是隨時間變動而非固定。而且,應該對結果進行可視化,你要進行的主要的工作如下:

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

這些任務很複雜,在不久之前還被認為是專業金融分析師才能完成的。而在今天,即使是金融專業的學生也可以輕鬆地對付這類問題。我們來看看具體的做法——此時還不用操心語法的細節(後續的章節將對所有細節進行解釋):

<code>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>
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)); ❽/<class>/<code>

❶ 導入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本身就提供了所有必需的功能:

<code>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)/<code>

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

<code>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)/<code>

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

<code>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)/<code>

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

<code>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)/<code>

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

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

1.3.3 從原型化到生產

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

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

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

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

效率低下

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

多種技能集

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

遺留代碼

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

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

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

在2018年8月更新第2版的這一節時,2014年本書第1版中有關科技與金融學之間關係的言論似乎仍然適用且重要。但是,本節將講述金融業的兩個重要趨勢,它們將從根本上重塑這個行業。這兩個趨勢主要是在過去的幾年內形成的。

1.4.1 數據驅動金融學

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

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

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

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

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

<code>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>
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/<class>/<code>

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

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

❸ 顯示最後5行數據。

Eikon Data API不僅提供了對結構化金融數據(如歷史報價數據)的訪問,還可以訪問新聞等非結構化數據。下面的例子讀取一小部分新聞的元數據,並以全文本方式顯示其中一篇文章開頭的內容。

<code>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,/<code>

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

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

❸ 導入BeautifulSoup HTML解析庫並進行後續操作。

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

❺ 打印新聞的開頭。

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

 

數據驅動金融學

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

1.4.2 人工智能優先金融學

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

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

TensorFlow當然和股票自動算法交易一點關聯都沒有,但卻可以用於預測金融市場的變動。第15章提供了許多這方面的例子。最廣泛使用的Python ML程序庫是scikit-learn。下面的代碼以高度簡化的方式說明:ML 分類算法如何用來預測期貨價格變動方向,並以這些預測為基礎制定一個算法交易策略。所有細節將在第15章中解釋,因此這個例子相當簡潔。首先,導入數據,準備期貨數據(定向滯後對數收益率數據)。

<code>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)/<code>

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

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

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

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

Python與金融:為什麼將Python用於金融

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

<code>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)); ❺/<code>

❶ 實例化模型對象。

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

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

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

❺ 繪製基於ML交易策略表現與被動基準投資表現的對比曲線。

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

 

人工智能優先金融學

AI將像對待其他領域一樣,重塑金融行業。通過編程API功能可以取得大量金融數據,這成為了該領域的引擎。第13章中介紹AI、ML和DL基本方法,並在第15章和第16章中將其應用到算法交易中。不過,全面介紹人工智能優先金融學需要一本專門的圖書。

作為數據驅動金融學的自然延伸,不管從研究還是從業者的角度,金融學中的人工智能當然也是一個令人痴迷和興奮的領域。本書在不同背景下使用了多種AI、ML和DL方法,但總體的焦點與本書的副標題相符,仍是數據驅動金融學所需的Python基本技術與方法。不過,這些技術與方法對人工智能優先金融學同樣重要。

1.5 結語

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

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

本文摘自《Python金融大數據分析 第2版》

Python與金融:為什麼將Python用於金融

  • 金融科技算法交易量化金融教程書籍
  • 詳細講解使用Python分析處理金融大數據的專業圖書
  • 將人工智能應用於金融開發的實戰指南,金融應用開發領域從業人員的常備讀物

《Python金融大數據分析 第2版》分為5部分,共21章。第1部分介紹了Python在金融學中的應用,其內容涵蓋了Python用於金融行業的原因、Python的基礎架構和工具,以及Python在計量金融學中的一些具體入門實例;第2部分介紹了Python的基礎知識以及Python中非常有名的庫NumPy和pandas工具集,還介紹了面向對象編程;第3部分介紹金融數據科學的相關基本技術和方法,包括數據可視化、輸入/輸出操作和數學中與金融相關的知識等;第4部分介紹Python在算法交易上的應用,重點介紹常見算法,包括機器學習、深度神經網絡等人工智能相關算法;第5部分講解基於蒙特卡洛模擬開發期權及衍生品定價的應用,其內容涵蓋了估值框架的介紹、金融模型的模擬、衍生品的估值、投資組合的估值等知識。


分享到:


相關文章: