Pengguna Mengimport library yang dibutuhkan untuk mengakses SQL pada server MySQL yang dimiliki
library(RMySQL)
## Warning: package 'RMySQL' was built under R version 4.4.3
## Loading required package: DBI
## Warning: package 'DBI' was built under R version 4.4.3
library(DBI)
Pengguna membuat sebuah database baru pada server yang telah dimasukkan
dbExecute(server, "CREATE DATABASE IF NOT EXISTS `InvestPorto`")
## [1] 1
dbExecute(server, "USE `InvestPorto`")
## [1] 0
#Tabel Investor
dbExecute(server, "
CREATE TABLE Investor (
ID_Investor VARCHAR(10) PRIMARY KEY,
Nama VARCHAR(100) NOT NULL,
Email VARCHAR(100) UNIQUE NOT NULL,
Tanggal_Registrasi DATE NOT NULL,
Risk_Profile ENUM('Konservatif', 'Moderat', 'Agresif') NOT NULL
);
")
#Tabel investasi
dbExecute(server, "
CREATE TABLE Investasi (
ID_Investasi VARCHAR(10) PRIMARY KEY,
ID_Investor VARCHAR(10) NOT NULL,
Jenis_Investasi ENUM('Saham', 'Obligasi', 'Properti', 'Crypto') NOT NULL,
Nama_Investasi VARCHAR(100) NOT NULL,
Jumlah_Awal DECIMAL(15,2) NOT NULL,
FOREIGN KEY (ID_Investor) REFERENCES Investor(ID_Investor)
);
")
#Tabel portofolio
dbExecute(server, "
CREATE TABLE Portofolio (
ID_Portofolio VARCHAR (10) PRIMARY KEY,
ID_Investor VARCHAR (10) NOT NULL,
Nama_Portofolio VARCHAR(100) NOT NULL,
Tanggal_Dibuat DATE NOT NULL,
FOREIGN KEY (ID_Investor) REFERENCES Investor(ID_Investor)
);
")
#Tabel transaksi
dbExecute(server, "
CREATE TABLE Transaksi (
ID_Transaksi VARCHAR(10) PRIMARY KEY,
ID_Investasi VARCHAR(10) NOT NULL,
Jenis_Transaksi ENUM('Pembelian', 'Penjualan', 'Dividen', 'Capital Gain') NOT NULL,
Tanggal_Transaksi DATE NOT NULL,
Jumlah_Unit DECIMAL(15,2) NOT NULL,
Harga_Per_Unit DECIMAL(15,2) NOT NULL,
Total_Nilai DECIMAL(15,2) NOT NULL,
Biaya_Transaksi DECIMAL(15,2) DEFAULT 0,
FOREIGN KEY (ID_Investasi) REFERENCES Investasi(ID_Investasi)
);
")
#Tabel kinerja portofolio
dbExecute(server, "
CREATE TABLE Kinerja_Portofolio (
ID_Kinerja VARCHAR(10) PRIMARY KEY,
ID_Portofolio VARCHAR(10) NOT NULL,
Tanggal_Evaluasi DATE NOT NULL,
Nilai_Awal DECIMAL(15,2) NOT NULL,
Nilai_Sekarang DECIMAL(15,2) NOT NULL,
Return_Persen DECIMAL(10,2) NOT NULL,
Volatilitas DECIMAL(10,2),
FOREIGN KEY (ID_Portofolio) REFERENCES Portofolio(ID_Portofolio)
);
")
#Tabel Investor
dbSendQuery(server, "INSERT INTO Investor (ID_Investor,Nama, Email, Tanggal_Registrasi, Risk_Profile) VALUES
('INV_0001','Budi Santoso', 'budi.santoso@gmail.com', '2023-01-15', 'Moderat'),
('INV_0002','Ani Wijaya', 'ani.wijaya@gmail.com', '2023-02-20', 'Konservatif'),
('INV_0003','Citra Dewi', 'citra.dewi@gmail.com', '2023-03-10', 'Agresif'),
('INV_0004', 'Firman Teno', 'firman@gmail.com', '2023-07-29', 'Agresif'),
('INV_0005', 'Fitri Sinta', 'fitri@gmail.com', '2023-11-03', 'Moderat'),
('INV_0006', 'Syifa Nurrisya', 'syifa@gmail.com', '2023-01-21', 'Konservatif'),
('INV_0007', 'Aslan Dikawan', 'Aslan@gmail.com', '2023-08-28', 'Agresif');
")
#Tabel Investasi
dbSendQuery(server, "
INSERT INTO investasi VALUES
('V001', 'INV_0001', 'Saham', 'PT Telkom Indonesia (TLKM)', 50000000.00),
('V002', 'INV_0001', 'Obligasi', 'Obligasi Negara Seri FR0075', 75000000.00),
('V003', 'INV_0002', 'Properti', 'Apartemen Green Park Jakarta', 350000000.00),
('V004', 'INV_0003', 'Crypto', 'Bitcoin (BTC)', 12000000.00),
('V005', 'INV_0003', 'Saham', 'PT Bank Central Asia (BBCA)', 45000000.00),
('V006', 'INV_0004', 'Obligasi', 'Obligasi Korporasi PT Astra', 60000000.00),
('V007', 'INV_0005', 'Crypto', 'Ethereum (ETH)', 8500000.00),
('V008', 'INV_0006', 'Properti', 'Ruko BSD City', 275000000.00),
('V009', 'INV_0006', 'Saham', 'PT Unilever Indonesia (UNVR)', 30000000.00),
('V010', 'INV_0007', 'Obligasi', 'Obligasi Negara Seri FR0080', 90000000.00),
('V011', 'INV_0002', 'Crypto', 'Cardano (ADA)', 15000000.00),
('V012', 'INV_0004', 'Saham', 'PT Bank Rakyat Indonesia (BBRI)', 40000000.00),
('V013', 'INV_0005', 'Properti', 'Tanah Kavling Bandung', 180000000.00),
('V014', 'INV_0007', 'Saham', 'PT GoTo Gojek Tokopedia (GOTO)', 35000000.00),
('V015', 'INV_0007', 'Crypto', 'Bitcoin (BTC)', 10000000.00);
")
#Tabel portofolio
dbSendQuery(server, "
INSERT INTO Portofolio VALUES
('P001', 'INV_0001', 'Portofolio Konservatif', '2023-01-15'),
('P002', 'INV_0001', 'Portofolio Pertumbuhan', '2023-03-22'),
('P003', 'INV_0002', 'Portofolio Pendapatan Tetap', '2023-02-10'),
('P004', 'INV_0003', 'Portofolio Agresif', '2023-04-05'),
('P005', 'INV_0004', 'Portofolio Balanced', '2023-01-30'),
('P006', 'INV_0005', 'Portofolio Saham Blue Chip', '2023-05-12'),
('P007', 'INV_0006', 'Portofolio Reksadana', '2023-06-18'),
('P008', 'INV_0007', 'Portofolio Internasional', '2023-03-01'),
('P009', 'INV_0002', 'Portofolio Emas', '2023-05-25'),
('P010', 'INV_0003', 'Portofolio Properti', '2023-02-14'),
('P011', 'INV_0005', 'Portofolio Teknologi', '2023-04-30'),
('P012', 'INV_0007', 'Portofolio Campuran', '2023-01-10');"
)
# Tabel transaksi
dbSendQuery(server, "
INSERT INTO Transaksi (ID_Transaksi, ID_Investasi, Jenis_Transaksi, Tanggal_Transaksi ,Jumlah_Unit, Harga_Per_Unit, Total_Nilai, Biaya_Transaksi) VALUES
('TRX001', 'V001', 'Pembelian', '2023-01-15', 100, 1500, 150000, 750),
('TRX002', 'V005', 'Penjualan', '2023-02-20', 50, 2000, 100000, 500),
('TRX003', 'V010', 'Dividen', '2023-03-10', 10, 500, 5000, 0),
('TRX004', 'V003', 'Capital Gain', '2023-04-05', 75, 1200, 90000, 450),
('TRX005', 'V007', 'Pembelian', '2023-05-12', 200, 800, 160000, 800),
('TRX006', 'V012', 'Penjualan', '2023-06-18', 30, 2500, 75000, 375),
('TRX007', 'V002', 'Dividen', '2023-07-22', 5, 300, 1500, 0),
('TRX008', 'V008', 'Capital Gain', '2023-08-30', 120, 950, 114000, 570),
('TRX009', 'V015', 'Pembelian', '2023-09-14', 150, 1700, 255000, 1275),
('TRX010', 'V004', 'Penjualan', '2023-10-25', 80, 1350, 108000, 540);
")
#Tabel kinerja portofolio
dbSendQuery(server,"
INSERT INTO Kinerja_Portofolio (ID_Kinerja, ID_Portofolio, Tanggal_Evaluasi, Nilai_Awal, Nilai_Sekarang, Return_Persen, Volatilitas) VALUES
('K1', 'P001', '2023-01-15', 1000000, 1050000, 5.0, 2.1),
('K2', 'P002', '2023-01-15', 2500000, 2450000, -2.0, 3.4),
('K3', 'P003', '2023-01-15', 500000, 520000, 4.0, 1.8),
('K4', 'P004', '2023-01-15', 750000, 780000, 4.0, 2.3),
('K5', 'P005', '2023-01-15', 3000000, 3150000, 5.0, 2.9),
('K6', 'P006', '2023-01-15', 1500000, 1470000, -2.0, 3.1),
('K7', 'P007', '2023-02-20', 1000000, 1080000, 8.0, 2.5),
('K8', 'P008', '2023-02-20', 1800000, 1764000, -2.0, 3.0),
('K9', 'P009', '2023-02-20', 2200000, 2332000, 6.0, 2.7),
('K10', 'P010', '2023-02-20', 950000, 1007000, 6.0, 2.4),
('K11', 'P011', '2023-02-20', 1300000, 1261000, -3.0, 3.2),
('K12', 'P012', '2023-02-20', 2750000, 2915000, 6.0, 3.3),
('K13', 'P001', '2023-03-25', 1050000, 1071000, 2.0, 2.0),
('K14', 'P002', '2023-03-25', 2450000, 2597000, 6.0, 3.3),
('K15', 'P003', '2023-03-25', 520000, 530400, 2.0, 1.9),
('K16', 'P004', '2023-03-25', 780000, 795600, 2.0, 2.2),
('K17', 'P005', '2023-03-25', 3150000, 3276000, 4.0, 2.8),
('K18', 'P006', '2023-03-25', 1470000, 1499400, 2.0, 3.0),
('K19', 'P007', '2023-04-30', 1080000, 1123200, 4.0, 2.4),
('K20', 'P008', '2023-04-30', 1764000, 1728720, -2.0, 2.9);
")
###Melihat nilai tabel data pada database
tampilkan.investor <- dbGetQuery(server,"
SELECT * FROM INVESTOR;
")
print(tampilkan.investor)
tampilkan.investasi <- dbGetQuery(server,"
SELECT * FROM INVESTASI;
")
print(tampilkan.investasi)
tampilkan.portofolio <- dbGetQuery(server,"
SELECT * FROM PORTOFOLIO;
")
print(tampilkan.portofolio)
tampilkan.transaksi <- dbGetQuery(server,"
SELECT * FROM TRANSAKSI;
")
print(tampilkan.transaksi)
tampilkan.kinerja_portofolio <- dbGetQuery(server,"
SELECT * FROM KINERJA_PORTOFOLIO;
")
print(tampilkan.kinerja_portofolio)
###Analisis Investor
#Menghitung jumlah investor berdasarkan risk resiko
jumlah_investor <- dbGetQuery(server, "
SELECT Risk_Profile, COUNT(*) AS Jumlah_Investor
FROM Investor
GROUP BY Risk_Profile;
")
jumlah_investor
#Menghitung investor dengan total investasi tertinggi
dbExecute(server, "ALTER TABLE Investor ADD COLUMN Total_Investasi DECIMAL(15,2) DEFAULT 0;")
dbExecute(server,"
UPDATE Investor I
SET Total_Investasi = (
SELECT COALESCE(SUM(ins. Jumlah_Awal), 0) FROM Investasi ins
where ins.ID_Investor = I.ID_Investor
) + (
SELECT COALESCE(SUM(
CASE
WHEN t.Jenis_Transaksi = 'Pembelian' THEN t.Total_Nilai
WHEN t.Jenis_Transaksi = 'Penjualan' THEN -t.Total_Nilai
ELSE 0
END
), 0)
FROM Transaksi t
JOIN Investasi ins ON t.ID_Investasi = ins.ID_Investasi
WHERE ins.ID_Investor = i.ID_Investor
);
")
investasi.tertinggi <- dbGetQuery(server, "
SELECT ID_Investor, Nama, Total_Investasi FROM Investor
ORDER BY Total_Investasi DESC
")
print(investasi.tertinggi)
#Total investasi per jenis investasi
dbExecute(server, "ALTER TABLE Investasi ADD COLUMN Total_Investasi DECIMAL(15,2) DEFAULT 0;")
dbExecute(server, "UPDATE Investasi inv
JOIN Investor I ON inv.ID_Investor = I.ID_Investor
SET inv.Total_Investasi = inv.Total_Investasi + I.Total_Investasi")
Total.investasi <- dbGetQuery(server, "
SELECT Jenis_Investasi, sum(Total_Investasi) as Total FROM Investasi
GROUP BY Jenis_Investasi
ORDER BY Total DESC
")
Total.investasi
###Analisis Kinerja Portofolio
kinerja.portofolio <- dbGetQuery(server, "
SELECT i.Nama, inv.Jenis_Investasi ,i.Total_Investasi,kp.Return_Persen, kp.Volatilitas FROM Kinerja_Portofolio kp
JOIN Portofolio p ON kp.ID_Portofolio = p.ID_Portofolio
JOIN Investor i ON p.ID_Investor = i.ID_Investor
JOIN Investasi inv on i.ID_Investor = inv.ID_Investor
")
kinerja.portofolio
Sistem Basis Data untuk Manajemen Investasi
Membuat sistem basis data untuk mengelola data investasi, termasuk data portofolio, transaksi, dan kinerja investasi.
Tujuan dari analisis ini ialah untuk melihat berapa jumlah investor yang dimiliki oleh perusahaan jika berdasarkan risk resiko yang diambil oleh Investor. Ini sangat berguna untuk menentukan saran investasi yang tepat untuk masing-masing investor berdasarkan risk resiko yang diambil.
Tujuan dari analisis ini ialah untuk menemukan investor dengan kontribusi modal terbesar yang mungkin memengaruhi strategi investasi, memahami hubungan antara besar investasi dan kinerja portofolio dari Investor, Mengantisipasi risiko jika investor dominan menarik dananya sekaligus (rush withdrawal), dan Data ini membantu tim marketing menyusun targeted campaign serta memberikan pelayanan premium pada high-net-worth individuals (HNWI).
Tujuan dari analisis ini yaitu
- Mengetahui distribusi dana investor di berbagai instrumen (saham,
obligasi, properti, crypto).
- Mengidentifikasi instrumen yang memberikan kontribusi terbesar
terhadap keuntungan/kerugian.
- Menentukan apakah perlu rebalancing (menyesuaikan alokasi).
- Memutuskan untuk menambah/mengurangi eksposur ke instrumen
tertentu.
Tujuan dari analisis ini yaitu mengukur keuntungan yang dihasilkan portofolio (baik absolut maupun relatif terhadap benchmark), memahami volatilitas dan potensi kerugian portofolio, menilai apakah portofolio mengungguli indeks pasar atau target investasi, dan menyesuaikan komposisi investasi (saham, obligasi, dll.) untuk meningkatkan return atau mengurangi risiko.