Spaces:
Runtime error
Runtime error
{% extends 'base.html' %} | |
{% block content %} | |
<h2>Định giá Chứng quyền (Covered Warrant)</h2> | |
<div class="row"> | |
<div class="col-md-6"> | |
<h4>Tìm kiếm thông tin chứng quyền</h4> | |
<form method="get" class="form-inline mb-4"> | |
<div class="form-group"> | |
<label for="warrant_code" class="sr-only">Mã chứng quyền</label> | |
<input type="text" class="form-control" id="warrant_code" name="warrant_code" placeholder="Nhập mã chứng quyền (VD: CMWG2401)" value="{{ warrant_code or '' }}"> | |
</div> | |
<button type="submit" class="btn btn-info ml-2">Tìm kiếm</button> | |
</form> | |
{% if warrant_info %} | |
<h4>Thông tin chứng quyền: {{ warrant_code }}</h4> | |
<table class="table table-sm table-bordered"> | |
<tbody> | |
{% for key, value in warrant_info.items() %} | |
<tr> | |
<th>{{ key }}</th> | |
<td>{{ value }}</td> | |
</tr> | |
{% endfor %} | |
</tbody> | |
</table> | |
{% elif warrant_code %} | |
<div class="alert alert-warning">Không tìm thấy thông tin cho mã chứng quyền '{{ warrant_code }}'.</div> | |
{% endif %} | |
</div> | |
<div class="col-md-6"> | |
<h4>Công cụ Định giá Chứng quyền</h4> | |
<form method="post"> | |
<div class="form-row"> | |
<div class="form-group col-md-6"> | |
<label for="stock_price">Giá CK cơ sở (S)</label> | |
<input type="number" step="any" class="form-control" id="stock_price" name="stock_price" required value="{{ form_data.stock_price or '' }}"> | |
</div> | |
<div class="form-group col-md-6"> | |
<label for="strike_price">Giá thực hiện (X)</label> | |
<input type="number" step="any" class="form-control" id="strike_price" name="strike_price" required value="{{ form_data.strike_price or '' }}"> | |
</div> | |
</div> | |
<div class="form-row"> | |
<div class="form-group col-md-6"> | |
<label for="warrant_price">Giá chứng quyền (Price)</label> | |
<input type="number" step="any" class="form-control" id="warrant_price" name="warrant_price" required value="{{ form_data.warrant_price or '' }}"> | |
</div> | |
<div class="form-group col-md-6"> | |
<label for="conversion_ratio">Tỷ lệ chuyển đổi (N)</label> | |
<input type="number" step="any" class="form-control" id="conversion_ratio" name="conversion_ratio" required value="{{ form_data.conversion_ratio or '' }}"> | |
</div> | |
</div> | |
<hr> | |
<h6>Thông số mô hình Black-Scholes</h6> | |
<div class="form-row"> | |
<div class="form-group col-md-6"> | |
<label for="time_to_expiration">Thời gian đáo hạn (năm)</label> | |
<input type="number" step="any" class="form-control" id="time_to_expiration" name="time_to_expiration" required value="{{ form_data.time_to_expiration or '' }}"> | |
</div> | |
<div class="form-group col-md-6"> | |
<label for="volatility">Độ biến động (thường niên)</label> | |
<input type="number" step="any" class="form-control" id="volatility" name="volatility" required value="{{ form_data.volatility or '' }}"> | |
</div> | |
</div> | |
<p class="text-muted small">Lãi suất phi rủi ro được giả định là 5%.</p> | |
<button type="submit" class="btn btn-primary btn-block">Tính toán Định giá</button> | |
</form> | |
</div> | |
</div> | |
{% if calculation_results is not none %} | |
<div class="mt-4"> | |
<h3>Kết quả Phân tích Chứng quyền</h3> | |
<div class="card"> | |
<div class="card-header"> | |
Định giá cho {{ warrant_code or 'Chứng quyền' }} | |
</div> | |
<div class="card-body"> | |
<div class="row"> | |
<!-- Cột Định giá Black-Scholes --> | |
<div class="col-md-6"> | |
<h5 class="card-title">Định giá Lý thuyết (Black-Scholes)</h5> | |
<p>Giá trị lý thuyết của chứng quyền: | |
<strong style="font-size: 1.3em; color: #17a2b8;"> | |
{{ calculation_results.theoretical_price | round(2) }} | |
</strong> | |
</p> | |
<p>Giá thị trường hiện tại: | |
<strong>{{ form_data.warrant_price }}</strong> | |
</p> | |
{% if calculation_results.is_overvalued %} | |
<div class="alert alert-danger"> | |
<h6 class="alert-heading">Định giá cao hơn lý thuyết!</h6> | |
<p>Giá thị trường cao hơn giá trị lý thuyết khoảng <strong>{{ calculation_results.valuation_diff | round(2) }}</strong> ({{ (calculation_results.valuation_diff / calculation_results.theoretical_price * 100) | round(2) }}%). Cân nhắc rủi ro khi mua.</p> | |
</div> | |
{% else %} | |
<div class="alert alert-success"> | |
<h6 class="alert-heading">Định giá thấp hơn lý thuyết!</h6> | |
<p>Giá thị trường thấp hơn giá trị lý thuyết khoảng <strong>{{ (calculation_results.valuation_diff * -1) | round(2) }}</strong> ({{ (calculation_results.valuation_diff * -1 / calculation_results.theoretical_price * 100) | round(2) }}%). Có thể là cơ hội đầu tư.</p> | |
</div> | |
{% endif %} | |
</div> | |
<!-- Cột Phân tích Lãi/Lỗ --> | |
<div class="col-md-6"> | |
<h5 class="card-title">Phân tích Lãi/Lỗ & Hòa vốn</h5> | |
<p>Lãi/Lỗ (nếu thực hiện ngay): | |
<strong style="font-size: 1.2em; color: {% if calculation_results.profit > 0 %}#28a745{% else %}#dc3545{% endif %};"> | |
{{ calculation_results.profit | round(2) }} | |
</strong> | |
</p> | |
<p>Giá CK cơ sở để hòa vốn: | |
<strong style="font-size: 1.2em; color: #007bff;"> | |
{{ calculation_results.break_even_price | round(2) }} | |
</strong> | |
</p> | |
<p class="text-muted small">Để hòa vốn, giá cổ phiếu cơ sở cần đạt mức <strong>{{ calculation_results.break_even_price | round(2) }}</strong>. Mọi mức giá cao hơn sẽ tạo ra lợi nhuận.</p> | |
</div> | |
</div> | |
<hr> | |
<h5 class="card-title mt-3">Các tham số đã sử dụng</h5> | |
<ul> | |
<li><strong>Giá CK cơ sở (S):</strong> {{ form_data.stock_price }}</li> | |
<li><strong>Giá thực hiện (X):</strong> {{ form_data.strike_price }}</li> | |
<li><strong>Giá chứng quyền (Price):</strong> {{ form_data.warrant_price }}</li> | |
<li><strong>Tỷ lệ chuyển đổi (N):</strong> {{ form_data.conversion_ratio }}</li> | |
<li><strong>Thời gian đáo hạn (T):</strong> {{ form_data.time_to_expiration }} năm</li> | |
<li><strong>Độ biến động (v):</strong> {{ form_data.volatility }}</li> | |
<li><strong>Lãi suất phi rủi ro (r):</strong> 5%</li> | |
</ul> | |
</div> | |
</div> | |
</div> | |
{% endif %} | |
<script> | |
document.addEventListener('DOMContentLoaded', function() { | |
try { | |
const warrantInfoJSON = '{{ warrant_info | tojson | safe if warrant_info is not none else "{}" }}'; | |
const warrantInfo = JSON.parse(warrantInfoJSON); | |
if (Object.keys(warrantInfo).length > 0) { | |
const mapping = { | |
'Giá thực hiện': 'strike_price', | |
'Tỷ lệ chuyển đổi': 'conversion_ratio', | |
'Giá trị CW (đồng)': 'warrant_price', | |
'Giá CK cơ sở': 'stock_price', | |
'Ngày đáo hạn': null, | |
'Mã CK cơ sở': null | |
}; | |
for (const [key, value] of Object.entries(warrantInfo)) { | |
const trimmedKey = key.trim(); | |
const formId = mapping[trimmedKey]; | |
if (formId) { | |
const inputElement = document.getElementById(formId); | |
if (inputElement) { | |
const numericValue = parseFloat(String(value).replace(/,/g, '')); | |
if (!isNaN(numericValue)) { | |
inputElement.value = numericValue; | |
} | |
} | |
} | |
} | |
} | |
} catch (e) { | |
console.error("Error parsing warrantInfo JSON or processing data:", e); | |
} | |
}); | |
</script> | |
{% endblock %} | |