Mô hình nhân tố tiền kỹ thuật số

Tác giả:Cỏ nhỏ, Tạo: 2022-09-27 16:10:28, Cập nhật: 2023-09-15 20:58:26

[TOC]

img

Khung mô hình nhân tố

Các 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 có thể được coi là đầy đủ, với lý thuyết và thực tiễn phong phú. Thị trường tiền kỹ thuật số, bất kể số lượng tiền, tổng giá trị thị trường, khối lượng giao dịch, thị trường phái sinh, v.v. đủ để đáp ứng nghiên cứu nhân tố, bài viết này chủ yếu đối mặt với những người mới bắt đầu chiến lược định lượng, 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ê, sẽ sử dụng thị trường tiền tệ ổn định vĩnh viễn như một nguồn dữ liệu, xây dựng một khuôn khổ nghiên cứu nhân tố đơn giản, thuận tiện để đánh giá các chỉ số nhân tố.

Các yếu tố có thể được xem như một chỉ số, có thể được viết thành biểu thức, các yếu tố thay đổi liên tục, phản ánh thông tin thu nhập trong tương lai, 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 gần, giả định đằng sau đó là giá cổ phiếu có thể dự đoán lợi nhuận tương lai, giá cổ phiếu càng cao thì lợi nhuận tương lai càng cao (hoặc có thể thấp hơn), và việc xây dựng danh mục đầu tư theo yếu tố này thực sự là một mô hình / chiến lược đầu tư mua cổ phiếu có giá cao theo định kỳ. Nói chung, những yếu tố có thể tạo ra lợi nhuận dư thừa liên tục thường được gọi là alpha. Ví dụ: yếu tố giá trị thị trường, yếu tố động lực và các yếu tố khác đã được giới học thuật và giới đầu tư chứng minh là những yếu tố đã từng hiệu quả.

Cả thị trường chứng khoán và thị trường tiền kỹ thuật số đều là một hệ thống phức tạp, không có yếu tố nào có thể dự đoán hoàn toàn lợi nhuận trong tương lai, nhưng vẫn có một số tính dự đoán; alpha hiệu quả (mô hình đầu tư) và dần thất bại khi nhiều tiền hơn được đầu tư. Tuy nhiên, quá trình này sẽ tạo ra các mô hình khác trên thị trường, dẫn đến sự ra đời của alpha mới. Các yếu tố giá trị thị trường đã từng là một chiến lược rất hiệu quả trên thị trường chứng khoán A, đơn giản là mua 10 cổ phiếu có giá trị thị trường thấp nhất, điều chỉnh một lần mỗi ngày, sẽ nhận được lợi nhuận hơn 400 lần, vượt xa so với thập kỷ 2007; nhưng giá trị lớn của thị trường chứng khoán Bạch Dương năm 2017 phản ánh sự thất bại của các yếu tố thị trường nhỏ và các yếu tố giá trị thay vào đó đã trở nên phổ biến. Do đó, cần phải sử dụng thử nghiệm và cân bằng liên tục giữa chứng khoán và alpha.

Các yếu tố tìm kiếm là nền tảng để xây dựng chiến lược, và một 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

Nguồn dữ liệu

Dữ liệu K-Line từ đầu năm 2022 đến nay, cho đến nay, đã có hơn 150 loại tiền tệ. Như đã nói trước đây, mô hình nhân tố là một mô hình tiền tệ tùy chọn, hướng đến tất cả các loại tiền tệ chứ không phải một loại tiền tệ nhất định. Dữ liệu K-Line bao gồm các dữ liệu về giá khởi điểm, số lượng giao dịch, số lượng giao dịch, số lượng mua chủ động, những dữ liệu này tất nhiên không phải là nguồn 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, dữ liệu về lợi nhuận trên chuỗi, nhiệt độ truyền thông xã hội, v.v.

## 当前交易对
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)

Ra ngoài:

['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))

Ra ngoài:

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)

Ra ngoài:

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 sẽ chiết xuất các 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, tỷ lệ mua chủ động, và dựa trên dữ liệu này, chúng tôi 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 chung, chỉ số thị trường có thể được xem là khá ảm đạm, giảm 60% 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);
#最终指数收益图

img

