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

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^GSPC
2000-01-033.625643 39.334630 1455.219971
2000-01-043.319964 38.005900 1399.420044
2000-01-053.368548 38.406628 1402.109985
2000-01-063.077039 37.120080 1403.449951
2000-01-073.222794 37.605172 1441.469971
2000-01-103.166112 37.879354 1457.599976
2000-01-113.004162 36.909170 1438.560059
2000-01-122.823993 35.706986 1432.250000
2000-01-133.133722 36.381897 1449.680054
2000-01-143.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^GSPC
2000-01-03Chú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.
2000-01-04Chú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.
2000-01-05Chú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.
2000-01-06Chú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.
2000-01-07Chú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^GSPC
2016-12-26110.958205 58.418182 2176.628791
2016-12-27111.047874 58.476117 2177.500190
2016-12-28111.140589 58.532936 2178.244490
2016-12-29111.233698 58.586112 2178.879189
2016-12-30111.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^GSPC
2000-01-03NanNanNan
2000-01-04-0.084310 -0.033780 -0.038345
2000-01-050.014634 0.010544 0.001922
2000-01-06-0.086538 -0.033498 0.000956
2000-01-070.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^GSPC
2000-01-03NanNanNan
2000-01-04-0.088078 -0.034364 -0.039099
2000-01-050.014528 0.010489 0.001920
2000-01-06-0.090514 -0.034072 0.000955
2000-01-070.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:

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

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) <1 $$.

Lưu ý rằng vì chúng tôi đã cho phép $ w_i \ trái (t \ right) $ là bất kỳ số thực nào, chúng tôi ngụ ý rằng chúng tôi được phép có trọng số âm. Trọng lượng tiêu cực ngụ ý rằng chúng tôi đã bán một tài sản nhất định. Bán ngắn một tài sản có nghĩa là bán một tài sản mà chúng tôi hiện không nắm giữ và nhận được giá trị bằng tiền mặt. Bán ngắn khác với việc bán một tài sản mà chúng tôi đã sở hữu, được gọi là bán dài.

Các cơ chế đằng sau điều này có thể phức tạp và thường phải chịu sự giám sát theo quy định. Tuy nhiên, ở cấp độ cao, nó liên quan đến việc vay tài sản từ bên thứ ba và sau đó bán nó cho người mua. Vì tại một số thời điểm, tài sản cần phải được trả lại cho bên mà nó được vay, nên vị trí ngắn cần phải được đóng lại. Điều này đạt được bằng cách mua lại tài sản từ người mua ban đầu hoặc bất kỳ người bán sẵn sàng nào khác. Với mục đích của bài viết này, người ta sẽ giả định rằng việc bán một tài sản ngắn có thể được thực hiện mà không có chi phí bổ sung, một giả định không đúng.

Ghi chú

Thêm về bán dài so với bán ngắn ở đây.

Giả sử rằng các trọng số có thể không bị ràng buộc là không thực tế. Ví dụ: dựa trên định nghĩa được đưa ra ở trên, chúng tôi có thể bán một lượng cổ phiếu AAPL có giá trị ngắn bằng $ N $. Điều này có nghĩa là, hiện tại, chúng tôi có thêm một đô la $ n $ để đầu tư từ việc bán ngắn. Do đó, cùng với đô la $ N $ ban đầu của chúng tôi, chúng tôi có thể mua cổ phiếu của MSFT trị giá $ 2N $ đô la. Trong khung của chúng tôi, điều này chuyển thành $ w _ {\ text {aapl}} =-1 $ và $ w _ {\ text {msft}} = 2 $. Về lý thuyết, các trọng số có thể lần lượt là -999 $ và $ 1000 $. Tuy nhiên, sự gia tăng các giá trị tuyệt đối của các trọng số dẫn đến sự gia tăng nguy cơ của danh mục đầu tư của chúng tôi vì lý do chúng tôi sẽ thấy thêm loạt hướng dẫn này. Do đó, khi phát triển chiến lược giao dịch của chúng tôi, các ngưỡng thích hợp sẽ được áp đặt trên các trọng số $ w_i \ trái (t \ right) $.

Một lưu ý cuối cùng phải làm với tiền mặt. Bất kỳ danh mục đầu tư tại một số thời điểm sẽ bao gồm tiền mặt. Trong thiết lập đã nói ở trên nếu tại bất kỳ thời điểm nào $ w = \ sum_ {i = 1} ) N $ đô la tiền mặt. Tất nhiên, nếu $ w

# Last day returns. Make this a column vector
r_t = log_returns.tail(1).transpose()
r_t

2016-12-30 00:00:00
AAPL-0.007826
MSFT-0.012156
^GSPC-0.004648

