Hướng dẫn quantitative trading strategies python - chiến lược giao dịch định lượng python

Tìm kiếm nhiều hơn vào các chiến lược giao dịch định lượng và xác định lợi nhuận

Bạn nên biết:

  • Nguyên tắc cơ bản của Python
  • Gandas và matplotlib
  • Một số đại số tuyến tính

Tìm hiểu cả ba tương tác thông qua DataQuest.io

Trong Python for Finance, Phần I, chúng tôi tập trung vào việc sử dụng Python và Pandas để

  1. Lấy chuỗi thời gian tài chính từ các nguồn trực tuyến miễn phí [Yahoo],
  2. định dạng dữ liệu bằng cách điền vào các quan sát bị thiếu và sắp xếp chúng,
  3. Tính toán một số chỉ số đơn giản như trung bình di chuyển và
  4. Hình dung các chuỗi thời gian cuối cùng.

Một lời nhắc nhở, DataFrame chứa ba lần giá được làm sạch trên mạng có định dạng sau:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set[style='darkgrid', context='talk', palette='Dark2']

data = pd.read_pickle['./data.pkl']
data.head[10]

AAPLMSFT^GSPC2000-01-032000-01-042000-01-052000-01-062000-01-072000-01-102000-01-112000-01-122000-01-132000-01-14
3.625643 39.334630 1455.219971
3.319964 38.005900 1399.420044
3.368548 38.406628 1402.109985
3.077039 37.120080 1403.449951
3.222794 37.605172 1441.469971
3.166112 37.879354 1457.599976
3.004162 36.909170 1438.560059
2.823993 35.706986 1432.250000
3.133722 36.381897 1449.680054
3.253159 37.879354 1465.150024

Chúng tôi cũng đã tính toán trung bình chuyển động của ba lần này như sau. Lưu ý rằng khi tính toán trung bình di chuyển $ m $ ngày, $ M-1 $ đầu tiên không hợp lệ, vì giá $ m $ là bắt buộc cho điểm dữ liệu trung bình di chuyển đầu tiên.

# Calculating the short-window moving average
short_rolling = data.rolling[window=20].mean[]
short_rolling.head[]