Xác định hiệu quả của các yếu tố

  • Luật hồi quy Trong giai đoạn sau, tỷ lệ lợi nhuận được sử dụng như một biến số, các yếu tố được kiểm tra là các biến tự động, các hệ số được quay trở lại là tỷ lệ lợi nhuận của các yếu tố. Sau khi xây dựng phương trình quay trở lại, chúng ta thường tham khảo trung bình giá trị tuyệt đối của các giá trị t của các yếu tố, tỷ lệ phần trăm của chuỗi giá trị tuyệt đối của các giá trị t của các yếu tố lớn hơn 2, tỷ lệ lợi nhuận hàng năm, tỷ lệ biến động lợi nhuận hàng năm, Sharpe của lợi nhuận tỷ lệ để xem xét hiệu quả và biến động của các yếu tố.

  • Các chỉ số như IC, IR IC là hệ số liên quan của các yếu tố với tỷ lệ lợi nhuận trong kỳ tiếp theo, và bây giờ cũng thường được sử dụng với Rank_IC, đó là hệ số liên quan của các yếu tố xếp hạng với tỷ lệ lợi nhuận trong kỳ tiếp theo của cổ phiếu. IR thường là trung bình của chuỗi IC / chênh lệch tiêu chuẩn của chuỗi IC.

  • Phương pháp hồi quy phân tầng Bài viết này sẽ sử dụng phương pháp này, đó là phân chia các loại tiền vào các nhóm N theo thứ tự của các yếu tố để được kiểm tra, để phân nhóm lại và sử dụng chu kỳ cố định để thực hiện các hoạt động giao dịch. Nếu điều kiện lý tưởng, lợi nhuận của các loại tiền nhóm N sẽ có tính đơn điệu tốt hơn, tăng hoặc giảm đơn điệu, và mỗi nhóm có khoảng cách lợi nhuận lớn hơn. Các yếu tố này thể hiện sự phân biệt tốt hơn. Nếu nhóm đầu tiên có lợi nhuận cao nhất, nhóm cuối cùng có lợi nhuận thấp nhất, thì hãy thực hiện các kết hợp đầu tiên và làm nhiều hơn các kết hợp cuối cùng, kết quả cuối cùng là tỷ lệ lợi nhuận, chỉ số tham khảo của tỷ lệ Sharpe.

Hoạt động kiểm tra thực tế

Theo các yếu tố từ nhỏ đến lớn, các loại tiền được chọn được phân loại theo 3 nhóm theo thứ tự, mỗi nhóm coin chiếm khoảng 1/3, nếu một yếu tố hiệu quả, số lượng nhỏ hơn của mỗi thành phần thường có lợi nhuận cao hơn, nhưng cũng có nghĩa là số tiền được phân bổ cho mỗi đồng tiền tương đối lớn hơn, nếu nhiều chỗ trống được đòn bẩy gấp đôi, nhóm thứ nhất và nhóm cuối cùng có 10 đồng tiền, thì tỷ lệ chiếm 10%, nếu một loại tiền trống tăng gấp đôi, thì 20% bị rút lại; nếu số lượng các nhóm tương ứng là 50, thì bị rút lại.

Thông thường, khả năng dự đoán nhân tố có thể được đánh giá một cách vắn tắt dựa trên tỷ lệ lợi nhuận và tỷ lệ Sharpe của việc kiểm tra lại cuối cùng. Ngoài ra, cần phải xem xét liệu biểu thức nhân tố có đơn giản hay không, không nhạy cảm với kích thước phân nhóm, không nhạy cảm với khoảng thời gian điều chỉnh, không nhạy cảm với thời gian bắt đầu kiểm tra lại, v.v.

Về tần suất điều chỉnh, thị trường chứng khoán thường có chu kỳ 5, 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à thị trường trong thực tế được theo dõi trong thời gian thực, không cần phải điều chỉnh lại một chu kỳ cụ thể, vì vậy trong thực tế chúng ta là thời gian thực hoặc ngắn.

