Факторная модель цифровой валюты

Автор:Трава, Создано: 2022-09-27 16:10:28, Обновлено: 2023-09-15 20:58:26

[TOC]

img

Фреймворк факторной модели

Исследование многофакторной модели фондовых рынков насыщено теорией и практикой. Рынок цифровых денег, независимо от количества монет, общей рыночной стоимости, объема сделок, рынка производных товаров и т. Д., Достаточно для проведения факторного исследования.

Факторы могут рассматриваться как показатели, которые могут быть написаны как выражения, которые постоянно меняются, отражая информацию о будущих доходах, и обычно представляют собой логику инвестирования.

Например: фактор закрытия цены, предположение которого состоит в том, что цена акций может предсказывать будущую прибыль, и чем выше цена акций, тем выше будущая прибыль (и, возможно, и ниже), и построение портфеля по этому фактору - это фактически инвестиционная модель / стратегия регулярного поворота покупки высокооцененных акций. Обычно те факторы, которые могут постоянно приносить избыточную прибыль, также часто называются альфами. Например, факторы рыночной стоимости, динамики и т. д. были проверены академическими и инвестиционными кругами как факторы, которые когда-то были эффективными.

Как рынок акций, так и рынок цифровых валют - это сложная система, и никакие факторы не могут полностью предсказывать будущие доходы, но все же имеют определенную предсказуемость. Эффективная альфа (инвестиционная модель) и постепенно выходит из строя с вложением большего количества капитала. Но этот процесс приведет к появлению других моделей на рынке, что приведет к появлению новых альф. Фактор стоимости был очень эффективной стратегией на рынке акций А. Было очень эффективной стратегией просто купить 10 акций с наименьшей рыночной стоимостью, корректировать один раз в день, и получить более чем 400-кратный доход, выигрыш которого значительно превышает диапазон, начиная с десятилетия 2007 года.

Поисковые факторы служат основой для создания стратегии, которая может быть лучше построена путем сочетания нескольких не связанных эффективных факторов.

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

Источник данных

К-линейные данные за час с начала 2022 года по сегодняшний день, на сегодняшний день, насчитывают более 150 валют. Ранее говорилось, что факторная модель - это модель валют, ориентированная на все валюты, а не на одну валюту. К-линейные данные содержат данные о высоких и низких доходах, объемах сделок, количестве сделок, активных покупках и т. д., которые, конечно, не являются источником всех факторов, таких как индекс американских акций, ожидания повышения процентной ставки, данные о прибыльности на цепочке, теплота социальных медиа и т. д.

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

Выйти:

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

Выйти:

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)

Выйти:

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

Для начала мы извлекаем из данных K-линии интересующие нас данные: цены закрытия, цены открытия, объемы сделок, количество сделок, процент активных покупок, и на основе этих данных обрабатываем необходимые факторы.

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

В целом, показатели рынка выглядят довольно мрачно, снизившись на 60% с начала года.

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

img

Определение эффективности фактора

  • Закон регрессии В следующем этапе коэффициент доходности используется как факторная переменная, фактор, подлежащий тестированию, как собственная переменная, возвращаемый коэффициент - это коэффициент доходности. После построения уравнения возвращения обычно ссылаются на абсолютную среднюю стоимость t-значения коэффициента, долю последовательности абсолютных значений t-значения коэффициента, превышающую 2, параметры эффективности и волатильности фактора, такие как годовой коэффициент доходности, годовой коэффициент волатильности доходности, коэффициент Sharpe доходности коэффициента.

  • ИК, IR и другие показатели Так называемый IC - это коэффициент, связанный между фактором и следующим периодом доходности, и теперь обычно используется RANK_IC, то есть коэффициент, связанный между фактором рейтинга и следующим периодом доходности акций. IR - это, как правило, среднее значение последовательности IC / стандартное отклонение последовательности IC.

  • Складное регрессирование В данной статье мы будем использовать такой метод: разделить монеты на N групп в зависимости от порядка факторов, подлежащих тестированию, провести регруппировку и использовать фиксированные циклы для размещения. В идеале, доходность N групп будет лучше однообразной, однообразно возрастать или уменьшаться, и у каждой группы будет больший разрыв в доходах. Такой фактор представляет собой лучшее различие. Если первая группа приносит наибольшую прибыль, последняя группа приносит наименьшую прибыль, то сделать первую комбинацию и сделать более пустую последнюю комбинацию, и в конечном итоге полученный показатель - показатель прибыли, коэффициент Шарпа.

Фактическая обратная проверка

По факторам от малого до большого, выделяем выбранные монеты в 3 группы по порядку, каждая группа монет составляет примерно 1/3, если один фактор действителен, то меньшее количество каждой группы часто имеет более высокую доходность, но это также означает, что распределение средств для каждой монеты относительно большое. Если больше свобод, то при увеличении рычага в два раза, а первая и последняя группы - в 10 монет, то соотношение составляет 10%, если одна свободная монета выросла в два раза, то 20%; если соответствующая группа монет имеет число 50, то обратный ход.

Обычно способность коэффициентного прогнозирования оценивается в общих чертах по конечным результатам ретроспекции, а также по Sharpe's ratio. Кроме того, необходимо учитывать простоту выражения фактора, нечувствительность к размеру группировки, нечувствительность к интервалу диспозиции, нечувствительность к времени начала ретроспекции и т. д.

Что касается частоты корректировки, то фондовые рынки часто циклизируются на 5 дней, 10 дней и месяц, но для цифровых валютных рынков такие циклы, безусловно, слишком длинные, и рынок в реальном времени контролируется в режиме реального времени, поэтому нет необходимости в повторном корректировке в определенном цикле, поэтому в реальном режиме мы торгуем в режиме реального времени или краткосрочным цикле корректировки.