AAPLMSFT^GSPC2000-01-032000-01-042000-01-052000-01-062000-01-07
Chúng tôi cũng đã tính toán trung bình chuyển động của ba lần này như sau. Lưu ý rằng khi tính toán trung bình di chuyển $ m $ ngày, $ M-1 $ đầu tiên không hợp lệ, vì giá $ m $ là bắt buộc cho điểm dữ liệu trung bình di chuyển đầu tiên.Chúng tôi cũng đã tính toán trung bình chuyển động của ba lần này như sau. Lưu ý rằng khi tính toán trung bình di chuyển $ m $ ngày, $ M-1 $ đầu tiên không hợp lệ, vì giá $ m $ là bắt buộc cho điểm dữ liệu trung bình di chuyển đầu tiên.Chúng tôi cũng đã tính toán trung bình chuyển động của ba lần này như sau. Lưu ý rằng khi tính toán trung bình di chuyển $ m $ ngày, $ M-1 $ đầu tiên không hợp lệ, vì giá $ m $ là bắt buộc cho điểm dữ liệu trung bình di chuyển đầu tiên.
Chúng tôi cũng đã tính toán trung bình chuyển động của ba lần này như sau. Lưu ý rằng khi tính toán trung bình di chuyển $ m $ ngày, $ M-1 $ đầu tiên không hợp lệ, vì giá $ m $ là bắt buộc cho điểm dữ liệu trung bình di chuyển đầu tiên.Chúng tôi cũng đã tính toán trung bình chuyển động của ba lần này như sau. Lưu ý rằng khi tính toán trung bình di chuyển $ m $ ngày, $ M-1 $ đầu tiên không hợp lệ, vì giá $ m $ là bắt buộc cho điểm dữ liệu trung bình di chuyển đầu tiên.Chúng tôi cũng đã tính toán trung bình chuyển động của ba lần này như sau. Lưu ý rằng khi tính toán trung bình di chuyển $ m $ ngày, $ M-1 $ đầu tiên không hợp lệ, vì giá $ m $ là bắt buộc cho điểm dữ liệu trung bình di chuyển đầu tiên.
Chúng tôi cũng đã tính toán trung bình chuyển động của ba lần này như sau. Lưu ý rằng khi tính toán trung bình di chuyển $ m $ ngày, $ M-1 $ đầu tiên không hợp lệ, vì giá $ m $ là bắt buộc cho điểm dữ liệu trung bình di chuyển đầu tiên.Chúng tôi cũng đã tính toán trung bình chuyển động của ba lần này như sau. Lưu ý rằng khi tính toán trung bình di chuyển $ m $ ngày, $ M-1 $ đầu tiên không hợp lệ, vì giá $ m $ là bắt buộc cho điểm dữ liệu trung bình di chuyển đầu tiên.Chúng tôi cũng đã tính toán trung bình chuyển động của ba lần này như sau. Lưu ý rằng khi tính toán trung bình di chuyển $ m $ ngày, $ M-1 $ đầu tiên không hợp lệ, vì giá $ m $ là bắt buộc cho điểm dữ liệu trung bình di chuyển đầu tiên.
Chúng tôi cũng đã tính toán trung bình chuyển động của ba lần này như sau. Lưu ý rằng khi tính toán trung bình di chuyển $ m $ ngày, $ M-1 $ đầu tiên không hợp lệ, vì giá $ m $ là bắt buộc cho điểm dữ liệu trung bình di chuyển đầu tiên.Chúng tôi cũng đã tính toán trung bình chuyển động của ba lần này như sau. Lưu ý rằng khi tính toán trung bình di chuyển $ m $ ngày, $ M-1 $ đầu tiên không hợp lệ, vì giá $ m $ là bắt buộc cho điểm dữ liệu trung bình di chuyển đầu tiên.Chúng tôi cũng đã tính toán trung bình chuyển động của ba lần này như sau. Lưu ý rằng khi tính toán trung bình di chuyển $ m $ ngày, $ M-1 $ đầu tiên không hợp lệ, vì giá $ m $ là bắt buộc cho điểm dữ liệu trung bình di chuyển đầu tiên.
Chúng tôi cũng đã tính toán trung bình chuyển động của ba lần này như sau. Lưu ý rằng khi tính toán trung bình di chuyển $ m $ ngày, $ M-1 $ đầu tiên không hợp lệ, vì giá $ m $ là bắt buộc cho điểm dữ liệu trung bình di chuyển đầu tiên.Chúng tôi cũng đã tính toán trung bình chuyển động của ba lần này như sau. Lưu ý rằng khi tính toán trung bình di chuyển $ m $ ngày, $ M-1 $ đầu tiên không hợp lệ, vì giá $ m $ là bắt buộc cho điểm dữ liệu trung bình di chuyển đầu tiên.Chúng tôi cũng đã tính toán trung bình chuyển động của ba lần này như sau. Lưu ý rằng khi tính toán trung bình di chuyển $ m $ ngày, $ M-1 $ đầu tiên không hợp lệ, vì giá $ m $ là bắt buộc cho điểm dữ liệu trung bình di chuyển đầu tiên.

# Calculating the short-window moving average
long_rolling = data.rolling[window=100].mean[]
long_rolling.tail[]

AAPLMSFT^GSPC2016-12-262016-12-272016-12-282016-12-292016-12-30
110.958205 58.418182 2176.628791
111.047874 58.476117 2177.500190
111.140589 58.532936 2178.244490
111.233698 58.586112 2178.879189
111.315270 58.635267 2179.426990

Chúng tôi cũng đã tính toán trung bình chuyển động của ba lần này như sau. Lưu ý rằng khi tính toán trung bình di chuyển $ m $ ngày, $ M-1 $ đầu tiên không hợp lệ, vì giá $ m $ là bắt buộc cho điểm dữ liệu trung bình di chuyển đầu tiên.

Nan

Dựa trên những kết quả này, mục tiêu cuối cùng của chúng tôi sẽ là thiết kế một chiến lược giao dịch đơn giản nhưng thực tế. Tuy nhiên, trước tiên chúng ta cần trải qua một số khái niệm cơ bản liên quan đến các chiến lược giao dịch định lượng, cũng như các công cụ và kỹ thuật trong quá trình này.

Có một số cách người ta có thể diễn ra khi một chiến lược giao dịch được phát triển. Một cách tiếp cận sẽ là sử dụng chuỗi thời gian giá trực tiếp và làm việc với các số tương ứng với một số giá trị tiền tệ.

