SeanChenTaipei 2 years ago
parent d4432baf12
commit 769143c339
  1. 4
      main.py
  2. 3
      portfolio_builder.py
  3. 2
      sql_script/create_strategy.sql
  4. 6
      static/js/addStock.js
  5. 6
      templates/result.html
  6. 4
      templates/result_view.html
  7. 44
      templates/strategy_tw.html

@ -295,8 +295,8 @@ def buildPort():
# Opt Parameters # Opt Parameters
comp = request.form.get('comp') comp = request.form.get('comp')
# ts = int(request.form.get('ts')) ts = request.form.get('ts')
ts = datetime.now().strftime("%Y-%m-%d, %H:%M:%S") # ts = datetime.now().strftime("%Y-%m-%d, %H:%M:%S")
role = request.form.get('role') role = request.form.get('role')
lookback = int(request.form.get('lookback')) lookback = int(request.form.get('lookback'))
backtest = int(request.form.get('frequency')) backtest = int(request.form.get('frequency'))

@ -49,7 +49,7 @@ class MVO(object):
@staticmethod @staticmethod
def sharpe_ratio(w, ret): def sharpe_ratio(w, ret):
cov = np.cov(ret.T) cov = np.cov(ret.T)
print(cov.shape, w.shape) # print(cov.shape, w.shape)
retPort = ret@w # T-dimensional array retPort = ret@w # T-dimensional array
stdPort = np.std(retPort) stdPort = np.std(retPort)
return np.mean(retPort)/stdPort return np.mean(retPort)/stdPort
@ -138,7 +138,6 @@ class MVO(object):
result = minimize(loss, init, method="SLSQP",\ result = minimize(loss, init, method="SLSQP",\
options=opts, bounds=bnds, tol = None, jac = grad, constraints=cons) options=opts, bounds=bnds, tol = None, jac = grad, constraints=cons)
sol = result['x'] sol = result['x']
print(sol)
return np.round(sol, 2) return np.round(sol, 2)

