デジタル通貨の因数モデル

作者: リン・ハーン小草, 作成日:2022-09-27 16:10:28, 更新日:2023-09-15 20:58:26

[TOC]

img

因数モデルフレームワーク

株式市場の多因子モデルの研究報告は,スニーカーでいっぱいで,理論と実践が豊富である. デジタル通貨市場は,コインの数,総市場価値,取引額,衍生品市場などにかかわらず,因子研究を行うのに十分である. 本書は,主に定量化戦略の初心者向けで,複雑な数学原理と統計分析を巻き込まない. 通貨永続期貨市場のデータ源として,単純な因子研究の枠組みを構築し,因子指標を評価するのに便利である.

因子は指標として考えられ,表現として書ける.因子は変化し,将来の収益情報を反映する.通常,因子は投資論理を表す.

例えば:閉場価格接近という要因は,株価が将来の収益を予測できるという仮定の裏にある. 株価が高くなるほど将来の収益は高くなる (あるいは低くなるかもしれない). この要因に基づいてポートフォリオを構築することは,定期的に順番に高価格の株を購入する投資モデル/戦略である. 一般的には,継続的に余剰利益を生むことができる要因は,しばしばアルファと呼ばれる. 例えば,市場価値要因,動力要因など,学術界と投資界によって実証された有効な要因である.

株式市場もデジタル通貨市場も,複雑なシステムであり,将来の収益を完全に予測する要因はないが,一定の予測可能性はある.有効なアルファ (投資モデル) は,より多くの資金が投入されるにつれて徐々に失敗する.しかし,このプロセスは市場で他のモデルを生み出し,新しいアルファを生む.市場価値因子は,A株市場で非常に有効な戦略であった.単純に最低市場価値の10株を購入し,毎日一度調整し,2007年から10年もの間,400倍以上の収益を回転させ,はるかに超えた.しかし,大アルファ2017年の白馬株市場は,小市場要素の失敗を反映しており,価値因子が流行している.したがって,継続的な実験とアルファとの間の試行錯誤とバランスを必要としている.

探求する要因は戦略の構築の基礎であり,複数の関係のない有効な要因を組み合わせることで,比較的な戦略を構築することができる.

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

データ源

金安USDT永続期貨2022年初旬から現在までの時間K線データは,現在までに150以上の通貨を対象としています. 前述したように,因数モデルは,すべての通貨ではなく,特定の通貨を対象としたオプション通貨モデルです.K線データは,高低收益率,取引量,取引先数,主動購入量などのデータを含みます.これらのデータは,もちろん,すべての要因の源ではありません.例えば,米国株式指数,上昇率予想,収益力連鎖データ,ソーシャルメディアの熱さなど.冷たいデータソースは有効なアルファも発掘することができます.しかし,基本的な価格データも完全に十分です.

## 当前交易对
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 よりも大きい割合,年化因子回帰率,年化因子回帰波動率,因子回帰のシャープなどのパラメータを参照し,因子の有効性と波動性を参照する.複数の因子を一度に回帰することができる.具体的にはbarra 文書を参照する.

  • IC,IRなどの指標 ICとは,因数と次の期間の収益率の相関系数である.現在では,RANK_ICで,因数ランキングと次の期間の株式収益率の相関系数も一般化されている.IRは,一般的にIC配列の平均値/IC配列の標準差である.

  • 層回帰法 本文では,この方法を用いて,テストされる因子の順序に基づいて,コインをNグループに分け,再グループテストを行い,固定周期を用いて調停操作を行う.理想の場合,Nグループコインの利回りは単調性,単調増加または減少を示し,各グループの利回りの差が大きい.このような因子は,優れた区分を示します.最初のグループが最高利回り,最後のグループが最低利回りである場合,最初の組み合わせをして,最後の組み合わせを空にして,最終的に得られる利回り,シャープ比率の基準指標である.

実際の復習操作

