Skip to main content

Công Cụ và Thư Viện Giao Dịch

· 5 min read

Trong bài viết này, chúng ta sẽ tìm hiểu về các công cụ và thư viện phổ biến được sử dụng trong giao dịch tự động.

Công cụ và thư viện giao dịch

Phân Tích Dữ Liệu

1. Pandas

import pandas as pd
import numpy as np

# Đọc dữ liệu giá
df = pd.read_csv('price_data.csv', index_col='date', parse_dates=True)

# Tính toán các chỉ số kỹ thuật
def calculate_technical_indicators(df):
# Moving Average
df['SMA_20'] = df['close'].rolling(window=20).mean()
df['EMA_20'] = df['close'].ewm(span=20).mean()

# RSI
delta = df['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
df['RSI'] = 100 - (100 / (1 + rs))

# MACD
exp1 = df['close'].ewm(span=12, adjust=False).mean()
exp2 = df['close'].ewm(span=26, adjust=False).mean()
df['MACD'] = exp1 - exp2
df['Signal'] = df['MACD'].ewm(span=9, adjust=False).mean()

return df

2. NumPy và SciPy

import numpy as np
from scipy import stats
from scipy.optimize import minimize

# Tính toán các thống kê
def calculate_statistics(returns):
mean_return = np.mean(returns)
volatility = np.std(returns)
sharpe_ratio = mean_return / volatility
skewness = stats.skew(returns)
kurtosis = stats.kurtosis(returns)

return {
'mean': mean_return,
'volatility': volatility,
'sharpe': sharpe_ratio,
'skewness': skewness,
'kurtosis': kurtosis
}

# Tối ưu hóa danh mục đầu tư
def optimize_portfolio(returns, cov_matrix):
n_assets = len(returns)

def portfolio_stats(weights):
portfolio_return = np.sum(returns * weights)
portfolio_vol = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
sharpe = portfolio_return / portfolio_vol
return -sharpe

constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
bounds = tuple((0, 1) for _ in range(n_assets))

result = minimize(
portfolio_stats,
x0=np.array([1/n_assets] * n_assets),
method='SLSQP',
bounds=bounds,
constraints=constraints
)

return result.x

Học Máy

1. TensorFlow

import tensorflow as tf
from tensorflow.keras import layers, models

# Xây dựng mô hình dự đoán giá
def build_price_prediction_model(input_shape):
model = models.Sequential([
layers.LSTM(64, input_shape=input_shape, return_sequences=True),
layers.Dropout(0.2),
layers.LSTM(32),
layers.Dropout(0.2),
layers.Dense(16, activation='relu'),
layers.Dense(1)
])

model.compile(
optimizer='adam',
loss='mse',
metrics=['mae']
)

return model

# Huấn luyện mô hình
def train_model(model, X_train, y_train, X_val, y_val):
history = model.fit(
X_train, y_train,
epochs=100,
batch_size=32,
validation_data=(X_val, y_val),
callbacks=[
tf.keras.callbacks.EarlyStopping(
monitor='val_loss',
patience=10
)
]
)
return history

2. PyTorch

import torch
import torch.nn as nn

# Xây dựng mô hình phân loại tín hiệu
class SignalClassifier(nn.Module):
def __init__(self, input_dim, hidden_dim, output_dim):
super(SignalClassifier, self).__init__()
self.lstm = nn.LSTM(
input_dim,
hidden_dim,
num_layers=2,
batch_first=True
)
self.fc = nn.Sequential(
nn.Linear(hidden_dim, 32),
nn.ReLU(),
nn.Dropout(0.2),
nn.Linear(32, output_dim)
)

def forward(self, x):
lstm_out, _ = self.lstm(x)
return self.fc(lstm_out[:, -1, :])

# Huấn luyện mô hình
def train_classifier(model, train_loader, criterion, optimizer):
model.train()
for batch_idx, (data, target) in enumerate(train_loader):
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()

Backtesting

1. Backtrader

import backtrader as bt

# Chiến lược giao dịch
class MovingAverageStrategy(bt.Strategy):
params = (
('fast_period', 10),
('slow_period', 30),
)

def __init__(self):
self.fast_ma = bt.indicators.SMA(
self.data.close,
period=self.params.fast_period
)
self.slow_ma = bt.indicators.SMA(
self.data.close,
period=self.params.slow_period
)
self.crossover = bt.indicators.CrossOver(
self.fast_ma,
self.slow_ma
)

def next(self):
if not self.position:
if self.crossover > 0:
self.buy()
else:
if self.crossover < 0:
self.sell()

# Chạy backtest
def run_backtest(data, strategy):
cerebro = bt.Cerebro()
cerebro.adddata(data)
cerebro.addstrategy(strategy)
cerebro.broker.setcash(100000.0)
cerebro.broker.setcommission(commission=0.001)

results = cerebro.run()
return results

2. Zipline

from zipline.api import order, record, symbol
from zipline.finance import commission, slippage

# Chiến lược giao dịch
def initialize(context):
context.asset = symbol('AAPL')
context.sma_period = 20

# Thiết lập commission và slippage
context.set_commission(commission.PerShare(cost=0.001, min_trade_cost=1.0))
context.set_slippage(slippage.VolumeShareSlippage(volume_limit=0.025, price_impact=0.1))

def handle_data(context, data):
# Tính toán SMA
sma = data.history(context.asset, 'price', context.sma_period, '1d').mean()
current_price = data.current(context.asset, 'price')

# Tạo tín hiệu giao dịch
if current_price > sma:
order_target(context.asset, 100)
else:
order_target(context.asset, 0)

# Ghi lại dữ liệu
record(
price=current_price,
sma=sma
)

Trực Quan Hóa

1. Matplotlib

import matplotlib.pyplot as plt
import seaborn as sns

# Vẽ biểu đồ giá và chỉ số
def plot_price_and_indicators(df):
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8), gridspec_kw={'height_ratios': [3, 1]})

