Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Добавено сравнение на доходността на произволно избрани фондове #5

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 106 additions & 0 deletions funds.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
11,Алфа Индекс Имоти,Alfa-Indeks-Imoti
12,Алфа SOFIX Индекс,Alfa-SOFIX-Indeks
41,Алфа Избрани Акции,Alfa-Izbrani-Akcii
89,Алфа Ликвидни Средства,Alfa-Likvidni-Sredstva
106,ДФ Аркус Балансиран,DF-Arkus-Balansiran
111,ДФ Аркус Динамичен,DF-Arkus-Dinamichen
54,ДФ Астра Кеш,DF-Astra-Kesh
79,ДФ Астра Комодити,DF-Astra-Komoditi
80,ДФ Астра Плюс,DF-Astra-Plyus
122,ДФ Астра Енерджи,DF-Astra-Enerdzhi
121,ДФ Астра Ценни Метали,DF-Astra-Cenni-Metali
34,ДФ Ди Ви Евробонд,DF-Di-Vi-Evrobond
36,ДФ Ди Ви Хармония,DF-Di-Vi-Harmoniya
37,ДФ Ди Ви Динамик,DF-Di-Vi-Dinamik
40,ДФ Ди Ви Съкровище,DF-Di-Vi-Sykrovishte
8,ДФ ДСК Стандарт,DF-DSK-Standart
9,ДФ ДСК Баланс,DF-DSK-Balans
10,ДФ ДСК Растеж,DF-DSK-Rastezh
67,ДФ ДСК Имоти,DF-DSK-Imoti
85,ДФ „ДСК Евро Актив”,DF-DSK-Evro-Aktiv
100,ДФ “ДСК СТАБИЛНОСТ - ЕВРОПЕЙСКИ АКЦИИ”,DF-DSK-STABILNOST-EVROPEYSKI-AKCII
107,ДФ “ДСК СТАБИЛНОСТ - НЕМСКИ АКЦИИ”,DF-DSK-STABILNOST-NEMSKI-AKCII
105,ДФ “ДСК ФОНД НА ПАРИЧНИЯ ПАЗАР ”,DF-DSK-FOND-NA-PARICHNIYA-PAZAR
108,ДФ “ДСК ФОНД НА ПАРИЧНИЯ ПАЗАР В ЕВРО ”,DF-DSK-FOND-NA-PARICHNIYA-PAZAR-V-EVRO
109,ДФ “ДСК АЛТЕРНАТИВА”,DF-DSK-ALTERNATIVA
135,ДФ „ДСК Глобални компании”,DF-DSK-Globalni-kompanii
82,ДФ Експат Имърджинг Маркетс Стокс,DF-Ekspat-Imyrdzhing-Markets-Stoks
83,ДФ Експат Глоубъл Екуитис,DF-Ekspat-Gloubyl-Ekuitis
90,ДФ Експат Бондс,DF-Ekspat-Bonds
17,ИД Елана Високодоходен Фонд,ID-Elana-Visokodohoden-Fond
15,ДФ Елана Балансиран Евро Фонд,DF-Elana-Balansiran-Evro-Fond
16,ДФ Елана Балансиран Долар Фонд,DF-Elana-Balansiran-Dolar-Fond
42,ДФ Елана Фонд Свободни пари,DF-Elana-Fond-Svobodni-pari
87,ДФ Елана Еврофонд,DF-Elana-Evrofond
95,ДФ Елана Глобален Фонд Акции,DF-Elana-Globalen-Fond-Akcii
131,ДФ Елана България,DF-Elana-Bylgariya
63,ДФ ЕФ Принсипал,DF-EF-Prinsipal
74,ДФ ЕФ Рапид,DF-EF-Rapid
18,ДФ Златен лев,DF-Zlaten-lev
65,ДФ Златен лев Индекс 30,DF-Zlaten-lev-Indeks-30
125,ДФ Глобал Опортюнитис,DF-Global-Oportyunitis
110,ДФ Инвест Фонд Паричен Пазар,DF-Invest-Fond-Parichen-Pazar
126,ДФ Инвест Фонд Паричен Пазар - Долари,DF-Invest-Fond-Parichen-Pazar-Dolari
72,ДФ Инвест Актив,DF-Invest-Aktiv
56,ДФ Инвест Класик,DF-Invest-Klasik
96,ДФ Капман Фикс,DF-Kapman-Fiks
19,ДФ Капман Капитал,DF-Kapman-Kapital
20,ДФ Капман Макс,DF-Kapman-Maks
132,ДФ С-МИКС,DF-S-MIKS
133,ДФ С-БОНДС,DF-S-BONDS
21,ДФ Адванс Инвест,DF-Advans-Invest
22,ДФ Адванс Източна Европа,DF-Advans-Iztochna-Evropa
46,ДФ Адванс Възможности в Нова Европа,DF-Advans-Vyzmozhnosti-v-Nova-Evropa
101,ДФ Адванс Глобал Трендс,DF-Advans-Global-Trends
104,ДФ Адванс Консервативен Фонд,DF-Advans-Konservativen-Fond
119,ДФ КОМПАС ГЛОБЪЛ ТРЕНДС,DF-KOMPAS-GLOBYL-TRENDS
61,ДФ КОМПАС ЕВРОСТАБИЛНОСТ,DF-KOMPAS-EVROSTABILNOST
60,ДФ КОМПАС СТРАТЕГИЯ,DF-KOMPAS-STRATEGIYA
62,ДФ КОМПАС ПРОГРЕС,DF-KOMPAS-PROGRES
1,ДФ Конкорд Фонд-1 Акции и Облигации,DF-Konkord-Fond-1-Akcii-i-Obligacii
2,ДФ Конкорд Фонд-2 Акции,DF-Konkord-Fond-2-Akcii
4,ДФ Конкорд Фонд-3 Сектор Недвижими Имоти,DF-Konkord-Fond-3-Sektor-Nedvizhimi-Imoti
51,ДФ Конкорд Фонд-4 Енергетика,DF-Konkord-Fond-4-Energetika
66,ДФ Конкорд Фонд-5 ЦИЕ,DF-Konkord-Fond-5-CIE
57,ДФ Конкорд Фонд-6 Паричен,DF-Konkord-Fond-6-Parichen
30,ДФ Стандарт Инв. Високодоходен Фонд,DF-Standart-Inv-Visokodohoden-Fond
29,ДФ Стандарт Инв. Балансиран Фонд,DF-Standart-Inv-Balansiran-Fond
31,ДФ Стандарт Инв. Международен Фонд,DF-Standart-Inv-Mezhdunaroden-Fond
26,ДФ ОББ Платинум Облигации,DF-OBB-Platinum-Obligacii
27,ДФ ОББ Балансиран Фонд,DF-OBB-Balansiran-Fond
28,ДФ ОББ Премиум Акции,DF-OBB-Premium-Akcii
84,ДФ ОББ Патримониум Земя,DF-OBB-Patrimonium-Zemya
98,ДФ ОББ Глобал Фарм Инвест,DF-OBB-Global-Farm-Invest
99,ДФ ОББ Евро Пари,DF-OBB-Evro-Pari
127,ОББ Глобал Детски Фонд,OBB-Global-Detski-Fond
129,ОББ Глобал Растеж,OBB-Global-Rastezh
130,ОББ Глобал Дивидент,OBB-Global-Divident
43,ДФ "ПИБ- Авангард",DF-PIB-Avangard
45,ДФ "ПИБ- Класик",DF-PIB-Klasik
44,ДФ "ПИБ- Гарант",DF-PIB-Garant
94,ДФ ПФБК ВОСТОК,DF-PFBK-VOSTOK
47,Райфайзен Консервативен Фонд (България),Rayfayzen-Konservativen-Fond-Bylgariya
3,Райфайзен "България" фонд Глобален Растеж,Rayfayzen-Bylgariya-fond-Globalen-Rastezh
91,Райфайзен (България) Активна Защита,Rayfayzen-Bylgariya-Aktivna-Zashtita
128,ДФ "Райфайзен (България) Глобален Микс",DF-Rayfayzen-Bylgariya-Globalen-Miks
23,ДФ „Селект Облигации“,DF-Selekt-Obligacii
24,ДФ „Селект Баланс“,DF-Selekt-Balans
25,ДФ „Селект Регионал“,DF-Selekt-Regional
102,ДФ „Селект Дивидент“,DF-Selekt-Divident
32,СКАЙ Нови Акции,SKAY-Novi-Akcii
33,СКАЙ Финанси,SKAY-Finansi
97,СКАЙ Глобал ETFs,SKAY-Global-ETFs
48,ДФ Профит,DF-Profit
49,ДФ Престиж,DF-Prestizh
5,ДФ Тексим Парични Пазари,DF-Teksim-Parichni-Pazari
6,ДФ Тексим България,DF-Teksim-Bylgariya
39,ДФ Тексим Балкани,DF-Teksim-Balkani
59,ДФ Тексим Комодити Стратеджи,DF-Teksim-Komoditi-Stratedzhi
78,Тренд Балансиран Фонд,Trend-Balansiran-Fond
81,Тренд Фонд Акции,Trend-Fond-Akcii
103,Тренд Фонд Паричен Пазар,Trend-Fond-Parichen-Pazar
55,ЦКБ Лидер,CKB-Lider
75,ЦКБ Актив,CKB-Aktiv
76,ЦКБ Гарант,CKB-Garant
116,ДФ Юг Маркет Максимум,DF-YUg-Market-Maksimum
117,ДФ "Юг Маркет Оптимум",DF-YUg-Market-Optimum
53 changes: 53 additions & 0 deletions list-funds.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# coding=utf-8
# generates funds.csv, website/funds.json from baud.bg

from lxml import html
import requests
page = requests.get('http://baud.bg/quotes/')
tree = html.fromstring(page.content)

def translate(bg):
unchanged = u'- '
cyr = u"абвгдезийклмнопрстуфхъц"
cyr += cyr.upper()
lat = u"abvgdeziyklmnoprstufhyc"
lat += lat.upper()
complex_map = {u'ю': 'yu', u'я': 'ya', u'ж': 'zh', u'ш': u'sh', u'щ': 'sht', u'ц': 'ts', u'ч': 'ch'}
for k in list(complex_map.keys()):
complex_map[k.upper()] = complex_map[k].upper()
res = ''
# print cyr
for l in bg:
if l in unchanged or re.search('[-a-z0-9]', l ,re.IGNORECASE):
res += l
else:
# print l, cyr.find(l)
try:
res += lat[cyr.index(l)]
except:
if l in complex_map:
res += complex_map[l]
# print res
return res

import re

to_json = []
comma_sep = u''
for t in tree.xpath('..//div[@class="fond_div"]/a'):
fund_id = (re.search('fond=([0-9]+)', t.attrib['href']).group(1)).strip()
bg_name = t.text_content().strip()
if not bg_name: continue
lat_name = translate(bg_name).strip().replace(' ', '-')
lat_name = re.sub('--+', '-', lat_name)

print fund_id, bg_name, lat_name
comma_sep += fund_id + ',' + bg_name + ',' + lat_name + '\n'
to_json.append((fund_id, bg_name, lat_name))
with open('funds.csv', 'wb') as f:
f.write(comma_sep.encode("UTF-8"))

import json
with open('website/funds.json', 'w') as f:
json.dump(to_json, f)
print 'wrote funds.csv, website/funds.json'
60 changes: 48 additions & 12 deletions src/main/java/com/idzona/baud/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,13 @@
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
Expand All @@ -28,11 +31,18 @@ public class Main {
private Main() {}

public static void main(String... args) {
int fundId;
String arg;

System.out.println("start");
Main main = new Main();

if (args.length == 0) {
main.loadFunds();
} else {
//TODO: funds.csv should be updated in cron by "python list-funds.py"
System.out.println("Funds are loaded from ./funds.csv now, no id supported");
}
System.exit(0);
String arg;

if(args.length <= 0) {
System.out.print("Enter mutual fund ID: ");
Scanner sc = new Scanner(System.in);
Expand All @@ -47,9 +57,14 @@ public static void main(String... args) {
System.exit(0);
}

// Parse the fund ID. Use '10' as default value.
main.loadFund(arg, arg);
}

private void loadFund(String id, String fundPrefix) {
int fundId;
// Parse the fund ID. Use '10' as default value.
try {
fundId = Integer.parseInt(arg);
fundId = Integer.parseInt(id);
if(fundId < 0) {
throw new NumberFormatException();
}
Expand All @@ -59,10 +74,30 @@ public static void main(String... args) {
}

// Main processing.
main.process(fundId);
}

private void process(int fundId) {
process(fundId, fundPrefix);
}

private void loadFunds() {
try {
InputStreamReader r = new InputStreamReader(new FileInputStream("funds.csv"));
BufferedReader br = new BufferedReader(r);
String line = null;
int i = 0;
while (null != (line = br.readLine())) {
String[] parts = line.split(",");
System.out.println(String.join(" --- ", parts));
loadFund(parts[0], parts[2]);
//if (++i == 3)
// break;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

private void process(int fundId, String fundPrefix) {
File xlsFile = downloadFund(fundId);

if(xlsFile == null) {
Expand Down Expand Up @@ -90,12 +125,13 @@ private void process(int fundId) {
}

// Export daily.
exportDailyCsv("daily.csv", baudEntries);
String prefix = "website/data/" + fundPrefix;
exportDailyCsv(prefix + "-daily.csv", baudEntries);

// Export weekly.
Set<BaudEntryPeriod> periodBauds = generateWeekPeriods(baudEntries);
exportBaudPeriodsCsv("weekly.csv", periodBauds);
exportBaudPeriodsJs("weekly.js", periodBauds, baudData.getFundId());
exportBaudPeriodsCsv(prefix + "-weekly.csv", periodBauds);
exportBaudPeriodsJs(prefix + ".js", periodBauds, baudData.getFundId());
}

private void test() {
Expand Down
106 changes: 106 additions & 0 deletions website/compare.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
<html>
<head>
<meta charset="UTF-8"></meta>
<title>Сравняване на фондове</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="js/main.js"></script>
<link rel="stylesheet" type="text/css" href="css/main.css"></link>
<link rel="icon" type="image/png" href="img/favicon.png"></link>
<script src="http://cdn.plot.ly/plotly-latest.min.js"></script>
<script type='text/javascript'>

function scale_trace(arr, factor) {
for (var i = 0; i < arr.length; ++i)
arr[i] *= factor
return arr
}

function binarySearch(array, target) {
var startIndex = 0,
stopIndex = array.length - 1,
middle;

while (startIndex < stopIndex) {
middle = ~~((stopIndex + startIndex) / 2);

// adjust search area
if (target < array[middle]) {
stopIndex = middle - 1;
} else if (target > array[middle]) {
startIndex = middle + 1;
} else {
break; // target is found (or list is exausted)
}
}
return middle;
}

function date_align(traces, date) {
var scales = traces.map(function(tr){return tr.y[binarySearch(tr.x, date)]})
console.log('scales ' + scales)
traces.forEach(function(tr,i){
scale_trace(tr.y, 1./scales[i])
})
return traces
}

function align_chart() {
var chart = jQuery('#chart2')[0];
if (chart.data.length > 1) {
var normalized_traces = date_align(chart.data, chart.data[0].x[0])
//Plotly.update(chart, normalized_traces)
Plotly.newPlot(chart, normalized_traces)
}
}

function fundsLoaded(funds) {
//console.log(funds)
var fundsel = jQuery("#fundselect")//.append($('<option>').text('Изберете фонд'));
for (var i = 0, n = funds.length; i < n; ++i) {
//console.log(funds[i]);
fundsel.append(jQuery("<option>", {value: funds[i][0], lname: funds[i][2]}).text(funds[i][1]));

}
fundsel.on('change',
function(){
var opt = fundsel[0].options[fundsel[0].selectedIndex];
var fund = opt.getAttribute('lname');
console.log('changed ' + fund);
//document.location.href = dir ? "#"+dir : 'index.html';
//load();
add_trace('data/'+ fund + '-weekly.csv', opt.textContent)
});
}

function loadFunds() {
jQuery.ajax({url: 'funds.json', success: fundsLoaded, beforeSend: override_json})
var chart = document.getElementById('chart2')
Plotly.newPlot(chart, [])
$("#clear").click(function(){Plotly.newPlot(chart, [])});
}
$(loadFunds)

</script>
</head>
<body>
<div id="all">
<div id="topnav2" style='text-align: center'>
Фонд: <select id=fundselect></select>
<button id=clear>Изчисти</button>
<a href=index.html>Дялове</a>
<div id="contact">
За контакти: <a target="_blank" href="http://linkedin.com/in/ivandavidov" class="link">Иван Давидов</a>
</div>
</div>
<div id=chart2 style='width:90%; height:90%'></div>
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-97069664-1', 'auto');
ga('send', 'pageview');
</script>
</body>
</html>
Loading