[TOC]

Có rất nhiều báo cáo nghiên cứu về mô hình đa yếu tố của thị trường chứng khoán, với lý thuyết và thực hành phong phú. Thị trường tiền kỹ thuật số đủ để nghiên cứu yếu tố về số lượng tiền tệ, tổng giá trị thị trường, khối lượng giao dịch và thị trường phái sinh. Bài viết này chủ yếu hướng đến những người mới bắt đầu các chiến lược định lượng và sẽ không liên quan đến các nguyên tắc toán học phức tạp và phân tích thống kê. thị trường tương lai là nguồn dữ liệu, một khuôn khổ nghiên cứu yếu tố đơn giản được xây dựng để tạo điều kiện thuận lợi cho việc đánh giá các chỉ số yếu tố.
Một yếu tố có thể được xem như một chỉ số và có thể được viết dưới dạng một biểu thức. Các yếu tố thay đổi liên tục và phản ánh thông tin lợi nhuận trong tương lai. Thông thường, các yếu tố đại diện cho một logic đầu tư.
Ví dụ, yếu tố giá đóng cửa dựa trên giả định rằng giá cổ phiếu có thể dự đoán lợi nhuận trong tương lai. Giá cổ phiếu càng cao, lợi nhuận trong tương lai càng cao (hoặc lợi nhuận càng thấp). Xây dựng danh mục đầu tư dựa trên yếu tố này thực sự là một khoản đầu tư mô hình/chiến lược luân chuyển vị thế thường xuyên để mua cổ phiếu giá cao. Nói chung, các yếu tố có thể liên tục tạo ra lợi nhuận vượt trội thường được gọi là Alpha. Ví dụ, các yếu tố vốn hóa thị trường và các yếu tố động lực đã được giới học thuật và cộng đồng đầu tư xác minh là các yếu tố hiệu quả.
Cho dù là thị trường chứng khoán hay thị trường tiền kỹ thuật số, thì đó là một hệ thống phức tạp. Không có yếu tố nào có thể dự đoán đầy đủ lợi nhuận trong tương lai, nhưng vẫn có một mức độ dự đoán nhất định. Alpha hiệu quả (mô hình đầu tư) dần trở nên kém hiệu quả khi có nhiều tiền đầu tư hơn. Nhưng quá trình này sẽ tạo ra những mô hình khác trên thị trường, sản sinh ra những phiên bản alpha mới. Yếu tố vốn hóa thị trường từng là một chiến lược rất hiệu quả trên thị trường cổ phiếu A. Chỉ cần mua 10 cổ phiếu có vốn hóa thị trường thấp nhất và điều chỉnh chúng một lần mỗi ngày. Kiểm tra ngược mười năm từ năm 2007 sẽ kiếm được hơn 400 lần lợi nhuận, xa vượt quá thị trường chung. Tuy nhiên, thị trường chứng khoán blue-chip năm 2017 đã phản ánh sự kém hiệu quả của yếu tố vốn hóa thị trường nhỏ, trong khi yếu tố giá trị lại trở nên phổ biến. Do đó, cần phải liên tục cân bằng và thử nghiệm giữa việc xác minh và sử dụng alpha.
Các yếu tố chúng ta tìm kiếm là cơ sở để thiết lập chiến lược. Các chiến lược tốt hơn có thể được xây dựng bằng cách kết hợp nhiều yếu tố hiệu quả không liên quan.
import requests
from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import requests, zipfile, io
%matplotlib inline
Tính đến thời điểm hiện tại, dữ liệu K-line hàng giờ của hợp đồng tương lai vĩnh viễn USDT trên Binance từ đầu năm 2022 đến nay đã vượt quá 150 loại tiền tệ. Như đã đề cập trước đó, mô hình nhân tố là mô hình lựa chọn tiền tệ nhắm vào tất cả các loại tiền tệ chứ không chỉ một loại tiền tệ cụ thể. Dữ liệu K-line bao gồm dữ liệu như giá mở cửa cao và giá đóng cửa thấp, khối lượng giao dịch, số lượng giao dịch, khối lượng mua tích cực, v.v. Những dữ liệu này chắc chắn không phải là nguồn gốc của tất cả các yếu tố, chẳng hạn như chỉ số chứng khoán Hoa Kỳ, kỳ vọng tăng lãi suất , lợi nhuận, dữ liệu trên chuỗi, sự chú ý của mạng xã hội, v.v. Các nguồn dữ liệu ít phổ biến hơn cũng có thể tiết lộ alpha hiệu quả, nhưng dữ liệu cơ bản về khối lượng và giá cũng đủ.
## 当前交易对
Info = requests.get('https://fapi.binance.com/fapi/v1/exchangeInfo')
symbols = [s['symbol'] for s in Info.json()['symbols']]
symbols = list(filter(lambda x: x[-4:] == 'USDT', [s.split('_')[0] for s in symbols]))
print(symbols)
Out:
['BTCUSDT', 'ETHUSDT', 'BCHUSDT', 'XRPUSDT', 'EOSUSDT', 'LTCUSDT', 'TRXUSDT', 'ETCUSDT', 'LINKUSDT',
'XLMUSDT', 'ADAUSDT', 'XMRUSDT', 'DASHUSDT', 'ZECUSDT', 'XTZUSDT', 'BNBUSDT', 'ATOMUSDT', 'ONTUSDT',
'IOTAUSDT', 'BATUSDT', 'VETUSDT', 'NEOUSDT', 'QTUMUSDT', 'IOSTUSDT', 'THETAUSDT', 'ALGOUSDT', 'ZILUSDT',
'KNCUSDT', 'ZRXUSDT', 'COMPUSDT', 'OMGUSDT', 'DOGEUSDT', 'SXPUSDT', 'KAVAUSDT', 'BANDUSDT', 'RLCUSDT',
'WAVESUSDT', 'MKRUSDT', 'SNXUSDT', 'DOTUSDT', 'DEFIUSDT', 'YFIUSDT', 'BALUSDT', 'CRVUSDT', 'TRBUSDT',
'RUNEUSDT', 'SUSHIUSDT', 'SRMUSDT', 'EGLDUSDT', 'SOLUSDT', 'ICXUSDT', 'STORJUSDT', 'BLZUSDT', 'UNIUSDT',
'AVAXUSDT', 'FTMUSDT', 'HNTUSDT', 'ENJUSDT', 'FLMUSDT', 'TOMOUSDT', 'RENUSDT', 'KSMUSDT', 'NEARUSDT',
'AAVEUSDT', 'FILUSDT', 'RSRUSDT', 'LRCUSDT', 'MATICUSDT', 'OCEANUSDT', 'CVCUSDT', 'BELUSDT', 'CTKUSDT',
'AXSUSDT', 'ALPHAUSDT', 'ZENUSDT', 'SKLUSDT', 'GRTUSDT', '1INCHUSDT', 'CHZUSDT', 'SANDUSDT', 'ANKRUSDT',
'BTSUSDT', 'LITUSDT', 'UNFIUSDT', 'REEFUSDT', 'RVNUSDT', 'SFPUSDT', 'XEMUSDT', 'BTCSTUSDT', 'COTIUSDT',
'CHRUSDT', 'MANAUSDT', 'ALICEUSDT', 'HBARUSDT', 'ONEUSDT', 'LINAUSDT', 'STMXUSDT', 'DENTUSDT', 'CELRUSDT',
'HOTUSDT', 'MTLUSDT', 'OGNUSDT', 'NKNUSDT', 'SCUSDT', 'DGBUSDT', '1000SHIBUSDT', 'ICPUSDT', 'BAKEUSDT',
'GTCUSDT', 'BTCDOMUSDT', 'TLMUSDT', 'IOTXUSDT', 'AUDIOUSDT', 'RAYUSDT', 'C98USDT', 'MASKUSDT', 'ATAUSDT',
'DYDXUSDT', '1000XECUSDT', 'GALAUSDT', 'CELOUSDT', 'ARUSDT', 'KLAYUSDT', 'ARPAUSDT', 'CTSIUSDT', 'LPTUSDT',
'ENSUSDT', 'PEOPLEUSDT', 'ANTUSDT', 'ROSEUSDT', 'DUSKUSDT', 'FLOWUSDT', 'IMXUSDT', 'API3USDT', 'GMTUSDT',
'APEUSDT', 'BNXUSDT', 'WOOUSDT', 'FTTUSDT', 'JASMYUSDT', 'DARUSDT', 'GALUSDT', 'OPUSDT', 'BTCUSDT',
'ETHUSDT', 'INJUSDT', 'STGUSDT', 'FOOTBALLUSDT', 'SPELLUSDT', '1000LUNCUSDT', 'LUNA2USDT', 'LDOUSDT',
'CVXUSDT']
print(len(symbols))
Out:
153
#获取任意周期K线的函数
def GetKlines(symbol='BTCUSDT',start='2020-8-10',end='2021-8-10',period='1h',base='fapi',v = 'v1'):
Klines = []
start_time = int(time.mktime(datetime.strptime(start, "%Y-%m-%d").timetuple()))*1000 + 8*60*60*1000
end_time = min(int(time.mktime(datetime.strptime(end, "%Y-%m-%d").timetuple()))*1000 + 8*60*60*1000,time.time()*1000)
intervel_map = {'m':60*1000,'h':60*60*1000,'d':24*60*60*1000}
while start_time < end_time:
mid_time = start_time+1000*int(period[:-1])*intervel_map[period[-1]]
url = 'https://'+base+'.binance.com/'+base+'/'+v+'/klines?symbol=%s&interval=%s&startTime=%s&endTime=%s&limit=1000'%(symbol,period,start_time,mid_time)
res = requests.get(url)
res_list = res.json()
if type(res_list) == list and len(res_list) > 0:
start_time = res_list[-1][0]+int(period[:-1])*intervel_map[period[-1]]
Klines += res_list
if type(res_list) == list and len(res_list) == 0:
start_time = start_time+1000*int(period[:-1])*intervel_map[period[-1]]
if mid_time >= end_time:
break
df = pd.DataFrame(Klines,columns=['time','open','high','low','close','amount','end_time','volume','count','buy_amount','buy_volume','null']).astype('float')
df.index = pd.to_datetime(df.time,unit='ms')
return df
start_date = '2022-1-1'
end_date = '2022-09-14'
period = '1h'
df_dict = {}
for symbol in symbols:
df_s = GetKlines(symbol=symbol,start=start_date,end=end_date,period=period,base='fapi',v='v1')
if not df_s.empty:
df_dict[symbol] = df_s
symbols = list(df_dict.keys())
print(df_s.columns)
Out:
Index(['time', 'open', 'high', 'low', 'close', 'amount', 'end_time', 'volume',
'count', 'buy_amount', 'buy_volume', 'null'],
dtype='object')
Đầu tiên, chúng tôi trích xuất dữ liệu quan tâm từ dữ liệu K-line: giá đóng cửa, giá mở cửa, khối lượng giao dịch, số lượng giao dịch và tỷ lệ mua tích cực, và sử dụng các dữ liệu này làm cơ sở để xử lý các yếu tố cần thiết.
df_close = pd.DataFrame(index=pd.date_range(start=start_date, end=end_date, freq=period),columns=df_dict.keys())
df_open = pd.DataFrame(index=pd.date_range(start=start_date, end=end_date, freq=period),columns=df_dict.keys())
df_volume = pd.DataFrame(index=pd.date_range(start=start_date, end=end_date, freq=period),columns=df_dict.keys())
df_buy_ratio = pd.DataFrame(index=pd.date_range(start=start_date, end=end_date, freq=period),columns=df_dict.keys())
df_count = pd.DataFrame(index=pd.date_range(start=start_date, end=end_date, freq=period),columns=df_dict.keys())
for symbol in df_dict.keys():
df_s = df_dict[symbol]
df_close[symbol] = df_s.close
df_open[symbol] = df_s.open
df_volume[symbol] = df_s.volume
df_count[symbol] = df_s['count']
df_buy_ratio[symbol] = df_s.buy_amount/df_s.amount
df_close = df_close.dropna(how='all')
df_open = df_open.dropna(how='all')
df_volume = df_volume.dropna(how='all')
df_count = df_count.dropna(how='all')
df_buy_ratio = df_buy_ratio.dropna(how='all')
Nhìn vào diễn biến của chỉ số thị trường, có thể nói là khá ảm đạm, với mức giảm 60% kể từ đầu năm.
df_norm = df_close/df_close.fillna(method='bfill').iloc[0] #归一化
df_norm.mean(axis=1).plot(figsize=(15,6),grid=True);
#最终指数收益图

