Hướng dẫn sử dụng Amibroker để tự lọc cổ phiếu

Phần mềm Amibroker

Hướng dẫn sử dụng Amibroker để tự lọc cổ phiếu một cách đơn giản và hiệu quả. Ngoài việc có thể theo dõi được giá cả được hiển thị dưới dạng biểu đồ thì Amibroker còn có chức năng rất hay là hỗ trợ cho nhà đầu tư rất nhiều khi có thể lọc ra một hoặc một vài cổ phiếu theo một bộ tiêu chí nào đó một cách nhanh chóng. Trong bài viết này Ecostock sẽ hướng dẫn bạn cách để tự xây dựng một bộ lọc cổ phiếu đơn giản.

Tuy nhiên, vấn đề đặt ra là nhà đầu tư có ý tưởng và muốn lọc cổ phiếu theo ý tưởng đó nhưng không biết làm sao. Trong bài viết này Ecostock sẽ chia sẻ với bạn một số hướng dẫn cơ bản để có thể tự code và xây dựng một bộ lọc cổ phiếu đơn giản theo ý muốn của mình.

Trước tiên để download và sử dụng phần mềm Amibroker miễn phí nhà đầu tư tham khảo bài trước: Hướng dẫn cài đặt và sử dụng trong phân tích kỹ thuật (Bản Full – 2022)
Sau đó để để có thể sử dụng phần mềm nhà đầu tư cần tải Data cho Amibroker theo hướng dẫn sau: Phần 2 Cách tải và cài đặt dữ liệu miễn phí từ Cafef 

Sau khi đã cài phần mềm và data cần thiết cho Amibroker trong bài viết này Ecostock sẽ hướng dẫn nhà đầu tư cách đọc hiểu code một cách đơn giản và dùng EXPLORE để lọc ra các cổ phiếu thỏa mãn một số tiêu chí mà bạn mong muốn.

Một số khái niệm cơ bản về AFL works trong Amibroker 

(Nếu bạn đã tìm hiểu về Amibroker trước đó và đã hiểu được cách Amibroker làm việc với dữ liệu và các kiến thức cơ bản về ngôn ngữ sử dụng trên AFL Formula thì có thể bỏ qua phần này và sang luôn phần 3 hướng dẫn sử dụng Explore)

Giới thiệu

Một trong những khía cạnh quan trọng nhất của AFL là nó là một ngôn ngữ xử lý mảng, nó hoạt động trên các mảng (hoặc hàng / vectơ) dữ liệu. Cách hoạt động này tương tự như cách hoạt động của các bảng tính phổ biến (như Microsoft Excel). Bất kỳ ai quen thuộc với MS Excel sẽ không gặp khó khăn khi làm việc trên AFL. Trên thực tế, tất cả các ví dụ trong bài viết này đều được tạo bằng MS Excel.

What is an Array?/Một dữ liệu mảng là gì?

Array là bảng/mảng được hiểu chỉ đơn giản là một danh sách (hoặc hàng) các giá trị. Trong một số tài liệu, nó có thể được gọi là vectơ. Mỗi hàng giá trị được đánh số trong ví dụ đại diện cho một mảng riêng lẻ. Amibroker đã lưu trữ trong cơ sở dữ liệu của mình 6 mảng cho mỗi ký hiệu.

Một giá khởi điểm (opening price), một cho giá thấp (low price), một cho giá cao (high price), một cho giá đóng cửa (closingprice ) và một cho khối lượng (volume) (xem các hàng có nhãn 1-5 bên dưới) và một cho mở mới (open interest). Chúng có thể được tham chiếu trong AFL như open, low, high, close, volume, openint or o, l, h, c, v, oi.

 Bar12345678910
1Open1.231.241.211.261.241.291.331.321.351.37

Ví dụ 1. Open price array ( Một dữ liệu mảng giá mở cửa)

Bất kỳ mảng nào khác được tính toán từ 6 mảng này bằng cách sử dụng các công thức được tích hợp trong AFL. Các mảng này không được lưu trữ trong cơ sở dữ liệu nhưng được tính toán khi cần thiết.

Mỗi giá trị riêng lẻ trong một mảng có một ngày tháng được liên kết với nó. Nếu bạn đã bật tùy chọn mẹo công cụ (Preferences -> Miscellaneous Tab – > Pricedata tool tips), khi bạn di chuyển con trỏ qua ngọn nến trên biểu đồ nến hàng ngày, một hình chữ nhật nhỏ màu vàng sẽ xuất hiện. Sau đó AFL tra cứu các giá trị open, low, high, close,volume values trong mảng thích hợp và hiển thị chúng bên trong đầu công cụ.

Processing arrays – why is AFL so fast?/Xử lý mảng – tại sao AFL lại nhanh như vậy?

