Xử lý dữ liệu chứng khoán

  • Thread starter Thread starter ankiten
  • Ngày gửi Ngày gửi
Liên hệ QC

ankiten

Thành viên mới
Tham gia
4/1/09
Bài viết
17
Được thích
0
Mình đang làm 1 project về phân tích thị trường chứng khoán, trước tiên phải xử lý số liệu, chuyển dữ liệu hàng ngày sang tập hợp ngày theo từng mã chứng khoán. Mình viết code tạo marco để tự động chuyển nhưng k hiểu sao chạy k ra kết quả. Các bạn xem file check lại hộ mình nhé

Tiện thể, mở rộng ra, mình muốn sắp xếp các Mã bắt đầu bằng chữ A vào 1 sheet, tương tự mã bắt đầu bằng B, C ...vào 1 sheet khác, chữ cái nào ít mã có thể gộp chung 1 sheet cũng được. để tiện cho việc truy xuất dữ liệu sau này. Project chỉ mới bắt đầu, chắc phải còn nhở anh em GPE dài dài.%#^#$

Cố gắng giúp mình nhé, mới chập chững tạo Marco àh. Mong được chỉ giáo

không hiểu sao mình không tải file lên được, mình gửi file trực tiếp vào mail cho Thắng trước nhé
 
Chỉnh sửa lần cuối bởi điều hành viên:

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Code của bạn phải tinh lọc bỏ đi các đoạn mã thừa. Bạn nên nói rõ định làm thế nào chứ kiến thức chứng khoán bọn mình mù tịt, chẳng biết tham gia làm sao cả.
 
Upvote 0
Trước hết mình muốn lấy dữ liệu Price ở sheet HOSE-DATA điền vào sheet Beta-HOSE, theo ngày giao dịch và mã giao dịch, code mình viết k hiểu sao chạy k được
 
Upvote 0
Trước tiên mình sửa lại code của bạn như dưới đây

Trước hết mình muốn lấy dữ liệu Price ở sheet HOSE-DATA điền vào sheet Beta-HOSE, theo ngày giao dịch và mã giao dịch, code mình viết k hiểu sao chạy k được
Đoạn mã này cũng cho kết quả như macro của bạn
Vì chưa biết bạn chép dữ từ cột nào sang nên chưa hoàn thiện cho bạn

PHP:
Option Explicit
Sub BetaHOSE()
Dim i, j, x As Double, d1, d2, d3 As Double
Dim h, c As Double:                          Dim Rng As Range

ActiveSheet.Unprotect ("SGC123"):
Application.Calculation = xlCalculationManual
'-   -  -   -  -  Xoa du lieu trong Sheet "Beta HOSE"'
Sheets("Beta HOSE").Select
Range(Range("A2:A2000"), Range("F2:IV10000")).ClearContents
'-   -  -   -  -  Tim dong cuoi cua sheet HOSE-DATA'
 d2 = Sheets("HOSE-DATA").[A65500].End(xlUp).Row
'-   -  -   -  -  Copy ma CP tren san HOSE vao sheet Beta HOSE'
With Sheets("HOSE")
   Set Rng = .Range(.[d8], .[d8].End(xlDown))
End With
Sheets("Beta HOSE").[A4].Resize(Rng.Rows.Count).Value = Rng.Value
Rng.Copy
Sheets("Beta HOSE").[G2].PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
   False, Transpose:=True
'-----------dien du lieu ngay giao dich'
 i = d2:                                        j = 3
 Do
   With Sheets("HOSE-DATA").Cells(i, 2)
      If .Value <> .Offset(1).Value Then
         Sheets("Beta HOSE").Cells(j, 6) = .Value
         i = i - 1:                             j = j + 1
      Else
         i = i - 1
      End If
   End With
 Loop While i > 1
'----------dien gia tri giao dich cho tung ngay'
End Sub

C|D|E|F|G|
OPEN|HIGH|LOW|CLOSE| VOLUME
||:-=||--=0|