@ -1,7 +1,7 @@
DROP TABLE IF EXISTS strategy; DROP TABLE IF EXISTS strategy;
CREATE TABLE strategy ( CREATE TABLE strategy (
id SERIAL PRIMARY KEY, id SERIAL PRIMARY KEY,
date VARCHAR(24) NOT NULL, date VARCHAR(64) NOT NULL,
name VARCHAR(32) NOT NULL, name VARCHAR(32) NOT NULL,
username VARCHAR(32) NOT NULL, username VARCHAR(32) NOT NULL,
competition VARCHAR(32) NOT NULL, competition VARCHAR(32) NOT NULL,

@ -100,7 +100,7 @@ $sendPort.click(function(event) {
method: 'POST', method: 'POST',
data: { data: {
name: $('input[name=portName]').val(), name: $('input[name=portName]').val(),
ts: Date.now(), ts: Date(Date.now()),
comp: $('#competition').val(), comp: $('#competition').val(),
lookback: $('#lookback').val(), lookback: $('#lookback').val(),
frequency: $('#opt-frequency').val(), frequency: $('#opt-frequency').val(),
@ -110,7 +110,7 @@ $sendPort.click(function(event) {
stockList: JSON.stringify(stockList) stockList: JSON.stringify(stockList)
}, },
success: function(response) { success: function(response) {
console.log(response); // console.log(response);
// var res = JSON.parse(response); // var res = JSON.parse(response);
event.preventDefault(); event.preventDefault();
// $('#modalTitle').text('完成建立') // $('#modalTitle').text('完成建立')
@ -151,7 +151,7 @@ $submitBtn.click(function(event) {
success: function(response) { success: function(response) {
$('#graph').html('') $('#graph').html('')
var graphs = JSON.parse(response); var graphs = JSON.parse(response);
console.log(graphs.data); // console.log(graphs.data);
Plotly.newPlot("graph", Plotly.newPlot("graph",
graphs.data, layout, {responsive: true}); graphs.data, layout, {responsive: true});
// console.log(response.layout); // console.log(response.layout);

@ -36,12 +36,8 @@
<div class="card m-3"> <div class="card m-3">
<div card="card p-3 m-3"> <div card="card p-3 m-3">
<div class="card-header"> <div class="card-header">
<div class="d-flex"> <div class="d-flex">
<div class="py-2 font-bold text-xl"> <div class="dropdown me-auto py-2">
<span class='m-2'>策略顯示</span>
</div>
<div class="dropdown ms-auto py-2">
<button class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false"> <button class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
排行方式 排行方式
</button> </button>

@ -71,12 +71,12 @@
</div> </div>
<div class="col-6"> <div class="col-6">
{% for a in data.assets %} {% for a in data.assets %}
<span class="badge text-bg-secondary">{{ a|safe }}</span> <span class="badge text-bg-warning">{{ a|safe }}</span>
{% endfor %} {% endfor %}
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<button class="btn btn-info mt-3" type="button" data-bs-toggle="collapse" data-bs-target="#collapse1" aria-expanded="false" aria-controls="collapseExample"> <button class="btn btn-secondary mt-3" type="button" data-bs-toggle="collapse" data-bs-target="#collapse1" aria-expanded="false" aria-controls="collapseExample">
詳細資訊 詳細資訊
</button> </button>
<div class="collapse" id="collapse1"> <div class="collapse" id="collapse1">

@ -47,33 +47,24 @@ div.card{
<h5 class="card-title text-xl font-bold accordion-header"> <h5 class="card-title text-xl font-bold accordion-header">
{% if session.tw == 1 %}台股{% endif %}投資組合建立指南 <i class="bi bi-caret-left-fill" style="animation: cursor 1s 3;"></i></h5> {% if session.tw == 1 %}台股{% endif %}投資組合建立指南 <i class="bi bi-caret-left-fill" style="animation: cursor 1s 3;"></i></h5>
<ol class="list-group list-group-flush list-group-numbered" id="collapseExample"> <ol class="list-group list-group-flush list-group-numbered" id="collapseExample">
<li class="list-group-item"><span class="ps-2">輸入投資組合名稱</span></li> <li class="list-group-item">
<li class="list-group-item"><span class="ps-2">選擇所參加的課程或競賽</span></li> <span class="ps-2">輸入投資組合名稱</span>
<li class="list-group-item"><span class="ps-2">選擇資產後按下<span class="badge bg-secondary">加入</span></span></li>
<li class="list-group-item"><span class="ps-2">確認資產後按下<span class="badge bg-info">確認資產</span>後, 查看資產價格動態圖表</span></li>
<li class="list-group-item"><span class="ps-2">選擇建立策略相關參數</span></li>
<li class="list-group-item"><span class="ps-2">確認後按下<span class="badge bg-danger">確認建立</span>後, 查看回傳訊息</span></li>
</ol>
</div>
</div>
<div class="card" id="buildName">
<div class="card-header font-bold text-lg">
投資組合名稱
</div>
<div class="card-body">
<input if="imput1" name="portName" type="text" class="form-control" placeholder="EX. 韓總 No.1" required> <input if="imput1" name="portName" type="text" class="form-control" placeholder="EX. 韓總 No.1" required>
</div> </li>
<div class="card-header font-bold text-lg"> <li class="list-group-item">
請選擇所參加的課程/競賽 <span class="ps-2">選擇所參加的課程或競賽</span>
</div>
<div class="card-body">
<select id="competition" class="form-select" size="1"> <select id="competition" class="form-select" size="1">
{% include 'competitions.html' %} {% include 'competitions.html' %}
</select> </select>
</li>
<li class="list-group-item"><span class="ps-2">選擇資產後按下<span class="badge bg-secondary">加入</span></span></li>
<li class="list-group-item"><span class="ps-2">確認資產後按下<span class="badge bg-info">確認資產</span> 查看資產價格動態圖表</span></li>
<li class="list-group-item"><span class="ps-2">選擇建立策略相關參數</span></li>
<li class="list-group-item"><span class="ps-2">確認後按下<span class="badge bg-danger">確認建立</span> 查看回傳訊息</span></li>
</ol>
</div> </div>
</div> </div>
<hr class="my-3">
<div class="card"> <div class="card">
@ -81,12 +72,6 @@ div.card{
<div class="py-2 font-bold text-lg"> <div class="py-2 font-bold text-lg">
已選擇的資產 已選擇的資產
</div> </div>
<div class="btn-group ms-auto">
<button type="button" class="btn btn-outline-primary btn-sm" id="submit-btn">
確認資產
</button>
</div>
</div> </div>
<div class="card-body d-flex mb-0"> <div class="card-body d-flex mb-0">
<input name="assetSelect" class="form-control" list="datalistOptions" id="stockAll" placeholder="輸入資產名稱..."> <input name="assetSelect" class="form-control" list="datalistOptions" id="stockAll" placeholder="輸入資產名稱...">
@ -120,6 +105,11 @@ div.card{
<div class="py-2 font-bold text-lg"> <div class="py-2 font-bold text-lg">
價格動態圖表 價格動態圖表
</div> </div>
<div class="btn-group ms-auto">
<button type="button" class="btn btn-outline-primary btn-sm" id="submit-btn">
確認資產
</button>
</div>
</div> </div>
<div class="card-body"> <div class="card-body">

Loading…
Cancel
Save