Ví dụ, một nhà nghiên cứu có thể làm việc với chuỗi thời gian thể hiện giá của một cổ phiếu nhất định, như chuỗi thời gian chúng tôi đã sử dụng trong bài viết trước. Tương tự, nếu làm việc với các công cụ thu nhập cố định, ví dụ: Trái phiếu, người ta có thể sử dụng chuỗi thời gian thể hiện giá của trái phiếu theo tỷ lệ phần trăm của một giá trị tham chiếu đã cho, trong trường hợp này là giá trị mệnh của trái phiếu. Làm việc với loại chuỗi thời gian này có thể trực quan hơn vì mọi người đã quen với việc suy nghĩ về giá cả. Tuy nhiên, chuỗi thời gian giá có một số nhược điểm. Giá thường chỉ tích cực, khiến việc sử dụng các mô hình và phương pháp tiếp cận khó khăn hơn yêu cầu hoặc tạo ra số âm. Ngoài ra, chuỗi thời gian giá thường không cố định, đó là tính chất thống kê của chúng ít ổn định hơn theo thời gian.
r_{\text{relative}}\left[t\right] = \frac{p\left[t\right] - p\left[t-1\right]}{p\left[t-1\right]}
\end{equation}

Một cách tiếp cận khác là sử dụng chuỗi thời gian tương ứng với các giá trị thực tế mà thay đổi giá trị tiền tệ của tài sản. Các chuỗi thời gian này có thể và thực hiện các giá trị âm và cả, các thuộc tính thống kê của chúng thường ổn định hơn so với các chuỗi thời gian giá. Các hình thức được sử dụng thường xuyên nhất được sử dụng là lợi nhuận tương đối được xác định là

\ starting {phương trình} r _ {\ text {relative}} \ left [t \ right] = \ frac {p \ left [t \ right] - p \ left [t -1 \ right]} {p \ -1 \ right]} \ end {phương trình}
r\left[t\right] = \log\left[ \frac{p\left[t\right]}{p\left[t-1\right]} \right]
\end{equation}$$

và trả lại log được định nghĩa là