Đối với cách cân bằng, theo phương pháp truyền thống, lần sắp xếp tiếp theo bạn có thể cân bằng ngay trong nhóm; nhưng trong trường hợp giao dịch thực tế, một số đồng tiền có thể nằm ngay ở ranh giới phân chia, sẽ có tình huống cân bằng trở lại. Vì vậy, chiến lược này sử dụng cách chờ thay đổi nhóm, cần phải cân bằng lại khi vị trí chuyển hướng, ví dụ như nhóm đầu tiên nhiều, khi các đồng tiền trong trạng thái nhiều được phân chia thành nhóm thứ ba, thì bạn có thể cân bằng lại. Nếu chu kỳ cân bằng cố định, ví dụ như mỗi ngày hoặc mỗi 8 giờ, bạn cũng có thể sử dụng cách cân bằng không nằm trong nhó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)

Kiểm tra nhân tố đơn giản

Các yếu tố giao dịch: đơn giản là làm nhiều đồng tiền giao dịch thấp, làm trống các đồng tiền giao dịch cao, hoạt động rất tốt, điều này cho thấy đồng tiền nóng có xu hướng giảm.

Các yếu tố giá giao dịch: làm nhiều đồng tiền có giá thấp, làm không đồng tiền có giá cao, hiệu quả nói chung.

Các yếu tố số giao dịch: biểu hiện và số giao dịch rất giống nhau. Có thể thấy rõ ràng rằng mối quan hệ giữa các yếu tố số giao dịch và các yếu tố số giao dịch rất cao, và thực tế, mối quan hệ trung bình giữa các loại tiền tệ khác nhau của chúng đạt 0,97, cho thấy hai yếu tố này rất gần nhau, điều này cần phải được xem xét khi tổng hợp nhiều yếu tố.

3h động lượng yếu tố: ((df_close - df_close.shift)) 3)) /df_close.shift ((3)); tức là yếu tố tăng 3 giờ, các kết quả kiểm tra lại cho thấy tăng 3 giờ có đặc tính hồi quy rõ ràng, tức là tăng sau đó dễ dàng giảm hơn.

24h động lượng nhân: 24h chu kỳ điều chỉnh giao dịch kết quả tốt, lợi nhuận gần với động lượng 3h, rút lại nhỏ hơn.