# Biểu đồ giá và MA
ax1.plot(df.index, df['close'], label='Price')
ax1.plot(df.index, df['SMA_20'], label='SMA 20')
ax1.plot(df.index, df['EMA_20'], label='EMA 20')
ax1.set_title('Price and Moving Averages')
ax1.legend()

# Biểu đồ RSI
ax2.plot(df.index, df['RSI'], label='RSI')
ax2.axhline(y=70, color='r', linestyle='--')
ax2.axhline(y=30, color='g', linestyle='--')
ax2.set_title('RSI')
ax2.legend()

plt.tight_layout()
return fig

2. Plotly

import plotly.graph_objects as go
from plotly.subplots import make_subplots

# Tạo biểu đồ tương tác
def create_interactive_chart(df):
fig = make_subplots(
rows=3, cols=1,
shared_xaxes=True,
vertical_spacing=0.05,
subplot_titles=('Price', 'Volume', 'RSI')
)

# Biểu đồ giá
fig.add_trace(
go.Candlestick(
x=df.index,
open=df['open'],
high=df['high'],
low=df['low'],
close=df['close']
),
row=1, col=1
)

# Biểu đồ khối lượng
fig.add_trace(
go.Bar(
x=df.index,
y=df['volume'],
name='Volume'
),
row=2, col=1
)

# Biểu đồ RSI
fig.add_trace(
go.Scatter(
x=df.index,
y=df['RSI'],
name='RSI'
),
row=3, col=1
)

fig.update_layout(
title='Interactive Trading Chart',
xaxis_title='Date',
height=800
)

return fig

Best Practices

  1. Chọn công cụ phù hợp với nhu cầu
  2. Tối ưu hóa hiệu suất xử lý dữ liệu
  3. Sử dụng các thư viện đã được kiểm chứng
  4. Duy trì tính nhất quán trong code
  5. Tài liệu hóa và kiểm thử đầy đủ

Kết luận

Việc lựa chọn và sử dụng đúng các công cụ và thư viện là yếu tố quan trọng trong việc xây dựng hệ thống giao dịch định lượng hiệu quả. Các công cụ này giúp tăng tốc độ phát triển và đảm bảo tính ổn định của hệ thống.