Modèle facteur de monnaie numérique

Auteur:Le foin, Créé: 2022-09-27 16:10:28, Mis à jour: 2023-09-15 20:58:26

[TOC] Je vous en prie.

img

Cadre de modélisation factuelle

Le rapport de recherche sur le modèle multifactoriel des marchés boursiers est plein de théories et de pratiques. Le marché de la monnaie numérique, quel que soit le nombre de pièces, la valeur marchande totale, le volume des transactions, le marché des dérivés, etc., est suffisant pour satisfaire à la recherche factuelle.

Le facteur peut être considéré comme un indicateur, peut être écrit comme une expression, le facteur est en constante évolution et reflète les informations de rendement à venir, le facteur représente généralement une logique d'investissement.

Par exemple: le facteur de clôture du prix, qui suppose que le prix de l'action peut prédire les rendements futurs, et que les rendements futurs sont plus élevés (ou peut-être moins élevés) lorsque le prix de l'action est élevé, est en fait un modèle d'investissement ou une stratégie consistant à acheter des actions à un prix élevé en rotation régulière. En général, les facteurs qui peuvent générer des rendements excessifs de façon continue sont souvent appelés alpha. Les facteurs de valeur marchande, de dynamisme, etc. ont été prouvés par les universitaires et les investisseurs comme étant des facteurs qui ont fonctionné.

Les marchés boursiers et les marchés de crypto-monnaie sont tous deux un système complexe, aucun facteur ne peut prédire parfaitement les rendements futurs, mais ils ont toujours une certaine prévisibilité. Les alphas efficaces (modèles d'investissement) et échouent progressivement avec l'entrée de plus de fonds. Mais ce processus engendrera d'autres modèles sur le marché, donnant naissance à de nouveaux alphas. Le facteur de valeur a été une stratégie très efficace sur le marché des actions A. Il suffit d'acheter 10 actions de la valeur la plus basse et de les ajuster une fois par jour pour obtenir un rendement de plus de 400 fois supérieur à celui de 2007 à partir de dix ans.

Les facteurs recherchés sont à la base de la stratégie, et une meilleure stratégie peut être construite en combinant plusieurs facteurs efficaces non liés.

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

Sources de données

Les données de la ligne K horaire du début de 2022 à ce jour, à ce jour, dépassent les 150 devises. Comme mentionné précédemment, le modèle facteur est un modèle de devises d'option, orienté vers l'ensemble des devises plutôt que vers une monnaie particulière. Les données de la ligne K contiennent des données sur les prix de départ et de départ, les transactions, le nombre de transactions, les achats actifs, etc., qui ne sont bien sûr pas la source de tous les facteurs, tels que l'indice boursier américain, les prévisions d'augmentation des taux d'intérêt, les données sur la chaîne de profitabilité, la chaleur des médias sociaux, etc. Les sources de données à clé peuvent également détecter des alphas efficaces, mais les données de prix de base sont tout à fait suffisantes.

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

À l' extérieur:

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

À l' extérieur:

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)

À l' extérieur:

Index(['time', 'open', 'high', 'low', 'close', 'amount', 'end_time', 'volume',
       'count', 'buy_amount', 'buy_volume', 'null'],
      dtype='object')

Pour commencer, nous extrairons les données qui nous intéressent des données de la ligne K: prix de clôture, prix d'ouverture, volume de transactions, nombre de transactions, pourcentage d'achats effectués, et nous traiterons les facteurs nécessaires en fonction de ces données.

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

L'indice de performance du marché, qui a chuté de 60% depuis le début de l'année, est plutôt sombre.

df_norm = df_close/df_close.fillna(method='bfill').iloc[0] #归一化
df_norm.mean(axis=1).plot(figsize=(15,6),grid=True);
#最终指数收益图

img

Détermination de l'efficacité des facteurs

  • La régression Le coefficient de retour est le coefficient de rendement du facteur. Après avoir construit l'équation de retour, on se réfère généralement à la moyenne des valeurs absolues du coefficient t, à la proportion de séquences de valeurs absolues du coefficient t supérieures à 2, au coefficient de rendement annuel, à la volatilité du coefficient de rendement annuel, à la volatilité du coefficient de rendement Sharpe.

  • Indicateurs tels que IC, IR On appelle IC le coefficient entre le facteur et le taux de rendement de la prochaine édition, et on utilise désormais généralement Rank_IC, le coefficient entre le facteur et le taux de rendement de la prochaine édition. IR est généralement la moyenne de la séquence IC/décalage standard de la séquence IC.

  • Rétrogradation par couches Cette méthode consiste à réévaluer la répartition des devises en N groupes en fonction de l'ordre des facteurs à tester. Si c'est le cas, les rendements des N groupes seront plus uniformes, augmenteront ou diminueront, et chaque groupe aura un plus grand écart de rendement. Ce facteur se traduira par une meilleure distinction. Si le premier groupe est le plus rentable et le dernier groupe le plus rentable, la première combinaison sera la plus faible et la dernière sera la plus vide.

Opérations réelles de retouche

Selon les facteurs, les pièces en attente sont classées en 3 groupes selon l'ordre, de petit à grand, chaque groupe de pièces représentant environ 1/3, si un facteur est efficace, le moins de chaque composant est souvent plus rentable, mais cela signifie également que le montant alloué à chaque pièce est relativement plus élevé. Si le nombre de pièces en attente est deux fois plus élevé, le premier et le dernier groupe de 10 pièces, respectivement, un rapport de poids représente 10%, si une pièce en attente est deux fois plus élevée, 20% est retiré; si le nombre de pièces correspondant est de 50, le retrait est effectué.

La capacité de prédiction des facteurs peut généralement être évaluée de manière approximative en fonction du rendement final et du taux de Sharpe. On peut également se référer à la simplicité de l'expression des facteurs, à leur insensitivité à la taille du groupe, à leur insensitivité à l'intervalle d'ajustement, à leur insensitivité au temps initial de réévaluation.

En ce qui concerne la fréquence des ajustements, les marchés boursiers ont tendance à être cycliques de 5, 10 jours et un mois, mais pour le marché de la monnaie numérique, ces cycles sont sans aucun doute trop longs et les marchés en direct sont surveillés en temps réel, il n'est donc pas nécessaire de refaire les ajustements à un cycle spécifique.

En ce qui concerne la façon d'équilibrer, selon la méthode traditionnelle, la prochaine sélection peut être effectuée hors du groupe; mais dans le cas d'une transaction en temps réel, certaines devises peuvent être à la limite de la division et des équilibres vont se produire. La stratégie utilise donc une méthode d'équilibrage en attente de changement de groupe, qui nécessite un changement de direction.

#回测引擎
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)

Test facteur simple

Facteur de transaction: les monnaies à faible volume de transaction et les monnaies à volume élevé de transaction ont une très bonne performance, ce qui indique que les pièces chaudes ont tendance à baisser.

Facteur de prix: faire des devises à bas prix, faire des devises à bas prix, effet général.

Facteur de transaction: les performances et les transactions sont très similaires. Il est évident de noter que la corrélation entre le facteur de transaction et le facteur de transaction est très élevée, ce qui est également le cas, la corrélation moyenne entre leurs différentes devises atteint 0.97, ce qui indique que les deux facteurs sont très proches et que ce facteur doit être pris en compte lors de la synthèse de multiples facteurs.

3h facteur de mouvement: ((df_close - df_close.shift)) 3)) /df_close.shift ((3)); c'est-à-dire une augmentation de 3 heures du facteur, les résultats de retestation montrent que l'augmentation de 3 heures a une caractéristique de régression évidente, c'est-à-dire que les hausses sont plus faciles à descendre ensuite. La performance globale est bonne, mais il y a aussi des périodes de retrait et d'oscillation plus longues.

Le facteur de mobilité 24h: les résultats des cycles d'ajustement de 24h sont bons, les gains sont proches de la mobilité 3h et le recul est plus petit.

