首頁>技術>

技術已成為金融行業中的戰略資產。而傳統的金融機構現在正在轉型成為科技公司,而不僅僅是專注於該領域的金融方面。

數學演算法帶來了創新和速度,它們可以幫助我們在市場上獲得競爭優勢。金融交易的速度和頻率以及龐大的資料量,已引起所有大型金融機構對技術的廣泛關注。演算法交易或定量交易是基於數學和統計分析設計和開發交易策略的過程。這是一個極其複雜的金融領域。

本教程是使用Python進行定量交易的初學者指南,如果讀者是以下行業人士,將會發現這篇文章非常有幫助:1. 旨在成為基金或銀行量化分析師

2. 計劃開始自己的自營量化交易的人。我們將在這篇文章中介紹以下主題:1. 股票和交易基礎

2. 從Quandl API提取資料3. 股票價格資料的探索性資料分析4. 移動平均線5. 用Python制定交易策略6. 視覺化策略的表現

股票交易及交易策略買賣現有和先前發行的股票的過程稱為股票交易。有一個可以買賣股票的價格,並且這個價格根據股票市場的需求和供應不斷波動。這將視公司的業績和行為而定,股價可能會上下波動,但股價的波動不僅限於公司的業績。交易者支付錢來換取公司的所有權,希望進行一些有利可圖的交易並以更高的價格出售股票。交易者遵循的另一項重要技術是賣空股票。這涉及“借入股票並立即出售它們,以期以後以較低的價格購買它們,將其退還給貸方,並賺取相關的市場保證金。因此,大多數交易者遵循特定的量化策略和模型進行交易。而這被稱為交易策略。

對沖基金和投資銀行的量化交易者設計並開發了這些交易策略和框架來進行測試。它需要深厚的程式設計專業知識,並且需要了解構建自己的策略所需的語言。

在C ++,Java,R和MATLAB等語言中,Python是最流行的程式語言之一。由於其易於使用的語法,龐大的社群和第三方支援,它已在所有領域廣泛採用,尤其是在資料科學領域。為了充分利用本教程,我們需要熟悉Python和統計資訊。

從Quandl API提取資料為了提取股票價格資料,我們將使用Quandl API。但在此之前,讓我們設定工作環境:

在終端中,為專案建立一個新目錄(根據需要命名):

mkdir <目錄名稱>確保在計算機上安裝了Python 3和virtualenv。使用virtualenv <env_name>建立一個新的Python3 virtualenv,並使用源<env_name> / bin / activate啟用它。現在,使用pip安裝jupyter-notebook,然後在終端中輸入pip install jupyter-notebook。同樣,安裝pandas,quandl和numpy軟體包。

從終端執行您的jupyter-notebook。現在,筆記本應該可以在本地主機上執行,如以下螢幕截圖所示:

您可以透過單擊右側的“新建”下拉列表來建立您的第一個筆記本。確保您已在Quandl上建立了一個帳戶。請按照此處提到的步驟建立您的API金鑰。一切準備就緒後,讓我們直接進入:#匯入所需的軟體包將熊貓(PANDAS)作為pd匯入將quandl匯入為q熊貓將成為本教程中使用最嚴格的軟體包,因為我們將進行大量的資料處理和繪圖。匯入軟體包後,我們將使用Quandl軟體包向Quandl API發出請求:#設定API金鑰q.ApiConfig.api_key =“ <API金鑰>”#傳送獲取請求以查詢Microsoft從2010年1月1日至2019年1月1日的當日股票價格msft_data = q.get(“ EOD / MSFT”,start_date =“ 2010-01-01”,end_date =“ 2019-01-01”)#檢視資料幀的前5行msft_data.head()

這裡有微軟過去9年的EOD股票定價資料,我們所要做的就是從Quandl包中呼叫get方法,並提供股票代號,MSFT和所需資料的時間範圍。

這真的很簡單,對吧?讓我們繼續前進,以進一步瞭解和探索這些資料。股票定價資料的探索性資料分析。而掌握了資料之後,我們要做的第一件事就是了解資料代表什麼以及封裝什麼樣的資訊。列印DataFrame的資訊,我們可以看到其中包含的所有內容:

如上面的螢幕快照所示,DataFrame包含DatetimeIndex,這意味著我們正在處理時間序列資料。

