定量交易
随着新技術的出現,算法交易越來越受歡迎,使得更多的定量投資者可以使用它。我過去曾寫過關于 Java 算法交易系統的開發的文章。然而, Python 具有難以置信的強大的分析庫,易于了解文檔和實作。本文将向您介紹用Python 開發算法交易系統以及部署經過訓練的AI模型來執行實時交易的核心元件。本文中介紹的這個項目的代碼可以在 GitHub 上找到。
本文将分為以下幾個步驟:
- I:連接配接到經紀公司
- II:貿易制度發展
- III:AI 貿易模式發展
- IV:AI 交易模式部署
- (獎勵):雲部署
連接配接到經紀公司
第一步是連接配接到經紀公司,這将使我們能夠接收有關我們感興趣的證券交易的實時資料。在本文中,我将使用 Alpaca ,這是最簡單的自由方式開始算法交易,并為我們的目的, AI 交易。建立帳戶并轉到儀表闆以生成 API 密鑰。
一旦你生成了你的 API 密鑰,你就可以直接使用 python 。我建立了一個 helper 類來管理 API 連接配接。
class AlpacaPaperSocket(REST):
def __init__(self):
super().__init__(
key_id='YOUR_KEY_HERE',
secret_key='YOUR_SECRET_KEY_HERE',
base_url='https://paper-api.alpaca.markets'
)
這就是經紀連接配接,我們可以使用 AlpapaperSocket 類的執行個體作為對 API 的引用。下面我們将請求庫存資料給我們的 AI 模型,但是如果您對如何請求庫存資訊感興趣,現在可以在這裡找到文檔訂單。對我來說,這是一個很重要的問題,你可以使用任何你想要的經紀公司。(顯然,它提供了一個 API 來滿足資料和訂單請求。)
交易系統開發
現在我們已經與經紀公司建立了聯系,我們可以建立我們的交易系統。我已經建立了一個新的設計模式,能夠容納系統的任何安全與不同的時間架構和不同的 AI 模型。聽起來很複雜嗎?别擔心,它實際上是一個非常簡單的設計。
主要的思想是構造一個抽象的 TradingSystem 類,這樣我們就可以為我們希望交易的每種類型的系統實作自定義規則集。代碼是相當直接的,允許我們初始化系統和線程一個無限循環。
class TradingSystem(abc.ABC):
def __init__(self, api, symbol, time_frame, system_id, system_label):
# Connect to api
# Connect to BrokenPipeError
# Save fields to class
self.api = api
self.symbol = symbol
self.time_frame = time_frame
self.system_id = system_id
self.system_label = system_label
thread = threading.Thread(target=self.system_loop)
thread.start()
@abc.abstractmethod
def place_buy_order(self):
pass
@abc.abstractmethod
def place_sell_order(self):
pass
@abc.abstractmethod
def system_loop(self):
pass
這個投資組合管理系統将容納執行交易的 AI 。在我們開發了 AI 交易模型之後,我們将傳回到這個實作。
class PortfolioManagementSystem(TradingSystem):
def __init__(self):
super().__init__(AlpacaPaperSocket(), 'IBM', 604800, 1, 'AI_PM')
def place_buy_order(self):
pass
def place_sell_order(self):
pass
def system_loop(self):
pass
AI 交易模型開發
對于這個系統,我将建構和訓練 AI 模型作為我的系統的投資組合經理。其想法是訓練神經網絡在一定的負變化門檻值下買進,并在一定的正變化門檻值下賣出股票價格。我們本質上是在教我們的人工智能去買底泥和賣掉底泥。[請注意,我不建議您在實時系統中實作此功能,我們将進一步讨論此主題]為了教育訓練此神經網絡,我将基于 IBM 的每周曆史市場資料建構和注釋資料集,并建立一個稱為信号的功能,該功能将根據更改門檻值在集{0,1,-1}中産生值。
現在讓我們來考慮這個神經網絡的架構。我們将在反向傳播之後儲存權重,以便在成功測試模型之後,我們可以部署它。
# Class to develop your AI portfolio manager
class AIPMDevelopment:
def __init__(self):
# Read your data in and split the dependent and independent
data = pd.read_csv('IBM.csv')
X = data['Delta Close']
y = data.drop(['Delta Close'], axis=1)
# Train test spit
X_train, X_test, y_train, y_test = train_test_split(X, y)
# Create the sequential
network = Sequential()
# Create the structure of the neural network
network.add(Dense(1, input_shape=(1,), activation='relu'))
network.add(Dense(3, activation='relu'))
network.add(Dense(3, activation='relu'))
network.add(Dense(3, activation='relu'))
network.add(Dense(1, activation='relu'))
# Compile the model
network.compile(
optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy']
)
# Train the model
network.fit(X_train.values, y_train.values, epochs=100)
# Evaluate the predictions of the model
y_pred = network.predict(X_test.values)
y_pred = np.around(y_pred, 0)
print(classification_report(y_test, y_pred))
# Save structure to json
model = network.to_json()
with open("model.json", "w") as json_file:
json_file.write(model)
# Save weights to HDF5
network.save_weights("weights.h5")
AIPMDevelopment()
我們将使用序列模型,然而,重要的是要了解幕後的數學,否則我們不能期望人工智能做出我們想要的決定。在這種情況下,選擇激活函數是至關重要的,如果我們關閉我們的眼睛,并選擇 ReLU 與二值交叉熵損失函數,我們将得到一個混淆矩陣看起來類似于以下…
為什麼這樣?讓我們可視化 ReLU 函數…
如果我們将負輸入設定為零,或者使用損失函數期望二值輸出,我們如何期望我們的模型識别短信号?雙曲正切函數和鉸鍊損失在這裡幫助。
更新我們的神經網絡,認識到我們出錯的地方,我們有以下模型。
# Class to develop your AI portfolio manager
class AIPMDevelopment:
def __init__(self):
# Read your data in and split the dependent and independent
data = pd.read_csv('IBM.csv')
X = data['Delta Close']
y = data.drop(['Delta Close'], axis=1)
# Train test spit
X_train, X_test, y_train, y_test = train_test_split(X, y)
# Create the sequential
network = Sequential()
# Create the structure of the neural network
network.add(Dense(1, input_shape=(1,), activation='tanh'))
network.add(Dense(3, activation='tanh'))
network.add(Dense(3, activation='tanh'))
network.add(Dense(3, activation='tanh'))
network.add(Dense(1, activation='tanh'))
# Compile the model
network.compile(
optimizer='rmsprop',
loss='hinge',
metrics=['accuracy']
)
# Train the model
network.fit(X_train.values, y_train.values, epochs=100)
# Evaluate the predictions of the model
y_pred = network.predict(X_test.values)
y_pred = np.around(y_pred, 0)
print(classification_report(y_test, y_pred))
# Save structure to json
model = network.to_json()
with open("model.json", "w") as json_file:
json_file.write(model)
# Save weights to HDF5
network.save_weights("weights.h5")
AIPMDevelopment()
在訓練之後,我們發現分類報告有了顯著的改進。
現在我們已經成功地開發了我們的模型,它是儲存模型并将其加載到專門托管它的類中了。
# AI Portfolio Manager
class PortfolioManagementModel:
def __init__(self):
# Data in to test that the saving of weights worked
data = pd.read_csv('IBM.csv')
X = data['Delta Close']
y = data.drop(['Delta Close'], axis=1)
# Read structure from json
json_file = open('model.json', 'r')
json = json_file.read()
json_file.close()
self.network = model_from_json(json)
# Read weights from HDF5
self.network.load_weights("weights.h5")
# Verify weights and structure are loaded
y_pred = self.network.predict(X.values)
y_pred = np.around(y_pred, 0)
print(classification_report(y, y_pred))
PortfolioManagementModel()
我們通過檢視整個資料集的分類報告來驗證神經網絡的結構和正确加載的權重。
太棒了!現在,我們已經建立了一個 AI 投資組合經理來根據股價的變化做出購買、出售和持有的決定。這通常是最受追捧的交易系統之一。回到大學時代,當我在 futures 年的市場運作算法交易系統時,年回報率超過20%,第一個問題總是“但是,它怎麼知道什麼時候交易?”".這是一個最難回答的問題,但當你能回答它的時候,你有一個有利可圖的交易系統。開發一個有利可圖的 AI 交易模型超出了這個項目的範圍。然而,如果這篇文章得到足夠的支援,我會很樂意寫出我用來開發有利可圖的 AI 交易模型的量化技術。
将 AI 模型部署到交易系統
在重新考慮抽象 TradingSystem 類的實作時,我們有了 PortfolioManagementSystem 。我更新了抽象函數以實作它們各自的目的。
class PortfolioManagementSystem(TradingSystem):
def __init__(self):
super().__init__(AlpacaPaperSocket(), 'IBM', 86400, 1, 'AI_PM')
self.AI = PortfolioManagementModel()
def place_buy_order(self):
self.api.submit_order(
symbol='IBM',
qty=1,
side='buy',
type='market',
time_in_force='day',
)
def place_sell_order(self):
self.api.submit_order(
symbol='IBM',
qty=1,
side='sell',
type='market',
time_in_force='day',
)
def system_loop(self):
# Variables for weekly close
this_weeks_close = 0
last_weeks_close = 0
delta = 0
day_count = 0
while(True):
# Wait a day to request more data
time.sleep(1440)
# Request EoD data for IBM
data_req = self.api.get_barset('IBM', timeframe='1D', limit=1).df
# Construct dataframe to predict
x = pd.DataFrame(
data=[[
data_req['IBM']['close'][0]]], columns='Close'.split()
)
if(day_count == 7):
day_count = 0
last_weeks_close = this_weeks_close
this_weeks_close = x['Close']
delta = this_weeks_close - last_weeks_close
# AI choosing to buy, sell, or hold
if np.around(self.AI.network.predict([delta])) <= -.5:
self.place_sell_order()
elif np.around(self.AI.network.predict([delta]) >= .5):
self.place_buy_order()
PortfolioManagementSystem()
讓我們來談談 system _ loop 。system _ loop 初始化本周關閉、上周關閉、目前增量和日數的變量。無限循環(并發系統的線程)負責每天收集一次資料,并确定我們是否已經達到每周拆分。在達到每周拆分後,變量會被更新,我們會咨詢我們的 AI 是否買賣。
24/7全天候運作的雲部署
自然會出現的一個問題是“你是否希望我在我的電腦上運作這個 Python腳本?如果電源關閉了,我就會失去網際網路等等…”。答案是,不,我不希望你整個星期都運作這個 Python腳本,我希望你利用雲部署來托管它。這将允許您的軟體有24/7的時間,同時減少在您自己的機器上運作它的複雜性。如果你有興趣将你的模型部署到雲上,你可以從 Google Cloud 上的算法交易系統部署(步驟将是 AI 交易機器人的同義詞)的奇妙教程中完成這一點。
結論
這篇文章是為了讓你開始開發人工智能股票交易機器人。我們讨論了如何連接配接到經紀公司,特别是 Alpaca 的這個例子。然後,我們建立了 TradingSystem 類本身及其繼承字段,并在專門用于投資組合管理的系統中實作了該類。之後,我們建立了一個人工智能模型來進行交易決策,并讨論了在幕後缺乏對數學了解的問題。最後,我們将模型部署到實作的系統中,使我們的 AI 具有購買、銷售和持有的能力。你可以對這個機器人進行各種更新,優化速度, AI 架構, P / L 報告等…然而,這是你可以在 Python 建立一個免費的人工智能股票交易機器人。
本文由
未艾資訊(www.weainfo.net
)編譯,
想看更多譯文,歡迎大家點選上面的連結進行檢視~
也可以關注我們的公衆号:
為AI呐喊