71 lines
2.0 KiB
Python
71 lines
2.0 KiB
Python
import streamlit as st
|
|
import numpy as np
|
|
import pandas as pd
|
|
|
|
st.set_page_config(page_title="Kennis - Institucional FX Markets", layout="wide")
|
|
|
|
st.title("Kennis - Institucional FX Markets")
|
|
st.markdown("### Bayesian Institutional FX Probability Engine")
|
|
|
|
def sigmoid(x):
|
|
return 1 / (1 + np.exp(-x))
|
|
|
|
def fit_bayesian_logit(X, y, prior_var=0.5):
|
|
n, p = X.shape
|
|
beta = np.zeros(p)
|
|
prior_prec = np.eye(p) / prior_var
|
|
|
|
for _ in range(100):
|
|
eta = X.dot(beta)
|
|
p_vec = sigmoid(eta)
|
|
W = p_vec * (1 - p_vec)
|
|
H = X.T.dot(W[:, None] * X) + prior_prec
|
|
grad = X.T.dot(y - p_vec) - prior_prec.dot(beta)
|
|
|
|
try:
|
|
delta = np.linalg.solve(H, grad)
|
|
except:
|
|
H += np.eye(p) * 1e-6
|
|
delta = np.linalg.solve(H, grad)
|
|
|
|
beta += delta
|
|
|
|
if np.linalg.norm(delta) < 1e-6:
|
|
break
|
|
|
|
cov = np.linalg.inv(H)
|
|
return beta, cov
|
|
|
|
st.sidebar.header("Input Variables")
|
|
|
|
cot_long = st.sidebar.number_input("COT Long", value=13662)
|
|
cot_short = st.sidebar.number_input("COT Short", value=13546)
|
|
fed_prob = st.sidebar.slider("Fed Hike Probability (%)", 0.0, 100.0, 96.0)
|
|
retail_pct = st.sidebar.slider("Retail Long (%)", 0.0, 100.0, 47.0)
|
|
|
|
net = cot_long - cot_short
|
|
z_net = net / 10000
|
|
sfed = (fed_prob - 50) / 50
|
|
sret = (retail_pct - 50) / 50
|
|
|
|
X_demo = np.random.randn(200, 3)
|
|
y_demo = (np.random.rand(200) > 0.5).astype(int)
|
|
|
|
beta_map, cov_post = fit_bayesian_logit(X_demo, y_demo)
|
|
|
|
x_live = np.array([z_net, sfed, sret])
|
|
samples = np.random.multivariate_normal(beta_map, cov_post, size=2000)
|
|
sample_probs = sigmoid(samples.dot(x_live))
|
|
|
|
p_mean = sample_probs.mean()
|
|
p_low = np.percentile(sample_probs, 2.5)
|
|
p_high = np.percentile(sample_probs, 97.5)
|
|
|
|
st.subheader("Posterior Probability USD/JPY Up")
|
|
|
|
st.metric("Mean Probability", f"{p_mean*100:.2f}%")
|
|
st.write(f"95% Credibility Interval: {p_low*100:.2f}% - {p_high*100:.2f}%")
|
|
|
|
st.markdown("---")
|
|
st.markdown("© Kennis - Institucional FX Markets")
|