# Weights as defined above
weights_vector = pd.DataFrame(1 / 3, index=r_t.index, columns=r_t.columns)
weights_vector

2016-12-30 00:00:00
AAPL0.333333
MSFT0.333333
^GSPC0.333333

# Total log_return for the portfolio is:
portfolio_log_return = weights_vector.transpose().dot(r_t)
portfolio_log_return

2016-12-30 00:00:00
2016-12-30-0.00821

AAPL

MSFT

Nếu bộ nhớ máy tính không phải là vấn đề, một cách rất nhanh để tính toán danh mục đầu tư cho tất cả các ngày, $ t = 1, \ ldots, t $ là như sau:

Giả sử rằng $ \ mathbf {r} \ in \ mathbb {r}^{t \ Times K} $ là một ma trận, hàng $ t $ th trong đó là vectơ hàng $ \ vec {r} \ trái (t \ Phải)^t $. Tương tự, $ \ mathbf {w} \ in \ mathbb {r}^{t \ Times K} $ là một ma trận, hàng $ t $ th trong đó là vectơ hàng $ \ vec {w} \ trái (t \ Phải)^t $. Sau đó, nếu $ \ vec {r} _p = \ left [r_p \ left (1 \ right), \ ldots, r_p \ left (t \ right) \ right]^t \ in \ mathbf {r}^ 1} $ là một vectơ cột của tất cả các danh mục đầu tư, chúng tôi có

20

trong đó $ \ text {diag} \ left \ {a \ reasuction \} $ là đường chéo của ma trận $ \ mathbf {a} $. Việc chiết đường chéo là bắt buộc vì chỉ trong đường chéo, các vectơ trọng lượng và các vectơ quay lại được liên kết đúng theo thời gian.

Để minh họa các khái niệm của phần trước, chúng ta hãy xem xét một chiến lược giao dịch rất đơn giản, trong đó nhà đầu tư chia các khoản đầu tư của mình như nhau giữa cả ba tài sản mà chúng tôi đã xem xét. Đó là:

weights_matrix = pd.DataFrame(1 / 3, index=data.index, columns=data.columns)
weights_matrix.tail()

AAPLMSFT^GSPC
2016-12-260.333333 0.333333 0.333333
2016-12-270.333333 0.333333 0.333333
2016-12-280.333333 0.333333 0.333333
2016-12-290.333333 0.333333 0.333333
2016-12-300.333333 0.333333 0.333333

Nếu bộ nhớ máy tính không phải là vấn đề, một cách rất nhanh để tính toán danh mục đầu tư cho tất cả các ngày, $ t = 1, \ ldots, t $ là như sau:

AAPLMSFT^GSPC
2000-01-03Nếu bộ nhớ máy tính không phải là vấn đề, một cách rất nhanh để tính toán danh mục đầu tư cho tất cả các ngày, $ t = 1, \ ldots, t $ là như sau:Nếu bộ nhớ máy tính không phải là vấn đề, một cách rất nhanh để tính toán danh mục đầu tư cho tất cả các ngày, $ t = 1, \ ldots, t $ là như sau:Nếu bộ nhớ máy tính không phải là vấn đề, một cách rất nhanh để tính toán danh mục đầu tư cho tất cả các ngày, $ t = 1, \ ldots, t $ là như sau:
2000-01-04-0.088078 -0.034364 -0.039099
2000-01-050.014528 0.010489 0.001920
2000-01-06-0.090514 -0.034072 0.000955
2000-01-070.046281 0.012984 0.026730

Giả sử rằng $ \ mathbf {r} \ in \ mathbb {r}^{t \ Times K} $ là một ma trận, hàng $ t $ th trong đó là vectơ hàng $ \ vec {r} \ trái (t \ Phải)^t $. Tương tự, $ \ mathbf {w} \ in \ mathbb {r}^{t \ Times K} $ là một ma trận, hàng $ t $ th trong đó là vectơ hàng $ \ vec {w} \ trái (t \ Phải)^t $. Sau đó, nếu $ \ vec {r} _p = \ left [r_p \ left (1 \ right), \ ldots, r_p \ left (t \ right) \ right]^t \ in \ mathbf {r}^ 1} $ là một vectơ cột của tất cả các danh mục đầu tư, chúng tôi có

# Calculating the short-window moving average
short_rolling = data.rolling(window=20).mean()
short_rolling.head()
0

20trong đó $ \ text {diag} \ left \ {a \ reasuction \} $ là đường chéo của ma trận $ \ mathbf {a} $. Việc chiết đường chéo là bắt buộc vì chỉ trong đường chéo, các vectơ trọng lượng và các vectơ quay lại được liên kết đúng theo thời gian.Để minh họa các khái niệm của phần trước, chúng ta hãy xem xét một chiến lược giao dịch rất đơn giản, trong đó nhà đầu tư chia các khoản đầu tư của mình như nhau giữa cả ba tài sản mà chúng tôi đã xem xét. Đó là:$$ w _ {\ text {aapl}} = w _ {\ text {msft}} = w _ {\ text {^gspc}} = \ frac {1} {3} $$Trong trường hợp này, ma trận $ \ mathbf {w} $ sẽ là:
2000-01-03Nếu bộ nhớ máy tính không phải là vấn đề, một cách rất nhanh để tính toán danh mục đầu tư cho tất cả các ngày, $ t = 1, \ ldots, t $ là như sau:-0.053847 0.008979 -0.04121 0.028665
2000-01-04Nếu bộ nhớ máy tính không phải là vấn đề, một cách rất nhanh để tính toán danh mục đầu tư cho tất cả các ngày, $ t = 1, \ ldots, t $ là như sau:-0.053847 0.008979 -0.04121 0.028665
2000-01-05Nếu bộ nhớ máy tính không phải là vấn đề, một cách rất nhanh để tính toán danh mục đầu tư cho tất cả các ngày, $ t = 1, \ ldots, t $ là như sau:-0.053847 0.008979 -0.04121 0.028665
2000-01-06Nếu bộ nhớ máy tính không phải là vấn đề, một cách rất nhanh để tính toán danh mục đầu tư cho tất cả các ngày, $ t = 1, \ ldots, t $ là như sau:-0.053847 0.008979 -0.04121 0.028665
2000-01-07Nếu bộ nhớ máy tính không phải là vấn đề, một cách rất nhanh để tính toán danh mục đầu tư cho tất cả các ngày, $ t = 1, \ ldots, t $ là như sau:-0.053847 0.008979 -0.04121 0.028665

# Calculating the short-window moving average
short_rolling = data.rolling(window=20).mean()
short_rolling.head()
1

Giả sử rằng $ \ mathbf {r} \ in \ mathbb {r}^{t \ Times K} $ là một ma trận, hàng $ t $ th trong đó là vectơ hàng $ \ vec {r} \ trái (t \ Phải)^t $. Tương tự, $ \ mathbf {w} \ in \ mathbb {r}^{t \ Times K} $ là một ma trận, hàng $ t $ th trong đó là vectơ hàng $ \ vec {w} \ trái (t \ Phải)^t $. Sau đó, nếu $ \ vec {r} _p = \ left [r_p \ left (1 \ right), \ ldots, r_p \ left (t \ right) \ right]^t \ in \ mathbf {r}^ 1} $ là một vectơ cột của tất cả các danh mục đầu tư, chúng tôi có

20

trong đó $ \ text {diag} \ left \ {a \ reasuction \} $ là đường chéo của ma trận $ \ mathbf {a} $. Việc chiết đường chéo là bắt buộc vì chỉ trong đường chéo, các vectơ trọng lượng và các vectơ quay lại được liên kết đúng theo thời gian.

RESULT:

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

Để minh họa các khái niệm của phần trước, chúng ta hãy xem xét một chiến lược giao dịch rất đơn giản, trong đó nhà đầu tư chia các khoản đầu tư của mình như nhau giữa cả ba tài sản mà chúng tôi đã xem xét. Đó là:

$$ w _ {\ text {aapl}} = w _ {\ text {msft}} = w _ {\ text {^gspc}} = \ frac {1} {3} $$

Trong trường hợp này, ma trận $ \ mathbf {w} $ sẽ là:
\left(1 + \bar{r}\right)^{16.92} = 1 + 3.2514
\end{equation}

# Calculating the short-window moving average
short_rolling = data.rolling(window=20).mean()
short_rolling.head()
3

Matrix $ \ Mathbf {R} $ chỉ đơn giản là bản ghi nhật ký của chúng tôi được xác định trước đó.

Nan

Do đó, lợi nhuận danh mục đầu tư được tính là:

2000-01-03 00:00:00

Xem Phần 3 của loạt bài này: Di chuyển chiến lược giao dịch trung bình.

Học thêm

  • Python để phân tích tài chính và giao dịch thuật toán (UDEMY) đi qua các mô hình Numpy, Gandas, Matplotlib, Quantopian, Arima, StatSmodels và các số liệu quan trọng, như tỷ lệ Sharpe (Udemy)
    Goes over numpy, pandas, matplotlib, Quantopian, ARIMA models, statsmodels, and important metrics, like the Sharpe ratio