2015-07-08 35 views
12

gấu trúc Python có chức năng pct_change mà tôi sử dụng để tính toán lợi nhuận cho giá cổ phiếu trong một dataframe:lợi nhuận Logarithmic trong gấu trúc dataframe

ndf['Return']= ndf['TypicalPrice'].pct_change() 

Tôi đang sử dụng đoạn mã sau để có được lợi nhuận logarit, nhưng nó mang lại cho các các giá trị chính xác giống như hàm pct.change():

ndf['retlog']=np.log(ndf['TypicalPrice'].astype('float64')/ndf['TypicalPrice'].astype('float64').shift(1)) 
#np is for numpy 

Trả lời

22

Đây là một cách để tính toán lợi tức log bằng cách sử dụng .shift(). Và kết quả tương tự nhưng không giống với tổng lợi tức được tính bằng pct_change(). Bạn có thể tải lên bản sao dữ liệu mẫu của mình (liên kết chia sẻ hộp kéo thả) để tạo lại sự mâu thuẫn mà bạn thấy không?

import pandas as pd 
import numpy as np 

np.random.seed(0) 
df = pd.DataFrame(100 + np.random.randn(100).cumsum(), columns=['price']) 
df['pct_change'] = df.price.pct_change() 
df['log_ret'] = np.log(df.price) - np.log(df.price.shift(1)) 

Out[56]: 
     price pct_change log_ret 
0 101.7641   NaN  NaN 
1 102.1642  0.0039 0.0039 
2 103.1429  0.0096 0.0095 
3 105.3838  0.0217 0.0215 
4 107.2514  0.0177 0.0176 
5 106.2741  -0.0091 -0.0092 
6 107.2242  0.0089 0.0089 
7 107.0729  -0.0014 -0.0014 
..  ...   ...  ... 
92 101.6160  0.0021 0.0021 
93 102.5926  0.0096 0.0096 
94 102.9490  0.0035 0.0035 
95 103.6555  0.0069 0.0068 
96 103.6660  0.0001 0.0001 
97 105.4519  0.0172 0.0171 
98 105.5788  0.0012 0.0012 
99 105.9808  0.0038 0.0038 

[100 rows x 3 columns] 
+0

Tôi nhận được rất nhiều giá trị trong pct_change() và log_ret chính xác như nhau và một vài giá trị hơi khác nhau. Điều đó có được mong đợi không? – AmanArora

+2

@AmanArora Vâng, đó là hành vi mong đợi. log return và tổng lợi nhuận là rất rất gần khi lợi nhuận gộp của bạn là nhỏ, nói ít hơn 1%. Nó có thể được chứng minh bằng toán học bởi việc mở rộng Taylor bậc 2 khoảng 0. –

+1

@AmanArora BTW, nhật ký có tài sản mong muốn là phụ gia theo thời gian (nhưng không phụ gia trên các tài sản khác nhau), trong khi tổng lợi nhuận là thích hợp nhất khi bạn tính toán lợi tức đầu tư trung bình có trọng số (đó là phụ gia so với các tài sản khác nhau nhưng không phụ gia tăng ca). –

5

Các kết quả có thể vẻ tương tự, nhưng đó chỉ là vì sự Taylor expansion for the logarithm. Kể từ nhật ký (1 + x) ~ x, kết quả có thể giống nhau.

Tuy nhiên,

Tôi đang sử dụng đoạn mã sau để có được lợi nhuận logarit, nhưng nó mang lại các giá trị chính xác giống như các pct.change function().

không hoàn toàn chính xác.

import pandas as pd 

df = pd.DataFrame({'p': range(10)}) 

df['pct_change'] = df.pct_change() 
df['log_stuff'] = \ 
    np.log(df['p'].astype('float64')/df['p'].astype('float64').shift(1)) 
df[['pct_change', 'log_stuff']].plot(); 

enter image description here

22

lợi nhuận Log chỉ đơn giản là đăng nhập tự nhiên của 1 cộng với sự trở lại số học. Vậy làm thế nào về điều này?

df['pct_change'] = df.price.pct_change() 
df['log_return'] = np.log(1 + df.pct_change) 
+0

Đây là câu trả lời rất hay – user3341078

10

Đường đơn và chỉ tính nhật ký tính một lần. Chuyển đổi đầu tiên sang không gian nhật ký, sau đó chọn chênh lệch 1 kỳ.

np.log(df.price).diff() 
0

@ poulter7: Tôi không thể bình luận về câu trả lời khác, vì vậy tôi gửi nó như là câu trả lời mới: hãy cẩn thận với

np.log(df.price).diff() 

vì điều này sẽ không cho chỉ số này có thể trở thành tiêu cực cũng như các yếu tố rủi ro lãi suất âm. Trong những trường hợp này,

np.log(df.price/df.price.shift(1)).dropna() 

được ưu tiên và dựa trên kinh nghiệm của tôi nói chung là cách tiếp cận an toàn hơn. Nó cũng chỉ đánh giá logarit một lần.

Cho dù bạn sử dụng +1 hay -1 phụ thuộc vào thứ tự của chuỗi thời gian của bạn. Sử dụng -1 cho giảm dần và +1 cho ngày tăng dần - trong cả hai trường hợp ca làm việc cung cấp giá trị của ngày trước đó.

Các vấn đề liên quan