Hãy xem cách câu lệnh sau được xử lý:

My Variable = ( High + Low )/2;

Khi AFL đang đánh giá câu lệnh như thế này My Variable = ( High + Low )/2, nó không cần phải diễn giải lại mã này cho mỗi thanh. Thay vào đó, nó lấy High ARRAY and Low ARRAY và thêm các phần tử mảng tương ứng trong một giai đoạn. Nói cách khác, toán tử (giá trị khác) hoạt động trên các mảng cùng một lúc và nó được thực thi ở tốc độ mã biên dịch đầy đủ, sau đó mảng kết quả (mỗi phần tử của nó) cũng được chia cho 2 cũng trong một giai đoạn duy nhất.

Chúng ta hãy xem xét chi tiết – ví dụ 2 .. Khi công cụ AFL xem xét My Variable = ( High + Low )/2 trước tiên nó lấy mảng High ARRAY (1) và Low ARRAY (2) và tạo ra mảng tạm thời (3). Sau đó, nó tạo mảng cuối cùng (4) bằng cách chia mỗi phần tử của mảng tạm thời cho hai. Kết quả này được gán cho my Variable.

 Bar12345678910
1High (built-in array)1.241.271.251.291.251.291.351.351.371.29
2Low (built-in array)1.201.211.191.201.211.241.301.281.311.27
3High+Low (temporary array created during evaluation)2.442.482.442.492.462.532.652.632.682.46
4( High+Low ) /2 (gets assigned to MyVariable)1.221.241.221.2451.231.2651.3251.3151.341.23

Ví dụ 2. AFL steps when processing ( High + Low ) /2

Moving averages, conditional statements/trình bình cộng và câu lệnh điều kiện

Chúng ta hãy xem xét đoạn mã sau:

Cond1 = Close > MA( Close, 3 );
Cond2 = Volume > Ref( Volume, -1 );
Buy = Cond1 AND Cond2;
Sell = High > 1.30;

Đoạn Code này tạo ra tín hiệu Buy/Mua khi giá đóng cửa ngày hôm qua cao hơn mức giá đóng cửa của trung bình 3 ngày trước đó And/VÀ khối lượng ngày hôm nay cao hơn khối lượng ngày hôm qua. Nó cũng tạo ra tín hiệu Sell/Bán khi mức High/Giá cao của ngày hôm nay cao hơn 1,30.

Nếu trong mã AFL của bạn, bạn cần xem liệu Giá đóng cửa (closing price) lớn hơn giá đóng cửa hay không thì AFL trung bình động đơn giản trong 3 ngày trước tiên sẽ chạy qua mảng đóng, tạo ra một mảng mới được gọi là MA(close,3) cho ký hiệu đang được phân tích. Sau đó, mỗi ô trong mảng mới có thể được so sánh từng ô với một trong mảng gần.

Trong ví dụ trên, một mảng có tên là Cond1 được tạo theo cách này. Đối với mỗi ô có giá đóng cửa lớn hơn giá trị ô tương ứng trong MA (Closer, 3), giá trị ô cho mảng mới ‘Cond1’ được đặt thành ‘1’. Nếu giá đóng cửa không lớn hơn giá tương ứng trong mảng đóng, giá trị trong ‘Cond1’ được đặt thành ‘0’.

 Day12345678910
1Open1.231.241.211.261.241.291.331.321.351.37
2High1.241.271.251.291.251.291.351.351.371.29
3Low1.201.211.191.201.211.241.301.281.311.27
4Close1.231.261.241.281.251.251.311.301.321.28
5Volume831030215325283414325666784755567493456
6Ref( Volume, -1 ) (temporary array created during eval)Null83103021532528341432566678475556749
7MA( Close, 3 ) (temporary array created during eval)NullNull1.2431.2601.2571.2601.2701.2871.3101.300
8Cond1 = Close < MA(close,3) (gives 1 (or true) if condition met, zero otherwise)NullNull10110001
9Cond2 = Volume > Ref(volume,-1)Null010011010
10Buy = Cond1 AND Cond2NullNull10010000
11Sell = High > 1.300000001110

Tương tự với cách tính toán như vậy Buy hay Sell là các mảng đặc biệt mà kết quả của nó có thể được hiển thị trong cửa sổ Trình phân tích hoặc trên màn hình bằng cách sử dụng giá trị hoặc màu đỏ hay xanh lá cây nếu cần.

Trên đây là cách giải thích và giới thiệu nguyên tắc tính toán và làm việc của AFL works trên Amibroker theo các hàm đơn giản nhất, ngoài ra có một số phần phức tạp hơn như:

  • SelectedValue, BeginValue, EndValue, LastValue
  • IIF function
  • AMA function
  • New looping

