Last active
August 29, 2015 14:20
-
-
Save stockedge/0793d771b99bdc321cc5 to your computer and use it in GitHub Desktop.
Anticorアルゴリズムの解説
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#https://github.com/Marigold/universal-portfolios/blob/master/universal/algos/anticor.py | |
#ここから一部引用 | |
#時刻0からn-1までの全期間のポートフォリオの状態が計算される | |
def weights(self, X): | |
#期待値やラグ付き相関の計算で使うウィンドウのサイズ | |
window = self.window | |
#全銘柄の株価時系列データ(ただし前日比の相対価格データ) | |
port = X | |
#nは時系列の長さ。mは銘柄の数。 | |
n, m = port.shape | |
#時刻0からn-1までのポートフォリオの状態を表すn*mの行列。 | |
weights = 1. / m * np.ones(port.shape) | |
#各時点における株価リターンのラグ付き相関と期待値を計算する | |
CORR, EX = tools.rolling_corr(port, port.shift(window), window=window) | |
for t in range(n - 1): | |
#M[i, j]は時刻tにおける銘柄iと銘柄jのラグ付き相関を表す | |
M = CORR[t, :, :] | |
#mu[i]は時刻tにおける銘柄iのリターンの期待値を表す | |
mu = EX[t, :] | |
# claim[i,j]は銘柄iから銘柄jへの重みの移動を表す | |
claim = np.zeros((m, m)) | |
for i in range(m): | |
for j in range(m): | |
if i == j: continue | |
#銘柄jより銘柄iの方がリターンの期待値が大きく、銘柄iと銘柄jに正の相関がある場合 | |
if mu[i] > mu[j] and M[i, j] > 0: | |
#銘柄iと銘柄jの相関係数をclaimに足す | |
claim[i, j] += M[i, j] | |
#銘柄iに負の自己相関がある場合は、相関係数の絶対値をclaimに足す | |
if M[i, i] < 0: | |
claim[i, j] += abs(M[i, i]) | |
#銘柄jに負の自己相関がある場合は、相関係数の絶対値をclaimに足す | |
if M[j, j] < 0: | |
claim[i, j] += abs(M[j, j]) | |
#転移量を計算する | |
transfer = claim * 0. | |
for i in range(m): | |
total_claim = sum(claim[i, :]) | |
if total_claim != 0: | |
transfer[i, :] = weights[t, i] * claim[i, :] / total_claim | |
#時刻t+1におけるポートフォリオを計算する | |
weights[t + 1, :] = weights[t, :] + np.sum(transfer, axis=0) - np.sum(transfer, axis=1) | |
return weights |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment