A.PROGRAM

1.Import Library

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)

2.Membuat dan Mengakses Database Baru

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

3.Membuat tabel data baru dalam sebuah database

#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)
);
          ")

4. Memasukkan Data pada Masing-Masing Tabel Data yang telah Dibuat

#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);
            ")

5. Menampilkan Nilai Tabel Data Pada Database

###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)

6. Analisis Investor

###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)

7. Analisis Investasi

#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

8. Analisis Kinerja Portofolio

###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

STUDY KASUS

Topik:

Sistem Basis Data untuk Manajemen Investasi

Deskripsi:

Membuat sistem basis data untuk mengelola data investasi, termasuk data portofolio, transaksi, dan kinerja investasi.

1.Tabel yang Digunakan

A.Tabel Investor

  • ID Investor (sebagai PRIMARY KEY)
  • Nama
  • Email
  • Tanggal Registrasi
  • Risk Profile (Nilai: Konservatif, Moderat, Agresif)

B.Tabel Investasi

  • ID Investasi (sebagai PRIMARY KEY)
  • ID Investor (sebagai FOREIGN KEY)
  • Jenis Investasi (Nilai: Saham, Obligasi, Properti, Crypto)
  • Nama Investasi
  • Jumlah Awal Investasi

C.Tabel Portofolio

  • ID Portofolio (sebagai PRIMARY KEY)
  • ID Investor (sebagai FOREIGN KEY)
  • Nama Portofolio
  • Tanggal Dibuat

D.Tabel Transaksi

  • ID Transaksi (sebagai PRIMARY KEY)
  • ID Investasi (sebagai FOREIGN KEY)
  • Jenis Transaksi (Nilai: Pembelian, Penjualan, Dividen, Capital Gain)
  • Tanggal Transaksi
  • Jumlah Unit
  • Harga Per Unit
  • Total Nilai
  • Biaya Transaksi

E.Tabel Transaksi

  • ID Kinerja Portofolio (sebagai PRIMARY KEY)
  • ID Portofolio (sebagai FOREIGN KEY)
  • Tanggal Evaluasi
  • Nilai Awal
  • Nilai Sekarang
  • Return(%)
  • Volatilitas

2.Analisis Investor

A. Menghitung jumlah investor berdasarkan risk resiko

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.

B. Menghitung investor dengan total investasi tertinggi

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).

3.Analisis Investasi

Menghitung Total investasi per jenis investasi

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.

4. Analisis Kinerja Portofolio

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.