「個人の成長と富の自由、世界の運用の論理、AIの量的投資」に焦点を当てた100回目のオリジナル記事。
今日で100日目!週末を含めて100日連続で大丈夫です。1000日計画は非常に良いスタートを切っています。
プラネットメンバーグループには主に2種類のユーザーがいて、1つはエンジニアやアルゴリズムの専門家など、Pythonに精通しており、金融の定量化に関心があります.もう1つは、金融業界の実務家、プライベートエクイティ、ファンド、証券会社または銀行、調査および分析または資産運用自体を行う。共通点は、誰もが定量化に関心があるということです。
一般的な技術ルートの観点からは、AI の定量化は間違いなく正しい方向性であり、疑う必要はありませんが、それはまだその段階にあるということです。
第一に、量的な知識システム 入門から習熟まで体系的に進むには、より構造化された知識システムが必要です。もちろん、最終的な目標は、戦略を立てて確固たるオファーをすることです。1 つの目的に単純化したい場合は、誰もが同じです:持続可能な企業の提供戦略を作成する.
もちろん, 戦略は静的で 1 回限りのものではありません. それは反復的である必要があり, 市場自体とともに進化するシステムです. 永遠の聖杯はありません. これは金融と物理学の最大の違いです. . 物理法則はそこにあり、発見してもしなくても変わることはなく、発見されるのを待っているだけです。あまりにも多くの人が金融モデルを使用すると、抜け道がなくなり、人間性の狂気が重なってしまいます。
究極の戦略を生み出すことを期待するのではなく、「戦略工場」と「組み立てライン」が必要ですが、そんなものはありません。この戦略ファクトリーを構築し、qlib の AI 指向のフレームワークをバックトレーダーのイベント駆動型および実際の取引と統合し、さらに wxPython の GUI を統合しました。
昨日、機械学習を定量化に適用し、簡単なリストを作成しました: AI 定量化と機械学習プロセス: データからモデルへ. 今日も続けます。
01 データ準備パッケージ
csv と北極をカプセル化する前に、今日 hdf5 を追加しました。
# encoding:utf8 import datetime import pandas as pd class Hdf5DataFeed: def __init__(self, db_name='index.h5'): self.code_dfs = {} def get_df(self, code, db=None): if code in self. code_dfs.keys(): pd.HDFStore('../../data/hdf5/index.h5') をストアとする self.code_dfs[code] を返します : #print(store.keys()) df = store[コード] #print(df) df = df[['open','high','low','close','volume','code']] self.code_dfs[コード] = df return df def get_one_df_by_codes (自己、コード): dfs = [自己。コード内のコードの get_df(code) ] df_all = pd.連結 (dfs、軸 = 0) df_all.dropna(inplace=True) df_all.sort_index(inplace=True) df_all def get_returns_df(self、codes) を返す: df = self.get_one_df_by_codes(codes) all = pd.pivot_table(df, index='date', values= 'close', columns=['code']) returns_df = all.pct_change() returns_df.dropna(inplace=True) return returns_df def get_returns_df_ordered(self, codes): dfs = [] コード内のコード: df = self. get_df(code, cols=['close']) close = df['close'] close.name = code all = pd.concat(dfs, axis=1) dfs.追記(閉じる) returns_df = all.pct_change() returns_df.dropna(inplace=True) return returns_df if __name__ == '__main__': feed = Hdf5DataFeed() print(feed.get_df('SPX')) df = feed.get_one_df_by_codes(['000300 .SH','000905.SH','SPX']) print(df)
02 特徴エンジニアリング
特徴量エンジニアリングでは、「因子式」が推奨されます。
fields += [ "Std(Abs($close/Ref($close, 1)-1)*$volume, 30)/(Mean(Abs($close/Ref($close, 1)-1)*$volume) , 30)+1e-12)" ] 名前 += ['WVMA30']
因子式を使用すると、worldquant の alpha101 と同様に、複雑な数式を記述できます。自分でコーディングすると、効率が悪いだけでなく、エラーが発生しやすくなります。
import pandas as pd from engine.datafeed.expr.expr_mgr import ExprMgr class Dataloader: def __init__(self): self.expr = ExprMgr() def load(self、codes、names、fields): dfs = [] コード内のコードの場合: df = pd.DataFrame() の名前、zip 内のフィールド (names, fields): exp = self.expr.get_expression(field) se = exp.load(code) df[name] = se df['code'] = コード dfs.append(df) all = pd.concat(dfs) all.sort_index(ascending=True, inplace=True) all.dropna(inplace=True) return all __name__ == '__main__' の場合は: 名前 = [] フィールド = [] フィールド += ["($high-$low)/$open"] 名前 += ['KLEN'] フィールド += ["$close "] 名前 += ['close'] フィールド += ["$close/Ref($close,1) - 1"] 名前 += ['return_1'] フィールド += ["Ref($close,-1) /$close - 1"] names += ['label'] all = Dataloader().load(['SPX', '000300.SH'], names, fields) print(all)
完全なデータ機能エンジニアリングと自動ラベリング (ここでの因子式は qlib コードから独立しており、qlib データベースは使用せず、より単純な hdf5 を使用します)
03モデル
keras に基づいて深いモデルを構築します。
乱数をインポート np として numpy を インポート keras.layers から tf としてテンソルフローを インポート keras.models から Dense、Dropout を インポート keras.regularizers から Sequential をインポートkeras.optimizers から l1 を インポート sklearn.metrics から Adam を インポート Accuracy_score def set_seeds(seed=100): random.seed(シード) np.random.seed(シード) tf.random.set_seed(シード) set_seeds() オプティマイザ = Adam(learning_rate=0.0001) def create_model(hl=2, hu=128, dropout=False, rate= 0.3、 regularize=False、reg=l1(0.0005)、 optimizer=optimizer、input_dim=None): # input_dim = len(features) if not regularize: reg = なし model = Sequential() model.add(Dense(hu, input_dim=input_dim, activity_regularizer=reg, activation='relu')) ドロップアウトの場合: model.add(Dropout(rate, seed=100)) for _ in範囲(hl): model.add(Dense(hu、activation = 'relu'、 activity_regularizer = reg)) ドロップアウトの場合: model.add(Dropout(rate、seed = 100)) model.add(Dense(1、activation =) 'sigmoid')) model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy']) モデルを返す if __name__ == '__main__': set_seeds() モデル = create_model(hl=2, hu=64)
ここでのすべてのリンクは継続的に強化および最適化する必要がありますが、このフレームワークは徐々に安定します。
すべてのシステムのコードとデータについては、惑星にアクセスしてダウンロードしてください。