change only backtesting>=1

master
joseph 2 years ago
parent 493dd6f89f
commit e943d6c918
  1. 27
      portfolio_builder.py
  2. 4
      static/js/addStock.js
  3. 3
      templates/strategy_tw.html

@ -104,24 +104,39 @@ class MVO(object):
n = ret.shape[1] n = ret.shape[1]
init=np.ones(n)/n init=np.ones(n)/n
if role=="max_sharpe": if role=="max_sharpe":
cov=np.cov(ret.T) if n==1:
cov=np.array(np.cov(ret.T))
else:
cov=np.cov(ret.T)
loss = lambda w: -cls.sharpe_ratio(w, ret) loss = lambda w: -cls.sharpe_ratio(w, ret)
grad = lambda w: -cls.sharpe_grad(w, ret, cov) grad = lambda w: -cls.sharpe_grad(w, ret, cov)
elif role=="max_sortino": elif role=="max_sortino":
cov = np.cov(np.maximum(ret, 0).T) if n==1:
cov = np.cov(np.maximum(ret, 0).T)
else:
cov = np.array(np.cov(np.maximum(ret, 0).T))
loss = lambda w: -cls.sortino_ratio(w, ret) loss = lambda w: -cls.sortino_ratio(w, ret)
grad = lambda w: -cls.sortino_grad(w, ret, cov) grad = lambda w: -cls.sortino_grad(w, ret, cov)
elif role=="min_volatility": elif role=="min_volatility":
cov=np.cov(ret.T) if n==1:
cov=np.array(np.cov(ret.T))
else:
cov=np.cov(ret.T)
loss = lambda w: cls.volatility(w, ret) loss = lambda w: cls.volatility(w, ret)
grad = lambda w: cls.volatility_grad(w, ret, cov) grad = lambda w: cls.volatility_grad(w, ret, cov)
elif role=="quadratic_utility": elif role=="quadratic_utility":
cov=np.cov(ret.T) if n==1:
cov=np.array(np.cov(ret.T))
else:
cov=np.cov(ret.T)
loss = lambda w: -cls.quadratic_utility(w, ret, gamma) loss = lambda w: -cls.quadratic_utility(w, ret, gamma)
grad = lambda w: -cls.quadratic_utility_grad(w, ret, cov, gamma) grad = lambda w: -cls.quadratic_utility_grad(w, ret, cov, gamma)
else: else:
return init return init
bnds = [[0, 0.6] for i in range(n)] if n==1:
bnds = [[0,1]]
else:
bnds = [[0, 0.6] for i in range(n)]
opts = {'maxiter': 1000, 'disp': False} opts = {'maxiter': 1000, 'disp': False}
cons = ({'type': 'eq', 'fun': lambda w: np.sum(w) - 1}) cons = ({'type': 'eq', 'fun': lambda w: np.sum(w) - 1})
result = minimize(loss, init, method="SLSQP",\ result = minimize(loss, init, method="SLSQP",\
@ -140,4 +155,4 @@ class MVO(object):

@ -81,7 +81,7 @@ $addStockBtn.click(function(event) {
// Event listener for submit button click // Event listener for submit button click
$submitPort.click(function(event) { $submitPort.click(function(event) {
event.preventDefault(); event.preventDefault();
if (stockList.length > 1){ if (stockList.length >= 1){
$('#portModal').modal('show'); $('#portModal').modal('show');
// console.log('asset confirm'); // console.log('asset confirm');
// $(this).prop('disabled', true); // $(this).prop('disabled', true);
@ -89,7 +89,7 @@ $submitPort.click(function(event) {
}); });
// Event listener for submit button click // Event listener for submit button click
$sendPort.click(function(event) { $sendPort.click(function(event) {
if (stockList.length > 1){ if (stockList.length >= 1){
// $('#confirmMes').replaceWith("<span>投資組合已開始建立,請等待完成訊息,或1分鐘後至分析結果區查看!</span>") // $('#confirmMes').replaceWith("<span>投資組合已開始建立,請等待完成訊息,或1分鐘後至分析結果區查看!</span>")
// $('#confirmModal').modal('show'); // $('#confirmModal').modal('show');
$submitPort.prop('disabled', true); $submitPort.prop('disabled', true);

@ -47,7 +47,6 @@ div.card{
<div class="alert alert-dark m-0" role="alert"> <div class="alert alert-dark m-0" role="alert">
<ul class="fa-ul"> <ul class="fa-ul">
<li><span class="fa-li"><i class="fa-solid fa-scroll"></i></span>兩次建立投資組合時間需大於60秒。</li> <li><span class="fa-li"><i class="fa-solid fa-scroll"></i></span>兩次建立投資組合時間需大於60秒。</li>
<li><span class="fa-li"><i class="fa-solid fa-scroll"></i></span>資產數量大於1檔才會開始建立投資組合。</li>
<li><span class="fa-li"><i class="fa-solid fa-scroll"></i></span>未輸入投資組合名稱則會由系統隨機生成。</li> <li><span class="fa-li"><i class="fa-solid fa-scroll"></i></span>未輸入投資組合名稱則會由系統隨機生成。</li>
</ul> </ul>
@ -256,4 +255,4 @@ div.card{
{% endfor %} {% endfor %}
dlist.innerHTML = str; dlist.innerHTML = str;
</script> </script>
{% endblock script %} {% endblock script %}

Loading…
Cancel
Save