$$ \ start {phương trình} r \ left [t \ right] = \ log \ left [\ frac {p \ left [t \ right] {phương trình} $$

trong đó $ p \ trái [t \ right] $ là giá của tài sản tại thời điểm $ t $. Ví dụ: nếu $ p \ left [t \ right] = 101 $ và $ p \ left [t-1 \ right] = 100 đô frac {101 - 100} {100} = 1 \%$.
r\left[t_1\right] + r\left[t_2\right] = \log\left[ \frac{p\left[t_1\right]}{p\left[t_0\right]} \right] + \log\left[ \frac{p\left[t_2\right]}{p\left[t_1\right]} \right] = \log\left[ \frac{p\left[t_2\right]}{p\left[t_0\right]} \right]
\end{equation}

Có một số lý do tại sao việc trả lại log đang được sử dụng trong ngành và một số trong số chúng có liên quan đến các giả định lâu dài về hành vi của lợi nhuận tài sản và nằm ngoài phạm vi của chúng tôi. Tuy nhiên, những gì chúng ta cần chỉ ra là hai thuộc tính khá thú vị. Lấy lại log là phụ gia và điều này tạo điều kiện cho việc điều trị chuỗi thời gian của chúng tôi, lợi nhuận tương đối thì không. Chúng ta có thể thấy tính phụ thuộc của các lần trả lại log trong phương trình sau.

\ started {phương trình} \ log \ left [\ frac {p \ left [t \ right]} {p \ left [t-1 \ right]} \ right] \ simeq \ log \ left [1 \ right] + \ frac {p \ left [t \ right]} {p \ left [t -1 \ reasuct
\log\left[ \frac{p\left[t\right]}{p\left[t-1\right]} \right] \simeq \log\left[1\right] + \frac{p\left[t\right]}{p\left[t-1\right]} - 1 = r_{\text{relative}}\left[t\right]
\end{equation}

Cả hai đều được tính toán tầm thường bằng cách sử dụng gấu trúc:

# Relative returns
returns = data.pct_change[1]
returns.head[]

AAPLMSFT^GSPC2000-01-032000-01-042000-01-052000-01-062000-01-07
NanNanNan
-0.084310 -0.033780 -0.038345
0.014634 0.010544 0.001922
-0.086538 -0.033498 0.000956
0.047369 0.013068 0.027090

# Log returns - First the logarithm of the prices is taken and the the difference of consecutive [log] observations
log_returns = np.log[data].diff[]
log_returns.head[]

AAPLMSFT^GSPC2000-01-032000-01-042000-01-052000-01-062000-01-07
NanNanNan
-0.088078 -0.034364 -0.039099
0.014528 0.010489 0.001920
-0.090514 -0.034072 0.000955
0.046281 0.012984 0.026730

Vì returns log là phụ gia, chúng ta có thể tạo chuỗi thời gian của các bản sửa đổi đăng nhập tích lũy được xác định là

\ started {phương trình} c \ left [t \ right] = \ sum_ {k = 1}^t r \ left [t \ right] \ end {phương trình}
c\left[t\right] = \sum_{k=1}^t r\left[t\right]
\end{equation}

Các lần trả lại đăng nhập tích lũy và tổng lợi nhuận tương đối từ 2000/01/01 cho ba chuỗi thời gian có thể được nhìn thấy dưới đây. Lưu ý rằng mặc dù các khoản hoàn trả log rất dễ thao túng, các nhà đầu tư đã quen với việc sử dụng lợi nhuận tương đối. Ví dụ, khoản hoàn trả $ 1 $ 1 không có nghĩa là một nhà đầu tư đã tăng gấp đôi giá trị của danh mục đầu tư của mình. Lợi nhuận tương đối là $ 1 = 100 \%$ không! Chuyển đổi giữa return đăng nhập tích lũy $ c \ left [t \ reasuct - p \ left [t_o \ right]} {p \ left [t_o \ right]} $ rất đơn giản

$$ C _ {\ text {Relative}} \ left [t \ right] = e^{c \ left [t \ right]} - ​​1 $$

Đối với những người đang tự hỏi nếu điều này là chính xác, đúng vậy. Nếu ai đó đã mua cổ phiếu AAPL trị giá $ 1000 $ 1000 $ 1000 vào tháng 1 năm 2000, thì danh mục đầu tư của anh ấy/của anh ấy sẽ trị giá hơn $ \ $ 30.000 $. Giá như chúng tôi có một cỗ máy thời gian ...

fig, [ax1, ax2] = plt.subplots[2, 1, figsize=[16,12]]

for c in log_returns:
    ax1.plot[log_returns.index, log_returns[c].cumsum[], label=str[c]]

ax1.set_ylabel['Cumulative log returns']
ax1.legend[loc='best']

for c in log_returns:
    ax2.plot[log_returns.index, 100*[np.exp[log_returns[c].cumsum[]] - 1], label=str[c]]

ax2.set_ylabel['Total relative returns [%]']
ax2.legend[loc='best']

plt.show[]

RESULT:

Mục tiêu của chúng tôi là phát triển một chiến lược giao dịch đồ chơi, nhưng thuật ngữ "chiến lược giao dịch định lượng" thực sự có nghĩa là gì? Trong phần này, chúng tôi sẽ đưa ra một định nghĩa sẽ hướng dẫn chúng tôi trong mục tiêu dài hạn của chúng tôi.

Giả sử chúng tôi có một số tiền nhất định, $ N $, mà chúng tôi quan tâm để đầu tư. Chúng tôi có một bộ tài sản $ K $ mà chúng tôi có thể mua và bán tự do bất kỳ số tiền tùy ý nào. Mục tiêu của chúng tôi là lấy trọng lượng $ w_i \ trái [t \ right], i = 1, \ ldots, k $ sao cho điều đó

$$ w_i \ left [t \ right] \ in \ mathbb {r} \ \ text {và} \ \ sum_ {i = 1}^K

do đó, một lượng đô la bằng $ w_i \ trái [t \ right] n $ được đầu tư tại thời điểm $ t $ trên tài sản $ i $.

Điều kiện bất bình đẳng biểu thị $ \ sum_ {i = 1}^k w_i \ trái [t \ right] \ leq 1 $ mà số tiền tối đa chúng ta có thể đầu tư bằng với số tiền chúng ta có, đó là $ n $.

Thí dụ

Ví dụ: giả sử chúng ta chỉ có thể đầu tư vào các công cụ $ 2 $ và $ n = \ $ 1000 $. Mục tiêu là lấy được hai trọng số $ w_1 \ trái [t \ right] $ và $ w_2 \ left [t \ right] $.

Nếu tại một số điểm $ w_1 \ left [t \ right] = 0,4 $ và $ w_2 \ left [t \ right] = 0.6 $, điều này có nghĩa là chúng tôi đã đầu tư $ w_1 \ left [t \ right] n = \ $ 400 $ Trong tài sản $ 1 $ và $ w_2 \ left [t \ right] n = \ $ 600 $ trong tài sản $ 2 $. Vì chúng tôi chỉ có $ \ $ 1000 $, chúng tôi chỉ có thể đầu tư vào đó có nghĩa là điều đó có nghĩa là

$$ w_1 \ left [t \ right] n + w_2 \ left [t \ right] n \ leq n \ rightarrow w_1 \ left [t \ right] + w_2 \ left [t \ right]

Chủ Đề