索引可以被視為幫助我們修改或引用資料的資料結構。時間序列資料是在連續的,等間隔的時間間隔拍攝的價格快照的序列。在交易中,EOD股票價格資料捕獲指定時間段內有關股票的某些引數(例如股票價格)的運動,並定期記錄資料點。重要術語檢視其他列,讓我們嘗試瞭解每個列所代表的含義:開盤/收盤—捕獲股票的開盤價/收盤價Adj_Open / Adj_Close-調整後的開盤/收盤價是指股票在任何給定交易日的價格,該價格已被修改為包括在第二天開盤前任何時間發生的任何股息分配,股票拆分和其他公司行為。交易量—它記錄在任何給定交易日交易的股票數量。高/低-跟蹤特定交易日中股票的最高和最低價格。這些是我們此時將重點關注的重要列。我們可以瞭解資料的摘要統計資訊,該統計資訊顯示了行數,均值,最大值,標準差等。嘗試在Ipython單元格中執行以下程式碼行:msft_data.describe()

resample()

熊貓的resample()方法用於簡化時間序列資料的頻率轉換的控制和靈活性。我們可以指定時間間隔以將資料重新取樣到每月,每季度或每年,並對其執行所需的操作。

msft_data.resample('M').mean()

這是一種分析不同時間範圍內股票表現的有趣方式。

如何計算收益財務收益僅僅是投資產生或損失的錢。投資回報可以名義上表示為投資金額隨時間的變化。可以將其計算為從利潤與投資之比得出的百分比。為此,我們可以使用pct_change()。這是計算收益的方法:#匯入numpy包將numpy匯入為np#將`Adj Close`分配給`daily_close`daily_close = msft_data [['Adj_Close']]#作為分數變化返回daily_return = daily_close.pct_change()#將NA值替換為0daily_return.fillna(0,inplace = True)列印(daily_return)這將列印股票每天產生的收益。將數字乘以100即可得出百分比變化。pct_change()中使用的公式為:返回值= {(t的價格)—(t-1的價格)} / {t-1的價格}現在,要計算月度回報,您需要做的是:mdata = msft_data.resample('M')。apply(lambda x:x [-1])month_return = mdata.pct_change()將資料重新取樣到幾個月(一個工作日)後,我們可以使用apply()函式獲得當月的最後交易日。apply()接受一個函式並將其應用於熊貓系列的每一行。lambda函式是Python中的匿名函式,可以不使用名稱進行定義,並且僅採用以下格式的表示式:Lambda:表達例如,lambda x:x * 2是lambda函式。在此,x是自變數,x * 2是要求值並返回的表示式。交易中的移動平均線移動平均線的概念將為基於動量的交易策略奠定基礎。在金融領域,分析師通常不得不在滑動的時間範圍內不斷評估統計指標,這被稱為移動視窗計算。讓我們看看如何計算50天的滾動平均值,然後將其滑動1天。滾動()這是神奇的功能,可以為我們提供竅門:#將調整後的收盤價分配給adj_pricesadj_price = msft_data ['Adj_Close']#計算移動平均線mav = adj_price.rolling(window = 50).mean()#列印結果列印(mav [-10:])

我們將在50天(約2個月)的時間範圍內看到滾動平均值,移動平均值有助於消除資料中的任何波動或尖峰,併為策略的業績提供更平滑的曲線。

我們可以繪圖並看到差異:#匯入matplotlib包以檢視圖匯入matplotlib.pyplot作為pltadj_price.plot()

現在我們可以繪製滾動的mean():

mav.plot()

讀者可以自己瞭解差異,如何調取資料中的峰值以大致瞭解股票的表現。