Phương pháp hồi quy Tỷ lệ lợi nhuận của kỳ tiếp theo được lấy làm biến phụ thuộc, yếu tố cần kiểm tra được lấy làm biến độc lập và hệ số thu được bằng hồi quy là tỷ lệ lợi nhuận của yếu tố. Sau khi xây dựng phương trình hồi quy, chúng ta thường tham chiếu đến giá trị trung bình tuyệt đối của hệ số t, tỷ lệ của chuỗi giá trị tuyệt đối của hệ số t lớn hơn 2, lợi nhuận yếu tố hàng năm, biến động lợi nhuận yếu tố hàng năm, tỷ lệ Sharpe của lợi nhuận của yếu tố và các thông số khác. Hiệu quả và tính biến động của yếu tố. Bạn có thể hồi quy nhiều yếu tố cùng một lúc, hãy tham khảo tài liệu barra để biết chi tiết.
IC, IR và các chỉ số khác Cái gọi là IC là hệ số tương quan giữa yếu tố và tỷ lệ lợi nhuận của kỳ tiếp theo. RANK_IC hiện đang được sử dụng rộng rãi, là hệ số tương quan giữa thứ hạng yếu tố và tỷ lệ lợi nhuận của cổ phiếu trong kỳ tiếp theo. IR thường là giá trị trung bình của chuỗi IC/độ lệch chuẩn của chuỗi IC.
Hồi quy phân cấp Bài viết này sẽ sử dụng phương pháp này, đó là sắp xếp các yếu tố cần kiểm tra, chia các loại tiền tệ thành N nhóm để kiểm tra ngược theo nhóm và sử dụng một khoảng thời gian cố định để điều chỉnh các vị thế. Nếu tình hình lý tưởng, lợi suất của N nhóm tiền tệ sẽ thể hiện tính đơn điệu tốt, tăng hoặc giảm đều và khoảng cách lợi suất giữa mỗi nhóm sẽ lớn. Những yếu tố như vậy được phản ánh ở khả năng phân biệt tốt hơn. Nếu nhóm đầu tiên có lợi nhuận cao nhất và nhóm cuối cùng có lợi nhuận thấp nhất, thì hãy mua vào nhóm đầu tiên và bán ra nhóm cuối cùng. Tỷ lệ lợi nhuận cuối cùng là chỉ báo tham chiếu của tỷ lệ Sharpe.
Theo các yếu tố, các loại tiền tệ được chọn được chia thành 3 nhóm theo thứ tự từ nhỏ đến lớn. Mỗi nhóm tiền tệ chiếm khoảng 1⁄3. Nếu một yếu tố có hiệu lực, tỷ lệ của mỗi nhóm càng nhỏ thì tỷ lệ càng cao. lợi nhuận, nhưng nó cũng có nghĩa là Các quỹ được phân bổ cho mỗi loại tiền tệ tương đối lớn. Nếu các vị thế dài và ngắn đều có đòn bẩy 1x và nhóm đầu tiên và nhóm cuối cùng lần lượt là 10 loại tiền tệ, thì mỗi nhóm chiếm 10%. Nếu một loại tiền tệ là tăng bán khống, nếu số lượng đầu tư tăng gấp 2 lần, mức thoái lui sẽ là 20%; tương ứng, nếu số lượng nhóm là 50, mức thoái lui sẽ là 4%. Việc đa dạng hóa các loại tiền tệ có thể làm giảm nguy cơ thiên nga đen. Mua vào nhóm đầu tiên (có giá trị hệ số nhỏ nhất) và bán ra nhóm thứ ba. Nếu hệ số càng lớn thì lợi nhuận càng cao, bạn có thể đảo ngược vị thế mua và bán hoặc chỉ cần làm cho hệ số âm hoặc nghịch đảo.
Sức mạnh dự đoán của một yếu tố thường có thể được đánh giá sơ bộ dựa trên tỷ lệ lợi nhuận kiểm tra ngược cuối cùng và tỷ lệ Sharpe. Ngoài ra, cũng cần tham khảo xem biểu thức nhân tố có đơn giản, không nhạy cảm với quy mô nhóm, không nhạy cảm với khoảng điều chỉnh vị thế, không nhạy cảm với thời điểm ban đầu của backtest, v.v.
Về tần suất điều chỉnh vị thế, thị trường chứng khoán thường có chu kỳ 5 ngày, 10 ngày và một tháng, nhưng đối với thị trường tiền kỹ thuật số, chu kỳ như vậy chắc chắn là quá dài và điều kiện thị trường trên thị trường thực tế được theo dõi trong thời gian thực, do đó khó có thể tuân thủ một chu kỳ cụ thể. Không cần phải điều chỉnh lại các vị thế, do đó trong giao dịch thực, chúng ta điều chỉnh các vị thế theo thời gian thực hoặc trong các khoảng thời gian ngắn.
Về cách đóng một vị thế, theo phương pháp truyền thống, bạn có thể đóng vị thế nếu nó không nằm trong nhóm trong lần sắp xếp tiếp theo. Tuy nhiên, trong trường hợp điều chỉnh vị thế theo thời gian thực, một số loại tiền tệ có thể nằm ở đường phân chia và các vị thế có thể được đóng lại qua lại. Do đó, chiến lược này áp dụng cách tiếp cận chờ đợi sự thay đổi nhóm và đóng các vị thế khi cần mở các vị thế theo hướng ngược lại. Ví dụ, nếu bạn mua dài hạn trong nhóm đầu tiên, khi tiền tệ trong vị thế mua dài hạn được chia thành nhóm thứ ba, bạn có thể đóng vị thế và bán khống. Nếu bạn đóng các vị thế theo thời gian cố định, chẳng hạn như hàng ngày hoặc sau mỗi 8 giờ, bạn cũng có thể đóng các vị thế mà không cần tham gia vào nhóm nào. Bạn có thể thử thêm.
#回测引擎
class Exchange:
def __init__(self, trade_symbols, fee=0.0004, initial_balance=10000):
self.initial_balance = initial_balance #初始的资产
self.fee = fee
self.trade_symbols = trade_symbols
self.account = {'USDT':{'realised_profit':0, 'unrealised_profit':0, 'total':initial_balance, 'fee':0, 'leverage':0, 'hold':0}}
for symbol in trade_symbols:
self.account[symbol] = {'amount':0, 'hold_price':0, 'value':0, 'price':0, 'realised_profit':0,'unrealised_profit':0,'fee':0}
def Trade(self, symbol, direction, price, amount):
cover_amount = 0 if direction*self.account[symbol]['amount'] >=0 else min(abs(self.account[symbol]['amount']), amount)
open_amount = amount - cover_amount
self.account['USDT']['realised_profit'] -= price*amount*self.fee #扣除手续费
self.account['USDT']['fee'] += price*amount*self.fee
self.account[symbol]['fee'] += price*amount*self.fee
if cover_amount > 0: #先平仓
self.account['USDT']['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount #利润
self.account[symbol]['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount
self.account[symbol]['amount'] -= -direction*cover_amount
self.account[symbol]['hold_price'] = 0 if self.account[symbol]['amount'] == 0 else self.account[symbol]['hold_price']
if open_amount > 0:
total_cost = self.account[symbol]['hold_price']*direction*self.account[symbol]['amount'] + price*open_amount
total_amount = direction*self.account[symbol]['amount']+open_amount
self.account[symbol]['hold_price'] = total_cost/total_amount
self.account[symbol]['amount'] += direction*open_amount
def Buy(self, symbol, price, amount):
self.Trade(symbol, 1, price, amount)
def Sell(self, symbol, price, amount):
self.Trade(symbol, -1, price, amount)
def Update(self, close_price): #对资产进行更新
self.account['USDT']['unrealised_profit'] = 0
self.account['USDT']['hold'] = 0
for symbol in self.trade_symbols:
if not np.isnan(close_price[symbol]):
self.account[symbol]['unrealised_profit'] = (close_price[symbol] - self.account[symbol]['hold_price'])*self.account[symbol]['amount']
self.account[symbol]['price'] = close_price[symbol]
self.account[symbol]['value'] = abs(self.account[symbol]['amount'])*close_price[symbol]
self.account['USDT']['hold'] += self.account[symbol]['value']
self.account['USDT']['unrealised_profit'] += self.account[symbol]['unrealised_profit']
self.account['USDT']['total'] = round(self.account['USDT']['realised_profit'] + self.initial_balance + self.account['USDT']['unrealised_profit'],6)
self.account['USDT']['leverage'] = round(self.account['USDT']['hold']/self.account['USDT']['total'],3)
#测试因子的函数
def Test(factor, symbols, period=1, N=40, value=300):
e = Exchange(symbols, fee=0.0002, initial_balance=10000)
res_list = []
index_list = []
factor = factor.dropna(how='all')
for idx, row in factor.iterrows():
if idx.hour % period == 0:
buy_symbols = row.sort_values().dropna()[0:N].index
sell_symbols = row.sort_values().dropna()[-N:].index
prices = df_close.loc[idx,]
index_list.append(idx)
for symbol in symbols:
if symbol in buy_symbols and e.account[symbol]['amount'] <= 0:
e.Buy(symbol,prices[symbol],value/prices[symbol]-e.account[symbol]['amount'])
if symbol in sell_symbols and e.account[symbol]['amount'] >= 0:
e.Sell(symbol,prices[symbol], value/prices[symbol]+e.account[symbol]['amount'])
e.Update(prices)
res_list.append([e.account['USDT']['total'],e.account['USDT']['hold']])
return pd.DataFrame(data=res_list, columns=['total','hold'],index = index_list)
Yếu tố khối lượng: Việc mua vào các đồng tiền có khối lượng thấp và bán ra các đồng tiền có khối lượng cao sẽ mang lại hiệu quả rất tốt, điều này cho thấy các đồng tiền phổ biến có nhiều khả năng giảm giá hơn.
Yếu tố giá giao dịch: mua vào các loại tiền tệ giá thấp, bán ra các loại tiền tệ giá cao, hiệu ứng là trung bình.
Yếu tố số lượng giao dịch: Hiệu suất rất giống với khối lượng. Rõ ràng là mối tương quan giữa yếu tố khối lượng và yếu tố số lượng giao dịch là rất cao. Trên thực tế, mối tương quan trung bình giữa chúng ở các loại tiền tệ khác nhau là 0,97, điều này cho thấy hai yếu tố này rất giống nhau. Yếu tố này cần được xem xét vào tài khoản.
Hệ số động lượng 3h: (df_close - df_close.shift(3))/df_close.shift(3). Tức là, sự gia tăng của yếu tố trong 3 giờ. Kết quả kiểm tra ngược cho thấy sự gia tăng trong 3 giờ có đặc điểm hồi quy rõ ràng, tức là sự gia tăng có nhiều khả năng giảm trong giai đoạn tiếp theo. Hiệu suất chung là tốt, nhưng cũng có thời gian thoái lui và dao động dài hơn.
Yếu tố động lực 24 giờ: Kết quả của chu kỳ tái cân bằng 24 giờ khá tốt, với lợi nhuận tương tự như động lực 3 giờ và mức giảm nhỏ hơn.
Hệ số thay đổi doanh thu: df_volume.rolling(24).mean() / df_volume.rolling(96).mean(), là tỷ lệ doanh thu của ngày gần nhất với doanh thu của ba ngày gần nhất. Vị trí được điều chỉnh sau mỗi 8 giờ. Kết quả kiểm tra ngược tương đối tốt và mức thoái lui tương đối thấp, điều này cho thấy cổ phiếu có khối lượng giao dịch tích cực có nhiều khả năng giảm hơn.
Hệ số thay đổi số lượng giao dịch: df_count.rolling(24).mean() / df_count.rolling(96).mean(), là tỷ lệ giữa số lượng giao dịch trong ngày qua với số lượng giao dịch trong ba ngày qua . Vị trí được điều chỉnh sau mỗi 8 giờ. . Kết quả kiểm tra ngược tương đối tốt và mức thoái lui tương đối thấp, điều này cho thấy khi số lượng giao dịch tăng lên, thị trường có xu hướng giảm mạnh hơn.
Hệ số thay đổi giá trị giao dịch đơn lẻ: -(df_volume.rolling(24).mean()/df_count.rolling(24).mean())/(df_volume.rolling(24).mean()/df_count.rolling(96).mean()) , là tỷ lệ giữa giá trị giao dịch của ngày gần nhất với giá trị giao dịch của ba ngày gần nhất và vị thế được điều chỉnh sau mỗi 8 giờ. Yếu tố này cũng có mối tương quan cao với yếu tố thể tích.
Hệ số thay đổi tỷ lệ giao dịch đang hoạt động: df_buy_ratio.rolling(24).mean()/df_buy_ratio.rolling(96).mean(), tức là tỷ lệ giữa khối lượng mua đang hoạt động và tổng khối lượng giao dịch trong ngày cuối cùng của giao dịch giá trị trong ba ngày qua, điều chỉnh vị trí sau mỗi 8 giờ. Yếu tố này hoạt động tốt và ít tương quan với yếu tố khối lượng.
Yếu tố biến động: (df_close/df_open).rolling(24).std(), có tác động nhất định khi mua vào các loại tiền tệ có độ biến động thấp.
Hệ số tương quan giữa khối lượng giao dịch và giá đóng cửa: df_close.rolling(96).corr(df_volume), hệ số tương quan giữa giá đóng cửa và khối lượng giao dịch trong 4 ngày qua, hiệu suất chung là tốt.
Dưới đây chỉ là một số yếu tố dựa trên số lượng và giá cả. Trên thực tế, sự kết hợp của các công thức yếu tố có thể rất phức tạp và có thể không có logic rõ ràng. Bạn có thể tham khảo phương pháp xây dựng hệ số ALPHA101 nổi tiếng: https://github.com/STHSF/alpha101.
#成交量
factor_volume = df_volume
factor_volume_res = Test(factor_volume, symbols, period=4)
factor_volume_res.total.plot(figsize=(15,6),grid=True);

#成交价
factor_close = df_close
factor_close_res = Test(factor_close, symbols, period=8)
factor_close_res.total.plot(figsize=(15,6),grid=True);

#成交笔数
factor_count = df_count
factor_count_res = Test(factor_count, symbols, period=8)
factor_count_res.total.plot(figsize=(15,6),grid=True);

print(df_count.corrwith(df_volume).mean())
0.9671246744996017
#3小时动量因子
factor_1 = (df_close - df_close.shift(3))/df_close.shift(3)
factor_1_res = Test(factor_1,symbols,period=1)
factor_1_res.total.plot(figsize=(15,6),grid=True);

#24小时动量因子
factor_2 = (df_close - df_close.shift(24))/df_close.shift(24)
factor_2_res = Test(factor_2,symbols,period=24)
tamenxuanfactor_2_res.total.plot(figsize=(15,6),grid=True);

#成交量因子
factor_3 = df_volume.rolling(24).mean()/df_volume.rolling(96).mean()
factor_3_res = Test(factor_3, symbols, period=8)
factor_3_res.total.plot(figsize=(15,6),grid=True);

#成交笔数因子
factor_4 = df_count.rolling(24).mean()/df_count.rolling(96).mean()
factor_4_res = Test(factor_4, symbols, period=8)
factor_4_res.total.plot(figsize=(15,6),grid=True);

#因子相关性
print(factor_4.corrwith(factor_3).mean())
0.9707239580854841
#单笔成交价值因子
factor_5 = -(df_volume.rolling(24).mean()/df_count.rolling(24).mean())/(df_volume.rolling(24).mean()/df_count.rolling(96).mean())
factor_5_res = Test(factor_5, symbols, period=8)
factor_5_res.total.plot(figsize=(15,6),grid=True);

print(factor_4.corrwith(factor_5).mean())
0.861206620552479
#主动成交比例因子
factor_6 = df_buy_ratio.rolling(24).mean()/df_buy_ratio.rolling(96).mean()
factor_6_res = Test(factor_6, symbols, period=4)
factor_6_res.total.plot(figsize=(15,6),grid=True);

print(factor_3.corrwith(factor_6).mean())
0.1534572192503726
#波动率因子
factor_7 = (df_close/df_open).rolling(24).std()
factor_7_res = Test(factor_7, symbols, period=2)
factor_7_res.total.plot(figsize=(15,6),grid=True);

#成交量和收盘价相关性因子
factor_8 = df_close.rolling(96).corr(df_volume)
factor_8_res = Test(factor_8, symbols, period=4)
factor_8_res.total.plot(figsize=(15,6),grid=True);

Việc liên tục khám phá các yếu tố hiệu quả mới chắc chắn là phần quan trọng nhất của quá trình xây dựng chiến lược, nhưng nếu không có phương pháp tổng hợp yếu tố tốt, một yếu tố Alpha đơn lẻ tuyệt vời không thể phát huy hết vai trò của nó. Các phương pháp tổng hợp đa yếu tố phổ biến bao gồm:
Phương pháp trọng số bằng nhau: Tất cả các yếu tố cần tổng hợp được thêm vào với trọng số bằng nhau để thu được các yếu tố tổng hợp mới.
Phương pháp có trọng số của lợi nhuận yếu tố lịch sử: Tất cả các yếu tố cần tổng hợp được cộng lại với nhau theo trung bình số học của lợi nhuận yếu tố lịch sử trong giai đoạn gần nhất làm trọng số để có được các yếu tố tổng hợp mới. Phương pháp này đánh giá cao hơn những yếu tố có hiệu quả tốt.
Tối đa hóa phương pháp trọng số IC_IR: Giá trị IC trung bình của hệ số tổng hợp trong một giai đoạn lịch sử được sử dụng làm ước tính giá trị IC của hệ số tổng hợp trong giai đoạn tiếp theo và ma trận hiệp phương sai của giá trị IC lịch sử được sử dụng làm ước tính của độ biến động của yếu tố tổng hợp trong giai đoạn tiếp theo. Nó bằng giá trị kỳ vọng của IC chia cho độ lệch chuẩn của IC và có thể thu được giải pháp trọng số tối ưu để tối đa hóa yếu tố tổng hợp IC_IR.
Phương pháp phân tích thành phần chính (PCA): PCA là phương pháp thường được sử dụng để giảm chiều dữ liệu. Mối tương quan giữa các yếu tố có thể tương đối cao và các thành phần chính sau khi giảm chiều được sử dụng làm các yếu tố tổng hợp.
Bài viết này sẽ tham khảo thủ công về trọng số hiệu lực của yếu tố. Phương pháp được mô tả ở trên có thể tham khảo:ae933a8c-5a94-4d92-8f33-d92b70c36119.pdf
Khi kiểm tra một yếu tố duy nhất, thứ tự là cố định, nhưng tổng hợp nhiều yếu tố đòi hỏi phải hợp nhất dữ liệu hoàn toàn khác nhau lại với nhau, do đó tất cả các yếu tố cần được chuẩn hóa và nói chung cần loại bỏ các giá trị cực trị và giá trị bị thiếu. Ở đây chúng tôi sử dụng df_volume\factor_1\factor_7\factor_6\factor_8 để tổng hợp.
#标准化函数,去除缺失值和极值,并且进行标准化处理
def norm_factor(factor):
factor = factor.dropna(how='all')
factor_clip = factor.apply(lambda x:x.clip(x.quantile(0.2), x.quantile(0.8)),axis=1)
factor_norm = factor_clip.add(-factor_clip.mean(axis=1),axis ='index').div(factor_clip.std(axis=1),axis ='index')
return factor_norm
df_volume_norm = norm_factor(df_volume)
factor_1_norm = norm_factor(factor_1)
factor_6_norm = norm_factor(factor_6)
factor_7_norm = norm_factor(factor_7)
factor_8_norm = norm_factor(factor_8)
factor_total = 0.6*df_volume_norm + 0.4*factor_1_norm + 0.2*factor_6_norm + 0.3*factor_7_norm + 0.4*factor_8_norm
factor_total_res = Test(factor_total, symbols, period=8)
factor_total_res.total.plot(figsize=(15,6),grid=True);

Bài viết này giới thiệu phương pháp kiểm tra một yếu tố và kiểm tra các yếu tố đơn phổ biến, và giới thiệu sơ bộ phương pháp tổng hợp nhiều yếu tố. Tuy nhiên, nội dung nghiên cứu nhiều yếu tố rất phong phú. Mỗi điểm được đề cập trong bài viết có thể được mở rộng sâu hơn . Đây là một cách tiếp cận khả thi để chuyển đổi nghiên cứu chiến lược như vậy thành việc khám phá các yếu tố alpha. Sử dụng phương pháp hệ số có thể tăng tốc đáng kể việc xác minh các ý tưởng giao dịch và có rất nhiều tài liệu tham khảo có sẵn.
Địa chỉ thực tế: https://www.fmz.com/robot/486605