Các bạn có thể tìm hiểu thêm trong phần AmiBroker User’s Guide đều được lấy ví dụ và giải thích khá chi tiết và dễ hiểu.

Cách dùng Explore trên phầm mềm Amiboker:

“Explore this starts an exploration mode when AmiBroker scans through database to find symbols that match user-defined filter. The user can define output columns that show any kind of information required.”

Để dùng Explore bạn cần hiểu cấu trúc lệnh của Explore giống như sử dụng hàm trong excel vậy, trong Explore không dùng các dòng lệnh với Buy, Sell, Short hay Cover như lệnh Scan mà dùng Filter:

Filter = <điều kiện>;

<điều kiện> cũng là biểu thức lôgic.

Explorer đi kèm với tối thiểu 1 lệnh khai báo cột thông tin xuất ra và cho phép xuất ra các cột dữ liệu như ý muốn. Để xuất ra các cột thông tin, thường có thể dùng thêm các câu lệnh: AddColumn (được dùng xuất dữ liệu số) hoặc AddTextColumn (được dùng xuất dữ liệu chuỗi – text).

AddColumn(<Tên Dữ liệu>,<Tên cột>,<format>);
<Tên Dữ liệu> – Biến hoặc các biểu thức chứa dữ liệu dạng số muốn xuất ra.
<Tên cột> – Tiêu đề của cột sẽ được hiển thị.
<format> – dạng dữ liệu được xuất ra​

AddTextColumn(<Tên Dữ liệu>,<Tên cột>);

Hướng dẫn sử dụng Amibroker để tự lọc cổ phiếu

Bước1: Sau khi khởi chạy Amibroker bạn chọn:

Sửa chọn chỉnh sửa file AFL có sẵn

Analysis —-> New Analysis…

Sửa chọn chỉnh sửa file AFL có sẵn

Bước 2: Lên ý tưởng và Code các điều kiện cho bộ lọc:

Mình xây dựng trên một ý tưởng đơn giản là lọc toàn bộ các cổ phiếu trên thị trường có đường MA10 ngày cắt lên đường MA20 ngày và khối lượng giao dịch lớn hơn 50,000 cổ phiếu (mục đích để loại bỏ các cổ phiếu không có thanh khoản). Chúng ta sẽ có đoạn code sau:

Filter = Cross(MA(C, 10), MA(C,20)) AND V>50000; //duong trung binh MA10 cat len duong MA20//
AddColumn(C,”Gia today”); //them cot gia hien tai//
AddColumn(((C – Ref(C,-1))/Ref(C,-1))*100 ,”% Tang gia “); //them cot % tang gia hom nay//
AddColumn(C*V,”Gia tri GD “); //Gia tri giao dich hom nay//

Bạn có thể Copy –> Paste trực tiếp đoạn Code trên vào màn hình làm việc của AFL Formula Editor và Chọn Save bên góc Trái để lưu đoạn lệnh trên.

Hướng dẫn sử dụng Amibroker 1

Sau khi chọn Save bạn có thể tắt màn hình AFL Formula Editor và cài đặt một số thông số như sau:

Hướng dẫn sử dụng Amibroker 2

1- Bạn ấn vào biểu tượng để chọn cài đặt,

2 – Bạn chọn chu kỳ cho 1 đơn vị nến, thông thường là 1 ngày/Daily bạn có thể chọn chu kỳ là Weekly or Monthly nếu bạn muốn lọc cho mục tiêu dài hạn hơn.

3 – Chọn Long nếu bạn chỉ quan tâm đến tín hiệu Mua hoặc Long and Short cả Mua và bán.

Sau đó bạn ấn OK và tiếp tục chọn:

Trong mục Range chọn From-To-Dates và chọn khoảng thời gian bạn muốn lọc, sau đó chọn Explore:

và đây là kết quả.

Hướng dẫn sử dụng Amibroker để tự lọc cổ phiếu

Ngoài cách tự viết hoặc xây dựng một bộ lọc cổ phiếu đơn giản bạn có thể sử dụng các code hoặc bộ lọc có sẵn và tự điều chỉnh hoặc thêm các điều kiện theo ý bạn. Đây là cách nhanh và hiệu quả hơn là tự ngồi viết code 🙂
Mình có một vài code và bộ lọc bạn có thể tham khảo trong link sau: Code chia sẻ
Cách sử dụng khá đơn giản bạn chỉ cần tải về sau đó làm như bước 1 và chọn Open đến File vừa tải về sau đó tiếp tục các bước tiếp theo là được.

Nếu bạn gặp khó khăn trong quá trình tải hoặc cài đặt vui lòng liên hệ trực tiếp để được hỗ trợ miễn phí:
Văn Quyền – Phone: 090.334.8858 hoặc Email: quyennv@ssi.com.vn