制定交易策略這是最後也是最有趣的部分:設計和制定交易策略。這將是開發基於動量的簡單移動平均交叉(SMAC)策略的分步指南。基於動量的策略基於利用市場趨勢持續性的技術指標。我們購買呈現上升趨勢的證券,並賣出呈現下降趨勢的賣空證券。SMAC策略是眾所周知的示意動量策略。這是一個長期策略。動量是股票的總回報,包括過去n個月的股息。這n個月的時間稱為回溯期。回溯期主要有3種類型:短期,中期和長期。我們需要定義特定時間序列的2個不同的回溯期。當較短的回溯滾動平均值(或移動平均值)超過較長的回溯移動平均值時,會生成購買訊號。當較短的回溯移動平均線跌落至較長的移動平均線以下時,就會出現賣出訊號。現在,讓我們看看該策略的程式碼如何:#step1:初始化短期和長期回溯期short_lb = 50long_lb = 120#step2:使用訊號列初始化一個名為signal_df的新資料框signal_df = pd.DataFrame(index = msft_data.index)signal_df ['signal'] = 0.0#step3:在較短的回溯期內建立一個簡短的簡單移動平均線signal_df ['short_mav'] = msft_data ['Adj_Close']。rolling(window = short_lb,min_periods = 1,center = False).mean()#step4:在較長的回溯期內建立較長的簡單移動平均線signal_df ['long_mav'] = msft_data ['Adj_Close']。rolling(window = long_lb,min_periods = 1,center = False).mean()#step5:根據條件語句生成訊號signal_df ['signal'] [short_lb:] = np.where(signal_df ['short_mav'] [short_lb:]> signal_df ['long_mav'] [short_lb:],1.0,0.0)#step6:根據頭寸欄建立交易訂單signal_df ['positions'] = signal_df ['signal']。diff()signal_df [signal_df ['positions'] == -1.0]讓我們看看這裡發生了什麼。我們建立了2個回溯期。短期回溯期short_lb為50天,而長期移動平均線的較長回溯期定義為120天的long_lb。我們建立了一個新的DataFrame,用於捕獲訊號。只要使用np.where短移動平均線與長移動平均線交叉,就會生成這些訊號。如果條件為假,它將為true分配1.0和0.0。DataFrame中的頭寸列會告訴我們是否存在買入訊號或賣出訊號,或保持原樣。我們基本上是使用diff計算與前一行的訊號欄中的差異。在那裡,我們使用熊貓僅用6個步驟即可實施我們的策略。很簡單,不是嗎?現在,讓我們嘗試使用Matplotlib形象化它。我們需要做的是初始化一個繪圖,將調整後的收盤價,空頭和多頭移動平均線新增到繪圖中,然後使用上方signal_df中的頭寸列繪製買入和賣出訊號:#使用plt初始化圖無花果= plt.figure()#為y軸新增子圖和標籤plt1 = fig.add_subplot(111,ylabel ='價格為$')msft_data ['Adj_Close']。plot(ax = plt1,color ='r',lw = 2。)#繪製短期和長期回溯移動平均線signal_df [[''short_mav','long_mav']]。plot(ax = plt1,lw = 2。,figsize =(12,8))#繪製賣出訊號plt1.plot(signal_df.loc [signal_df.positions == -1.0] .index,signal_df.short_mav [signal_df.positions == -1.0],'v',markersize = 10,color ='k')#繪製購買訊號plt1.plot(signal_df.loc [signal_df.positions == 1.0] .index,signal_df.short_mav [signal_df.positions == 1.0],'^',markersize = 10,color ='m')#顯示plotplt.show ()在Jupyter筆記本中執行上面的單元格將產生類似下面的圖:

現在,我們可以清楚地看到,每當藍線(短期均線)上升並超過橙線(長期均線)時,都有一個粉紅色的向上標記指示買入訊號。

賣出訊號由一個黑色的向下標記表示,其中short_mav下降到long_mav以下。視覺化全地形戰略的績效Quantopian是Zipline支援的平臺,具有多種用例。您可以編寫自己的演算法,訪問免費資料,對策略進行回測,為社群做出貢獻,並在需要資金時與Quantopian合作。我們編寫了一種演算法來對SMA策略進行回測,結果如下:

以下是上述指標的說明:

1.總回報(Total Return):從回測的開始到結束,投資組合的總回報百分比。

2. 特定收益 (Specific Return):投資組合的總收益和普通收益之差。

3. 共同收益(Common Return):歸因於共同風險因素的收益。這些回報構成了11個行業和5種風格風險因素。風險部分中的行業暴露和風格暴露圖表提供了有關這些因素的更多詳細資訊。

4.夏普(Sharpe):6個月滾動夏普比率。它是風險調整投資的一種度量。透過將投資組合的超出無風險利率的超額收益除以投資組合的標準偏差來計算。最大跌幅:投資組合歷史上所有峰谷波動的最大跌幅。波動率:投資組合收益的標準差

7
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 大資料開發基礎之HTML表格與表單