vsa / vn-stock-analysis-app /templates /covered_warrant.html
danghungithp's picture
Upload 1398 files
bec48e1 verified
{% 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 %}