Skip to content

Instantly share code, notes, and snippets.

@stockedge
Last active August 29, 2015 14:20
Show Gist options
  • Save stockedge/0793d771b99bdc321cc5 to your computer and use it in GitHub Desktop.
Save stockedge/0793d771b99bdc321cc5 to your computer and use it in GitHub Desktop.
Anticorアルゴリズムの解説
#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