Относительно того, как выравнивать позиции, традиционным способом можно выравнивать позиции вне группы при следующем сортировании; однако в случае реального времени, некоторые валюты могут находиться в пределах разделения, и возникает ситуация обратного выравнивания. Поэтому эта стратегия использует ожидание изменения группы, когда нужно перевернуть позиции, например, первая группа, а затем, когда валюты, находящиеся в состоянии множественного количества, распределяются в третью группу.

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

Простой факторный тест

Факторы объема торговли: монеты с низким объемом торговли, а также монеты с высоким объемом торговли, которые имеют очень хорошие результаты, указывают на то, что популярные монеты склонны к снижению.

Факторы цены сделки: большая цена на низкую валюту, высокая цена на низкую валюту, эффект в целом.

Факторы числа сделок: показатели и количество сделок очень похожи; можно четко заметить, что корреляция между факторами числа сделок и фактором числа сделок очень высока, и это действительно так, их средняя корреляция между различными валютами достигает 0,97, что говорит о том, что эти два фактора очень близки, и этот фактор необходимо учитывать при синтезе полифактора.

3h мониторный фактор: ((df_close - df_close.shift)) 3)) /df_close.shift ((3)); т.е. 3-часовой рост фактора, результаты ретро-тестирования показывают, что 3-часовой рост имеет явные регрессивные свойства, то есть повышенный впоследствии легче падает.

24h мощностный коэффициент: результаты 24h цикла корректировки позиций хороши, прибыль близка к 3h мощностному коэффициенту, а откат меньше.

Коэффициент изменения объема торгов:df_volume.rolling ((24).mean (() /df_volume.rolling ((96).mean ((), то есть соотношение объема торгов за последний день к объему торгов за последние 3 дня, корректировка торгов каждые 8 ч. Результаты обратного анализа продемонстрировали себя лучше, а обратный откат также был ниже, что говорит о том, что активные сделки скорее склонны к падению.

Коэффициент изменения числа сделок:df_count.rolling ((24).mean (() /df_count.rolling ((96).mean ((), т.е. соотношение числа сделок за последний день к количеству сделок за последние 3 дня, корректировка раз в 8 ч.

Факторы изменения стоимости одной сделки: - ((df_volume.rolling(24).mean()/df_count.rolling(24.mean())/(df_volume.rolling(24.mean()/df_count.rolling ((96).mean()) Это соотношение стоимости сделок за последний день к стоимости сделок за последние 3 дня, раз в 8 часов. Этот фактор также высоко связан с фактором объема сделок.

Фактор изменения активного соотношения сделок:df_buy_ratio.rolling ((24).mean (() /df_buy_ratio.rolling ((96).mean ((), то есть соотношение количества активных покупок за последний день к общему количеству сделок к соотношению стоимости сделок за последние 3 дня, один раз в 8 ч.

Коэффициент волатильности: ((df_close/df_open).rolling ((24)).std ((), который имеет определенный эффект, делая валюту с малой волатильностью.

Отношение между объемом сделок и ценой закрытия:df_close.rolling ((96).corr ((df_volume), в последние 4 дня цена закрытия имеет отношение к объему сделок, в целом она хорошо работает.

Перечисленные здесь лишь некоторые факторы, основанные на количественной цене, но на самом деле комбинации факторных формул могут быть очень сложными и не иметь очевидной логики; можно ссылаться на известный способ построения фактора ALPHA101: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

Полифакторный синтез

Постоянное выявление новых эффективных факторов является наиболее важной частью процесса построения стратегии, но без хорошего метода синтеза факторов хорошие отдельные альфа-факторы не смогут играть наибольшую роль.

Закон равновесия: все веса и т.д. для синтеза добавляются, чтобы получить новый постсинтезный фактор.

Взвешивание исторической коэффициентной доходности: все факторы, которые должны быть синтезированы, добавляются в качестве весов по среднему математическому значению исторической коэффициентной доходности за последний период, чтобы получить новый коэффициент после синтеза.

Максимизация IC_IR с добавлением веса: максимальное преимущественное переосмысление максимального комплексного фактора IC_IR может быть получено, если IC_IR равен ожидаемому значению IC, деленному на стандартный отклонение IC.

Анализ основных компонентов (PCA) метод: PCA является распространенным методом демиссионирования данных, где корреляция между факторами может быть относительно высокой, используя основные компоненты после демиссионирования в качестве фактора после синтеза.

В данной статье мы рассмотрим методы ручного упоминания фактора эффективности.ae933a8c-5a94-4d92-8f33-d92b70c36119.pdf

При тестировании однофактора порядок является фиксированным, но многофакторный синтез требует объединения совершенно разных данных, поэтому требуется стандартизированное обращение со всеми факторами, обычно также требуется удаление предельных и недостающих значений. Здесь мы используем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

Подведение итогов

В статье представлены методы тестирования однофактора и проверены распространенные однофакторы, предварительно представлены методы синтеза многофактора, но многофакторные исследования очень богаты. В статье упоминается о том, что каждый из пунктов может быть углубленно развернут.

Адрес на сайте:https://www.fmz.com/robot/486605


Связанные

Больше

Чанкинг.Очень хорошо написано.

Прохожий БернЯ работаю над этим и недавно.

Легкие облака.Я не понимаю. Я не понимаю.

cjz140"Стреляй, бог травы!"

jmxjqr0302"Стреляй, бог травы!"

jmxjqr0302"Стреляй, бог травы!"

jmxjqr0302"Стреляй, бог травы!"

f_q"Стреляй, бог травы!"

Огромное множество молнии."Стреляй, бог травы!"

Тутуту001"Стреляй, бог травы!"

Кунфэн91"Стреляй, бог травы!"