因子から小から大に順序付けして待機コインを順序付けで3つのグループに分け,各組コインは約1/3で,因子1が有効であれば,各組分の少なめはしばしば収益率が高くなるが,また,各組コインの配分資金が比較的大きいことを意味している.もし空白が2倍になった場合,1つのグループと最後の10個のコインがそれぞれレバレッジされている場合,1つの比率は10%であり,空白の特定のコインが上昇した場合は2倍になった場合,20%が引き下げられる.相応の分数组が50である場合,20%が引き下げられる.4%の分散型コインはブラックバターリスクを減らすことができる.第1組は多値である (因子最小),空白の第3組はできる.因子が大きいほど収益が高くなる場合,空白の数を増やしたり,簡素な因子を単数または負数に変換したりする.

通常は,最終回測の利回率とシャープ比率によって,因子予測能力を概要的に評価することができる.さらに,因子表現が単純であるか,分群サイズに敏感でないか,調節間隔に敏感でないか,回測の初期時間に敏感でないかなど,参照が必要である.

調節頻度については,株式市場は5日,10日,1ヶ月という周期が多くあるが,デジタル通貨市場では,そのような周期は確かに長すぎており,実況はリアルタイムで監視されているため,特定の周期に固執して再調節する必要はない.したがって,実況では,我々はリアルタイムまたは短期周期調節である.

平成の方法については,従来の方法では,次回の順序付けはグループ外で平成できます.しかし,リアルタイム・平成の場合は,いくつかのコインが分岐点に正常に位置し,反転平成の状況が発生する可能性があります.したがって,この戦略は,グループ変化を待機して,方向転換のポジションが必要であれば再平成します.例えば,最初のグループが多ければ,多状態のコインが3番目のグループに分割された後に再平成します.固定平成周期がある場合,例えば毎日または8時間ごとに,グループ内でない方法も採用できます.複数の試みをすることができます.

#回测引擎
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に達している. これは,2つの因子が非常に近いことを示唆し,複素を合成する際に考慮する必要がある要因である.

3h動力因子: ((df_close - df_close.shift)) /df_close.shift ((3)) /df_close.shift ((3));すなわち因子の3時間上昇.回測の結果は,3時間の上昇が顕著な回転特性を示していることがわかります.つまり,上昇したものは,その後は減少することが容易です.全体的な表現は可能ですが,より長い回転と振動期もあります.

24h動力因数:24hの調停サイクルの結果も良好で,利益は3h動力に近いが,リグリットは小さい.

取引量の変化因子:df_volume.rolling ((24).mean ((96).mean ((),つまり,最近の1日間の取引量と最近の3日間の取引量との比率で,8時間ごとに調整する.回測結果はより良く,回撤は低い.これは,取引が活発であり,減少傾向があることを示唆する.

取引数の変化因数:df_count.rolling ((24).mean ((96).mean ((),つまり,最近の1日取引数と最近の3日取引数との比率,8hごとに調整.回計結果はより良く,回計は低い.これは,取引数が活発に増加するのではなく,減少傾向を示しています.

単一取引の価値の変化因数: - ((df_volume.rolling(24).mean() /df_count.rolling(24.mean()) /df_volume.rolling(24.mean() /df_count.rolling(96).mean()) この因子は,取引量因子と高度に関連している. この因子も,取引量因子と高度に関連している.

主動取引比率変動因子:df_buy_ratio.rolling ((24).mean (() /df_buy_ratio.rolling ((96).mean ((),つまり,最近の1日の主動購入量と総取引量の比率と,最近の3日の取引価値の比率,毎8hに1回.この因子はまだ表現されているが,取引量の因子とほとんど関係していない.

波動率因子: (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値は,複合因子の次の期間のIC値の推定として,複合因子の次の期間の波動率の推定として,複合因子の次の期間のIC値の対方差マトリックスを使用して,IC_IRがICの期待値に等しく,ICの標準差を除くと,最大化複合因子IC_IRの最優先重解が得られる.

主成分分析 (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草神武!