Bạn khẳng định là chép cột Volume, phải không?
 
Upvote 0
Cái này sao ko dùng Pivot cho đơn giản nhỉ. Tội gì phải viết code?!
To: SA_DQ
Phần "Điền dữ liệu ngày giao dịch" sao bác không dùng Advance Filter + Sort mà lại dùng Do... Loop?
 
Lần chỉnh sửa cuối:
Upvote 0
Macro hoàn chỉnh của bạn đây, xin mời!

PHP:
Option Explicit
Sub BetaHOSE()
Dim jJ As Double, d2 As Double
Dim Rng As Range, Clls As Range, Sh As Worksheet
Dim cRng As Range, Cll0 As Range, sRng As Range

ActiveSheet.Unprotect ("SGC123"):
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
'-   -  -   -  -  Xoa du lieu trong Sheet "Beta HOSE" '
Sheets("Beta HOSE").Select
Range(Range("A2:A2000"), Range("F2:IV10000")).ClearContents
'-   -  -   -  -  Tim dong cuoi cua sheet HOSE-DATA '
 d2 = Sheets("HOSE-DATA").[A65500].End(xlUp).Row
'-   -  -   -  -  Copy ma CP tren san HOSE vao sheet Beta HOSE '
With Sheets("HOSE")
   Set Rng = .Range(.[d8], .[d8].End(xlDown))
End With
[A4].Resize(Rng.Rows.Count).Value = Rng.Value
Rng.Copy
[G2].PasteSpecial Paste:=xlPasteAll, _
   Operation:=xlNone, SkipBlanks:=False, Transpose:=True
'-----------dien du lieu ngay giao dich '
 jJ = 3
 Do
   With Sheets("HOSE-DATA").Cells(d2, 2)
      If .Value <> .Offset(1).Value Then
         Sheets("Beta HOSE").Cells(jJ, 6) = .Value
         jJ = jJ + 1
      End If
      d2 = d2 - 1
   End With
 Loop While d2 > 1
'----------dien gia tri giao dich cho tung ngay '
Set Sh = Worksheets("HOSE-DATA")
Set Rng = Range([h2], [iV2].End(xlToLeft))
For Each Clls In Range([f3], [f3].End(xlDown))
   Sh.[I2].Value = Clls.Value
   Sh.Columns("A:G").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
        Sh.Range("I1:I2"), CopyToRange:=Sh.Range("K1:l1"), Unique:=False
   Set cRng = Sh.Range(Sh.[k1], Sh.[k1].End(xlDown))
   For Each Cll0 In Rng
      Set sRng = cRng.Find(Cll0.Value, , xlFormulas, xlWhole)
      If Not sRng Is Nothing Then
         Cells(Clls.Row, Cll0.Column).Value = sRng.Offset(, 1).Value
      End If
   Next Cll0
Next Clls
End Sub

To tác giả Topic: " Bạn sửa code lại gọn thật."
Để có thể được vậy, mình áp dụng nguyên tắc: Mọi cái đều phải tường minh;

Khai báo biến không bao giờ chỉ duy 1 ký tự; Các biến này phải làm ta gợi nhớ;
Dùng Rng, Clls, . . . . để khai báo biến đối tượng là vùng, ô dữ liệu;
Kiểu jJ, Zz, Rw, eRw ,lRw ,. . dùng cho vòng lặp khi duyệt theo hàng; Col, Cot, . . . để chỉ cho cột. . . .
Tuy là nhàm chán, nhưng hữu ích về thời gian,.. . .

HuuThang_BD đã viết:
Phần "Điền dữ liệu ngày giao dịch" sao bác không dùng Advance Filter + Sort mà lại dùng Do... Loop?
Mình thấy xài nó cũng chỉ tốn khoàng hơn 1 giây xíu nên để lại nguyên trạng cho tác giả phấn khích đó mà, khà,. . khà!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
PHP:
   Sh.Columns("A:G").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
        Sh.Range("I1:I2"), CopyToRange:=Sh.Range("K1:l1"), Unique:=False