Các yếu tố thay đổi khối lượng giao dịch: df_volume.rolling ((24).mean (() /df_volume.rolling ((96).mean ((), tức là tỷ lệ giao dịch trong một ngày gần đây so với giao dịch trong 3 ngày gần đây, điều chỉnh giao dịch mỗi 8 giờ. Kết quả kiểm tra lại hoạt động tốt hơn, và thu hồi thấp hơn, cho thấy giao dịch hoạt động hơn và có xu hướng giảm hơn.

Các giao dịch số lượng thay đổi yếu tố:df_count.rolling ((24).mean (() /df_count.rolling ((96).mean ((), tức là tỷ lệ giao dịch số lượng gần đây nhất 1 ngày với số giao dịch gần đây nhất 3 ngày, mỗi 8 giờ một lần. Các kết quả kiểm tra lại hoạt động tốt hơn, thu hồi cũng thấp hơn, cho thấy số giao dịch tăng tích cực thay vì có xu hướng giảm.

Các yếu tố 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()) Đây là tỷ lệ giữa giá trị giao dịch trong một ngày gần đây và giá trị giao dịch trong 3 ngày gần đây, mỗi 8 giờ một lần.

Tỷ lệ giao dịch tích cực thay đổi yếu tố:df_buy_ratio.rolling ((24).mean (() /df_buy_ratio.rolling ((96).mean ((), tức là tỷ lệ giao dịch tích cực trong một ngày gần đây với tổng giao dịch với giá trị giao dịch trong 3 ngày gần đây, mỗi 8 giờ một lần.

Nhân tố tỷ lệ biến động: (df_close/df_open).rolling ((24)).std ((), làm cho nhiều đồng tiền biến động thấp, có hiệu quả nhất định.

Các yếu tố liên quan đến khối lượng giao dịch và giá đóng cửa:df_close.rolling ((96).corr ((df_volume), giá đóng cửa 4 ngày gần đây có các yếu tố liên quan đến khối lượng giao dịch, tổng thể hoạt động tốt.

Dưới đây chỉ là một số yếu tố dựa trên giá trị định lượng, thực tế các công thức yếu tố có thể rất phức tạp và không có logic rõ ràng. Có thể tham khảo cách xây dựng yếu tố của 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);

img

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

img

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

img

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);

img

#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);

img

#成交量因子
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);

img

#成交笔数因子
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);

img

#因子相关性
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);

img

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);

img

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);

img

#成交量和收盘价相关性因子
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);

img

Tạo ra nhiều yếu tố

Việc liên tục khai thác các yếu tố hiệu quả mới là một phần quan trọng nhất trong 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, các yếu tố alpha tốt cũng không thể thực hiện tối đa. Các phương pháp tổng hợp đa yếu tố phổ biến bao gồm:

Định luật tương đương: tất cả các trọng lượng của các yếu tố tổng hợp khác được cộng lại để có được các yếu tố hậu tổng hợp mới.

Phương pháp cân nhắc tỷ lệ lợi nhuận của nhân tố lịch sử: tất cả các nhân tố cần tổng hợp được cộng lại theo trọng số trung bình của tỷ lệ lợi nhuận nhân tố lịch sử trong thời gian gần đây để có được nhân tố sau tổng hợp mới. Phương pháp này thể hiện trọng lượng nhân tố cao hơn.

Tối đa hóa IC_IR cộng trọng số: với giá trị IC trung bình của các yếu tố phức tạp trong một khoảng thời gian lịch sử là ước tính giá trị IC của các yếu tố phức tạp trong giai đoạn tiếp theo, với ma trận chênh lệch đồng chiều của các giá trị IC lịch sử là ước tính tỷ lệ biến động của các yếu tố phức tạp trong giai đoạn tiếp theo, theo giá trị mong đợi của IC bằng IC chia với chênh lệch tiêu chuẩn của IC, có thể có được giải quyết ưu thế tối đa của các yếu tố phức tạp IC_IR.

Phương pháp phân tích thành phần chính (PCA): PCA là một phương pháp phổ biến để giảm kích thước dữ liệu, có thể có mối quan hệ cao giữa các yếu tố, sử dụng thành phần chính sau khi giảm kích thước như một yếu tố sau khi tổng hợp.

Trong bài viết này, chúng ta sẽ sử dụng phương pháp trao quyền hiệu quả của yếu tố tham chiếu bằng tay.ae933a8c-5a94-4d92-8f33-d92b70c36119.pdf

Trong thử nghiệm một yếu tố, thứ tự được cố định, nhưng tổng hợp nhiều yếu tố đòi hỏi phải kết hợp các dữ liệu hoàn toàn khác nhau, do đó cần phải xử lý tiêu chuẩn hóa tất cả các yếu tố, thường cần xử lý giá trị cực và giá trị thiếu. Ở đây chúng ta sử dụng tổng hợpdf_volume\factor_1\factor_7\factor_6\factor_8.

#标准化函数,去除缺失值和极值,并且进行标准化处理
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);

img

Tóm lại

Bài viết này giới thiệu phương pháp thử nghiệm đơn yếu tố và thử nghiệm các đơn yếu tố phổ biến, giới thiệu sơ bộ các phương pháp tổng hợp đa yếu tố, nhưng nghiên cứu đa yếu tố rất phong phú, đề cập đến từng điểm có thể được mở rộng sâu sắc, chuyển đổi nghiên cứu chiến lược đa dạng thành phát hiện yếu tố alpha là một con đường khả thi, sử dụng phương pháp lý của nhân tố, có thể tăng tốc rất nhiều để xác minh ý tưởng giao dịch và có rất nhiều tài liệu tham khảo.

Địa chỉ thực:https://www.fmz.com/robot/486605


Có liên quan

Thêm nữa

ChankingBài viết rất hay.

Người đi BerinGrasshopper WWE!!! gần đây cũng đang nghiên cứu về điều này

Những đám mây nhẹKết thúc..... hoàn toàn không hiểu....

cjz140Grass God WWE!!!

Jmxjqr0302Grass God WWE!!!

Jmxjqr0302Grass God WWE!!!

Jmxjqr0302Grass God WWE!!!

f_qGrass God WWE!!!

Những con bạch tuộc vô số.Grass God WWE!!!

Tututu001Grass God WWE!!!

xunfeng91Grass God WWE!!!