Facteur de variation du volume des transactions:df_volume.rolling ((24).mean (() /df_volume.rolling ((96).mean ((), c'est-à-dire le rapport entre le volume des transactions effectuées au cours de la dernière journée et le volume des transactions effectuées au cours des trois dernières journées, ajusté une fois toutes les 8 heures. Les résultats des retrospectives sont meilleurs et les retraits sont plus faibles, ce qui indique que les transactions actives ont tendance à baisser.

Facteur de variation du nombre de transactions:df_count.rolling ((24).mean (() /df_count.rolling ((96).mean ((), c'est-à-dire le rapport entre le nombre de transactions effectuées au cours de la dernière journée et le nombre de transactions effectuées au cours des trois derniers jours, ajusté une fois toutes les 8 heures. Les résultats de la réévaluation sont meilleurs et les retraits sont moins élevés, ce qui indique que le nombre de transactions a tendance à diminuer au lieu d'augmenter.

Les facteurs de variation de la valeur d'une seule transaction: - ((df_volume.rolling(24).mean() /df_count.rolling(24.mean()) /(df_volume.rolling(24.mean() /df_count.rolling ((96).mean()) Le coefficient de conversion est le rapport entre la valeur des transactions effectuées au cours de la dernière journée et la valeur des transactions effectuées au cours des trois dernières journées, une fois toutes les huit heures.

Facteur de variation du taux de transaction actif:df_buy_ratio.rolling ((24).mean (() /df_buy_ratio.rolling ((96).mean ((), c'est-à-dire le rapport entre le volume d'achat actif et le total des transactions effectuées au cours de la dernière journée et le rapport entre la valeur des transactions effectuées au cours des trois dernières jours, une fois toutes les 8 heures. Ce facteur est encore présent et n'a pas beaucoup de corrélation avec le facteur de transaction.

Le facteur de volatilité: (df_close/df_open).rolling ((24)).std ((), qui est une monnaie à faible volatilité, a un certain effet.

Le taux d'intérêt de l'épargne-investissement a été très bas au début de l'année.

Les facteurs énumérés ci-dessous ne sont que quelques-uns des facteurs qui sont basés sur le prix de la quantité. En réalité, les combinaisons de formules de facteurs peuvent être très complexes et ne peuvent pas avoir de logique évidente.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

Synthèse de facteurs multiples

Bien que l'exploration constante de nouveaux facteurs efficaces soit la partie la plus importante du processus de construction de la stratégie, l'excellent alpha-facteur ne peut pas jouer son rôle le plus important sans une bonne méthode de synthèse de facteurs.

L'équation de l'équilibre: les poids de tous les facteurs de synthèse sont ajoutés pour obtenir un nouveau facteur de post-synthèse.

La méthode du facteur historique de rendement pondéré: tous les facteurs à synthétiser sont ajoutés en fonction de la moyenne arithmétique du taux historique de rendement au cours de la période la plus récente pour obtenir un nouveau facteur post-synthétisation. Cette méthode a montré une plus grande pondération des facteurs.

Maximisation de la pondération IC_IR: en utilisant la valeur IC moyenne du facteur composé au cours d'une période historique comme estimation de la valeur IC de la période suivante du facteur composé, en utilisant la matrice de différence de coordonnée de la valeur IC historique comme estimation de la volatilité de la période suivante du facteur composé, on obtient la réédition optimale du facteur composé IC_IR en utilisant la valeur IC_IR égale à la valeur attendue de la IC divisée par l'écart type de la IC.

L'analyse des composants principaux (PCA): PCA est une méthode couramment utilisée pour réduire la dimension des données. La corrélation entre les facteurs peut être relativement élevée, en utilisant les composants principaux post-réduction comme facteur post-synthèse.

Dans cet article, nous allons utiliser manuellement l'autorisation de l'efficacité des facteurs de référence.ae933a8c-5a94-4d92-8f33-d92b70c36119.pdf

L'ordre est fixe lors du test de facteur unique, mais la synthèse multifactorielle nécessite de combiner des données complètement différentes et nécessite donc un traitement standardisé de tous les facteurs, généralement en supprimant les extrêmes et en supprimant les valeurs manquantes. Ici, nous utilisons la synthèse df_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

Résumé

L'article présente les méthodes de test de facteur unique et les tests de facteurs uniques courants, une introduction préliminaire à la méthode de synthèse de facteurs multiples, mais la recherche sur les facteurs multiples est très riche. Il est mentionné que chaque point peut être développé en profondeur.

L'adresse du site est:https://www.fmz.com/robot/486605


Relationnée

Plus de

Le chankingC'est très bien écrit.

Il est parti à Berlin.Je suis en train d'étudier ce sujet récemment.

Des nuages légersC'est fini. Je ne comprends pas du tout.

Cjz140Il y a des gens qui sont en train de se battre.

Je suis désolé.Il y a des gens qui sont en train de se battre.

Je suis désolé.Il y a des gens qui sont en train de se battre.

Je suis désolé.Il y a des gens qui sont en train de se battre.

F_qIl y a des gens qui sont en train de se battre.

Des étoiles.Il y a des gens qui sont en train de se battre.

Tututu001Il y a des gens qui sont en train de se battre.

Je suis désolée.Il y a des gens qui sont en train de se battre.