Báo lỗi Run-time Error '1004' The extract range has a missing or illegal field name ở đoạn Code trên bạn ah
Check lại giùm minh nhé

Mình thấy xài nó cũng chỉ tốn khoàng hơn 1 giây xíu nên để lại nguyên trạng cho tác giả phấn khích đó mà, khà,. . khà!
Đúng là phấn khích thật, nhưng càng nhanh càng tốt bạn ơi %#^#$

From Sa_DQ
À đúng rồi, mình có thiết kế thêm vùng điều kiện & vùng để trích xuất ra mà quên đưa ffile lên;

Bạn đến bài trước lấy file chạy thử lần nữa xem nha!

(2) . . . . Bạn nhờ Hữu thắng BD đi, nha!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
(2) . . . . Bạn nhờ Hữu thắng BD đi, nha!
Thay đoạn code "Điền dữ liệu ngày giao dịch" bằng đoạn code sau"
PHP:
    Sheets("HOSE-DATA").Range(Sheets("HOSE-DATA").[B1], Sheets("HOSE-DATA").[B65536].End(xlUp)).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Sheets("Beta HOSE").[F2], Unique:=True
    With Sheets("Beta HOSE").Range(Sheets("Beta HOSE").[F2], Sheets("Beta HOSE").[F65536].End(xlUp))
        .Sort .Cells(1, 1), 2, Header:=xlYes
    End With
 
Upvote 0
Cảm ơn bạn SA_DQ, nhưng có 1 vấn đề nhỏ đó là dữ liệu của VNINDEX k được điền, bạn xem giải quyết luôn nhé. Mình cần dữ liệu VNINDEX để so sánh nên đưa nó ra phía trước đó.

Nếu mình muốn điền thêm dữ liệu ở cột CLOSE tương tự như với cột VOLUME cùng ở sheet Beta HOSE nhưng ở range bên cạnh range VOLUME thì code phải điều chỉnh như thế nào hả bạn. Tức là cung xuất dữ liệu ra hai vùng khác nhau, 1 vùng chứa dữ liệu Volume, 1 vùng chứa dữ liệu CLose trên cùng 1 sheet Beta HOSE
 
Lần chỉnh sửa cuối:
Upvote 0
(1) Còn vấn đề nhỏ đó là dữ liệu của VNINDEX k được điền, bạn xem giải quyết luôn nhé. Mình cần dữ liệu VNINDEX để so sánh nên đưa nó ra phía trước đó.

Bạn đổi dòng lệnh thành như thế này:

Set Rng = Range([G2], [iV2].End(xlToLeft))

Nếu mình muốn điền thêm dữ liệu ở cột CLOSE tương tự như với cột VOLUME cùng ở sheet Beta HOSE nhưng ở range bên cạnh range VOLUME thì code phải điều chỉnh như thế nào hả bạn. Tức là cung xuất dữ liệu ra hai vùng khác nhau, 1 vùng chứa dữ liệu Volume, 1 vùng chứa dữ liệu CLose trên cùng 1 sheet Beta HOSE

Đầu tiên của việc này, ngoài bộ khung đầu dòng & đầu cột của bảng dữ liệu, là ta phải rút trích dữ liệu theo từng ngày trong dòng lệnh sau:
PHP:
   Sh.Columns("A:G").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
        Sh.Range("I1:I2"), CopyToRange:=Sh.Range("K1:M1"), Unique:=False

Nhưng nếu chỉ thêm như vậy, sẽ bị báo lỗi như bạn đã gặp, mà ta phải bổ trợ bằng động tác chép chữ 'CLOSE' từ [F1] sang [M1] là được.
 
