Skip to main content

Phân Tích Dữ Liệu Thị Trường

· 3 min read

Trong bài viết này, chúng ta sẽ tìm hiểu về cách phân tích dữ liệu thị trường để xây dựng chiến lược giao dịch định lượng.

Thu thập dữ liệu

Sử dụng API

import yfinance as yf
import pandas as pd
import numpy as np

# Tải dữ liệu chứng khoán
def get_stock_data(symbol, start_date, end_date):
data = yf.download(symbol, start=start_date, end=end_date)
return data

# Tải dữ liệu crypto
def get_crypto_data(symbol, start_date, end_date):
data = yf.download(f"{symbol}-USD", start=start_date, end=end_date)
return data

Xử lý dữ liệu cơ bản

def process_market_data(data):
# Tính toán các chỉ báo kỹ thuật
data['Returns'] = data['Close'].pct_change()
data['SMA_20'] = data['Close'].rolling(window=20).mean()
data['SMA_50'] = data['Close'].rolling(window=50).mean()
data['Volatility'] = data['Returns'].rolling(window=20).std()

return data

Phân tích kỹ thuật

Chỉ báo xu hướng

def calculate_trend_indicators(data):
# RSI
delta = data['Close'].diff()
gain = (delta.where(delta > 0, 0)).rolling(window=14).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean()
rs = gain / loss
data['RSI'] = 100 - (100 / (1 + rs))

# MACD
data['EMA_12'] = data['Close'].ewm(span=12).mean()
data['EMA_26'] = data['Close'].ewm(span=26).mean()
data['MACD'] = data['EMA_12'] - data['EMA_26']
data['Signal_Line'] = data['MACD'].ewm(span=9).mean()

return data

Chỉ báo khối lượng

def calculate_volume_indicators(data):
# OBV (On-Balance Volume)
data['OBV'] = (np.sign(data['Close'].diff()) * data['Volume']).fillna(0).cumsum()

# Volume SMA
data['Volume_SMA_20'] = data['Volume'].rolling(window=20).mean()

return data

Phân tích thống kê

Phân tích phân phối

def analyze_distribution(data):
# Tính toán các thống kê cơ bản
stats = {
'mean': data['Returns'].mean(),
'std': data['Returns'].std(),
'skew': data['Returns'].skew(),
'kurtosis': data['Returns'].kurtosis()
}

return stats

Phân tích tương quan

def analyze_correlation(data1, data2):
# Tính toán hệ số tương quan
correlation = data1['Returns'].corr(data2['Returns'])

return correlation

Phân tích mẫu hình

Mẫu hình nến

def identify_candlestick_patterns(data):
# Doji
data['Doji'] = abs(data['Open'] - data['Close']) <= (data['High'] - data['Low']) * 0.1

# Hammer
data['Hammer'] = (data['Close'] > data['Open']) & \
((data['High'] - data['Low']) > 3 * (data['Open'] - data['Low'])) & \
((data['Close'] - data['Low']) / (0.001 + data['High'] - data['Low']) > 0.6)

return data

Mẫu hình giá

def identify_price_patterns(data):
# Double Top
data['Double_Top'] = (data['High'].shift(1) < data['High']) & \
(data['High'] > data['High'].shift(-1)) & \
(abs(data['High'] - data['High'].shift(1)) < data['High'] * 0.01)

return data

Visualize dữ liệu

Biểu đồ giá

import matplotlib.pyplot as plt

def plot_price_data(data):
plt.figure(figsize=(12, 6))
plt.plot(data.index, data['Close'], label='Close Price')
plt.plot(data.index, data['SMA_20'], label='20-day SMA')
plt.plot(data.index, data['SMA_50'], label='50-day SMA')
plt.title('Price Chart with Moving Averages')
plt.legend()
plt.show()

Biểu đồ phân phối

def plot_distribution(data):
plt.figure(figsize=(10, 6))
plt.hist(data['Returns'], bins=50, density=True)
plt.title('Returns Distribution')
plt.show()

Best Practices

  1. Sử dụng dữ liệu chất lượng cao
  2. Xử lý dữ liệu thiếu và nhiễu
  3. Chuẩn hóa dữ liệu
  4. Kiểm tra tính ổn định của dữ liệu
  5. Lưu trữ dữ liệu hiệu quả

Kết luận

Phân tích dữ liệu thị trường là bước quan trọng trong việc xây dựng chiến lược giao dịch định lượng. Trong bài viết tiếp theo, chúng ta sẽ tìm hiểu về cách xây dựng chiến lược giao dịch dựa trên các phân tích này.