Upvote 0
Cảm ơn các bác, chương trình chạy ok cả rồi, nhưng tốc độ xử lý chậm lắmm máy e Core 2 Duo 2Ghz, 512RAM mà phải chạy hết gần 15s, nếu dữ liệu sau này càng nhiều thì chết. Còn thuật giải nào tối ưu hơn k ạh
 
Upvote 0
to bác ankiten:
+ Nếu để phân tích chứng khoán (theo cách giống như trong file của bác) thì có một cách đơn giản và hiệu quả hơn đó là sử dụng phần mềm phân tích chuyên nghiệp ngon hơn nhiều. VD phần mềm Spro của CTCK sme. Bác thử xem.
+ Còn nếu chỉ là nghiên cứu excel thì thanks bác vì tôi cũng học được một mớ :)
 
Upvote 0
Cảm ơn các bác, chương trình chạy ok cả rồi, nhưng tốc độ xử lý chậm lắmm máy e Core 2 Duo 2Ghz, 512RAM mà phải chạy hết gần 15s, nếu dữ liệu sau này càng nhiều thì chết. Còn thuật giải nào tối ưu hơn k ạh
Còn cách dùng Pivot như tôi đã nói từ bài trước. Bạn có thể tìm hiểu công cụ này. Ưu điểm của các công cụ có sẵn của Excel là xử lý rất nhanh.
 
Upvote 0
To huuthang_bd
Pivot đúng là nhanh thật, nhưng có cách nào để tự động cập nhật dữ liệu k vậy bác.Bởi vì dữ liệu cập nhật thường xuyên, cứ mỗi lần cập nhật dữ liệu lại phải chọn lại range cho Pivot àh

Theo mình biết Pivot có công cụ Refresh, có thể tạo marco để điều khiển được k
 
Lần chỉnh sửa cuối:
Upvote 0
To huuthang_bd
Pivot đúng là nhanh thật, nhưng có cách nào để tự động cập nhật dữ liệu k vậy bác.Bởi vì dữ liệu cập nhật thường xuyên, cứ mỗi lần cập nhật dữ liệu lại phải chọn lại range cho Pivot àh
Kết hợp với code cho nó Refresh tự động. Chẳng hạn như thế này:
PHP:
Private Sub Worksheet_Activate()
ActiveSheet.PivotTables("PivotTable1").PivotCache.Refresh
End Sub
 
Upvote 0
Nhanh hơn nhiều bác Thắng ạh. Cảm ơn bác nhé. Thừa thắng xông lên. Bây giwò e có vấn đề về nhập dữ liệu. Bác xem file rồi giúp e nhé

Ak, vẫn k tải được file lên là thế nào nhỉ. E lại gửi vào hòm thư của bác vậy. Xem giúp e nhé
 
Upvote 0
Nhanh hơn nhiều bác Thắng ạh. Cảm ơn bác nhé. Thừa thắng xông lên. Bây giwò e có vấn đề về nhập dữ liệu. Bác xem file rồi giúp e nhé

Ak, vẫn k tải được file lên là thế nào nhỉ. E lại gửi vào hòm thư của bác vậy. Xem giúp e nhé
Đây là file của bạn. Nhưng tôi thấy bạn bố trí dữ liệu sheet HOSE chưa hợp lý. Ví dụ như qua năm 2010 bạn sẽ chép dữ liệu các quí I, II, III, IV vào đâu? Không lẽ lại Insert cột? Bạn nên bố trí lại dữ liệu hợp lý hơn.
 

File đính kèm

Upvote 0
Đây là file của bạn. Nhưng tôi thấy bạn bố trí dữ liệu sheet HOSE chưa hợp lý. Ví dụ như qua năm 2010 bạn sẽ chép dữ liệu các quí I, II, III, IV vào đâu? Không lẽ lại Insert cột? Bạn nên bố trí lại dữ liệu hợp lý hơn.

Thực ra mình có làm sẵn đến năm 2015 luôn cơ,khỏi phải insert gì cả, nhưng lược bỏ bớt cho file nhẹ và đơn giản hơn thôi
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom