
Chuỗi thời gian là chuỗi dữ liệu thu được ở những khoảng thời gian liên tiếp cách đều nhau. Trong đầu tư định lượng, những dữ liệu này chủ yếu được thể hiện dưới dạng chuyển động của giá cả và các điểm dữ liệu của các mục tiêu đầu tư đang được theo dõi. Ví dụ, giá cổ phiếu, dữ liệu chuỗi thời gian được ghi lại thường xuyên trong một khoảng thời gian cụ thể có thể được xem trong hình sau, giúp người đọc hiểu rõ hơn:

Như bạn có thể thấy, ngày nằm trên trục x và giá nằm trên trục y. Trong trường hợp này, “khoảng thời gian liên tiếp” có nghĩa là các ngày trên trục x cách nhau 14 ngày: Lưu ý sự khác biệt giữa ngày 7 tháng 3 năm 2005 và điểm tiếp theo, ngày 31 tháng 3 năm 2005 và ngày 5 tháng 4 năm 2005 và ngày 19 tháng 4 năm 2005.
Tuy nhiên, khi làm việc với dữ liệu chuỗi thời gian, bạn thường sẽ thấy nhiều dữ liệu hơn là chỉ có cột ngày và giá. Hầu hết thời gian bạn sẽ làm việc với dữ liệu bao gồm năm cột: Giai đoạn dữ liệu, Mở, Cao, Thấp và Đóng. Điều này có nghĩa là nếu chu kỳ dữ liệu của bạn được thiết lập ở mức hàng ngày, thì những thay đổi về giá cao, giá mở cửa, giá thấp và giá đóng cửa trong ngày sẽ được phản ánh trong dữ liệu của chuỗi thời gian này.
Dữ liệu Tick là cấu trúc dữ liệu giao dịch chi tiết nhất trong sàn giao dịch. Đây cũng là dạng mở rộng của dữ liệu chuỗi thời gian được đề cập ở trên, bao gồm: giá mở cửa, giá cao nhất, giá thấp nhất, giá mới nhất, khối lượng giao dịch và số tiền giao dịch. Nếu dữ liệu giao dịch được ví như một dòng sông, dữ liệu tích tắc là dữ liệu của dòng sông tại một mặt cắt ngang nhất định.

Như thể hiện trong hình trên, mọi hoạt động giao dịch ngoại hối sẽ được đưa ra thị trường theo thời gian thực. Trao đổi trong nước kiểm tra hai lần một giây. Nếu có bất kỳ hành động nào trong thời gian này, một ảnh chụp nhanh sẽ được tạo và đẩy ra. Trong khi đó, đẩy dữ liệu chỉ có thể được coi là OnTime và không thể được gọi là OnTick.
Tất cả mã và dữ liệu chuỗi thời gian cho hướng dẫn này đều được lấy từ Nền tảng định lượng Inventor.
Mặc dù dữ liệu tích tắc trong nước không phải là tích tắc thực sự, nhưng việc sử dụng dữ liệu này để kiểm tra ngược ít nhất có thể gần với thực tế và khôi phục lại. Mỗi tick hiển thị các thông số chính của sản phẩm trên thị trường tại thời điểm đó, còn trên thị trường thực tế, code của chúng tôi được tính theo tick lý thuyết là 2 lần/giây.

Không chỉ vậy, trong Inventor Quantification, ngay cả khi bạn tải dữ liệu trong khoảng thời gian 1 giờ, bạn vẫn có thể điều chỉnh mức độ chi tiết của dữ liệu, chẳng hạn như điều chỉnh mức độ chi tiết của dữ liệu thành 1 phút. Vào thời điểm này, đường K-line 1 giờ bao gồm dữ liệu 1 phút. Tất nhiên, kích thước hạt càng nhỏ thì độ chính xác càng cao. Thậm chí còn mạnh mẽ hơn nữa là nếu bạn chuyển dữ liệu sang dạng tích tắc thời gian thực, bạn có thể khôi phục môi trường thời gian thực một cách liền mạch. Nghĩa là dữ liệu thực tế của cuộc trao đổi được đánh dấu hai lần mỗi giây.

Bây giờ bạn đã hiểu những khái niệm cơ bản cần biết để hoàn thành hướng dẫn này. Chúng tôi sẽ sớm quay lại những khái niệm này và bạn sẽ tìm hiểu thêm về chúng ở phần sau của hướng dẫn này.
Để biết thêm thông tin về phần này, vui lòng truy cập: https://www.fmz.com/bbs-topic/1651
Để làm tốt công việc của mình, trước tiên bạn phải mài giũa công cụ của mình. Chúng ta cần triển khai một người giám hộ trên Nền tảng quan trọng của Inventor. Về khái niệm người giám hộ, độc giả có kinh nghiệm lập trình có thể coi đó là một hệ thống Docker được đóng gói chính thức. Hệ thống có đóng gói các giao diện API công khai của nhiều sàn giao dịch chính thống và các thông tin kỹ thuật chi tiết để viết chiến lược và kiểm tra ngược. Mục đích ban đầu của việc thiết lập hệ thống này là để giải phóng các nhà giao dịch định lượng khỏi nhu cầu tập trung vào việc viết và thiết kế chiến lược khi sử dụng Nền tảng định lượng Inventor. Các chi tiết kỹ thuật này được trình bày cho các tác giả chiến lược dưới dạng đóng gói để giúp họ tiết kiệm được nhiều công sức thời gian và năng lượng.
Có hai cách để triển khai máy chủ:
Phương pháp A: Người dùng tự thuê hoặc mua máy chủ và triển khai chúng trên các nền tảng điện toán đám mây lớn như AWS, Alibaba Cloud, Digital Ocean và Google Cloud. Ưu điểm là cả bảo mật chiến lược và bảo mật hệ thống đều được đảm bảo. Đối với Inventor Quantitative Platform, người dùng được khuyến khích sử dụng phương pháp này. Việc triển khai phân tán như vậy sẽ loại bỏ nguy cơ tấn công máy chủ (cho dù là khách hàng hay chính nền tảng).
Phần này, bạn đọc có thể tham khảo tại: https://www.fmz.com/bbs-topic/2848
Phương pháp B: Sử dụng triển khai máy chủ công cộng của Inventor Quantitative Platform. Nền tảng này cung cấp triển khai tại Hồng Kông, Luân Đôn và Hàng Châu. Người dùng có thể triển khai theo nguyên tắc gần dựa trên vị trí của sàn giao dịch mà họ muốn giao dịch. Ưu điểm của khía cạnh này là nó đơn giản và dễ dàng, có thể hoàn thành chỉ bằng một cú nhấp chuột. Nó đặc biệt phù hợp với người dùng mới bắt đầu. Họ không cần phải hiểu nhiều vấn đề khi mua máy chủ Linux và họ cũng tiết kiệm được thời gian và năng lượng trong việc học lệnh Linux. Giá cả cũng tương đối rẻ, phù hợp với người dùng có ít tiền. Người dùng, nền tảng khuyến nghị sử dụng phương pháp triển khai này.

Để đảm bảo sự hiểu biết cho người mới bắt đầu, bài viết này sẽ áp dụng phương pháp B.
Các thao tác cụ thể là: đăng nhập vào FMZ.COM, nhấp vào trung tâm điều khiển, máy chủ và nhấp vào thuê máy chủ một lần nhấp trên trang máy chủ.
Nhập mật khẩu. Sau khi triển khai thành công, hình ảnh sau sẽ hiển thị:

Như đã đề cập ở trên, máy chủ giống như một hệ thống docker và một hệ thống docker giống như một bộ tiêu chuẩn. Sau khi triển khai bộ tiêu chuẩn này, chúng ta cần tạo một “thể hiện” cho tiêu chuẩn này và “thể hiện” này là một rô-bốt.
Rất đơn giản để tạo một robot. Sau khi triển khai máy chủ, hãy nhấp vào cột robot ở bên trái, nhấp vào Tạo Robot, điền tên vào tên nhãn và chọn máy chủ bạn vừa triển khai trong máy chủ lưu trữ. Có thể lựa chọn tham số và khoảng thời gian K-line trong hộp thoại bên dưới tùy theo tình hình cụ thể, chủ yếu là để phối hợp với việc lựa chọn chiến lược giao dịch.

Đến thời điểm này, môi trường làm việc của chúng tôi đã được thiết lập. Như bạn thấy, nó rất đơn giản và hiệu quả, và mỗi chức năng thực hiện chức năng riêng của nó. Tiếp theo, chúng ta sẽ bắt đầu viết các chiến lược định lượng.
Ở trên chúng tôi đã đề cập đến các khái niệm về dữ liệu chuỗi thời gian và dữ liệu tích tắc. Tiếp theo, chúng tôi sẽ sử dụng chiến lược trung bình động đơn giản để liên kết hai khái niệm này.
Thông qua đường trung bình động chậm, chẳng hạn như đường trung bình động 7 ngày, và đường trung bình động nhanh, chẳng hạn như đường trung bình động 3 ngày. Áp dụng chúng vào cùng biểu đồ K-line, khi đường trung bình động nhanh cắt đường trung bình động chậm, chúng ta gọi đó là giao cắt vàng; khi đường trung bình động chậm cắt đường trung bình động nhanh, chúng ta gọi đó là giao cắt tử thần.
Cơ sở để mở một vị thế là mở một lệnh mua khi chữ thập vàng xuất hiện và mở một lệnh bán khi chữ thập vàng xuất hiện. Nguyên tắc tương tự cũng áp dụng cho việc đóng một vị thế.
Chúng ta hãy mở FMZ.COM, đăng nhập vào tài khoản, trung tâm điều khiển, thư viện chiến lược, tạo chiến lược mới và chọn Python trong ngôn ngữ viết chiến lược ở góc trên bên trái. Sau đây là mã cho chiến lược này. Mỗi dòng đều có bình luận rất chi tiết. Hãy dành thời gian để đánh giá cao nó. Chiến lược này không phải là chiến lược thực tế, vì vậy vui lòng không thử nghiệm bằng tiền thật. Chủ yếu là để cung cấp cho mọi người ý tưởng chung về cách viết chiến lược và mẫu học tập.
import types # 导入Types模块库,这是为了应对代码中将要用到的各种数据类型
def main(): # 主函数,策略逻辑从这里开始
STATE_IDLE = -1 # 标记持仓状态变量
state = STATE_IDLE # 标记当前持仓状态
initAccount = ext.GetAccount() #这里用到了现货数字货币交易类库(python版),编写策略时记得勾选上,作用是获得账户初始信息
while True: # 进入循环
if state == STATE_IDLE : # 这里开始开仓逻辑
n = ext.Cross(FastPeriod,SlowPeriod) # 这里用到了指标交叉函数,详情请查看https://www.fmz.com/strategy/21104
if abs(n) >= EnterPeriod : # 如果n大于等于入市观察期,这里的入市观察期是为了防止一开盘就胡乱开仓。
opAmount = _N(initAccount.Stocks * PositionRatio,3) # 开仓量,关于_N的用法,请查看官方API文档
Dict = ext.Buy(opAmount) if n > 0 else ext.Sell(opAmount) # 建立一个变量,用于存储开仓状态,并执行开仓操作
if Dict : # 查看dict变量的情况,为下面的日志输出做准备
opAmount = Dict['amount']
state = PD_LONG if n > 0 else PD_SHORT # PD_LONG和PD_SHORT均为全局常量,分别用来表示多头和空头仓位。
Log("开仓详情",Dict,"交叉周期",n) # 日志信息
else: # 这里开始平仓逻辑
n = ext.Cross(ExitFastPeriod,ExitSlowPeriod) # 指标交叉函数,
if abs(n) >= ExitPeriod and ((state == PD_LONG and n < 0) or (state == PD_SHORT and n > 0)) : # 如果经过了离市观察期且当前账户状态为持仓状态,进而判断金叉或者死叉
nowAccount = ext.GetAccount() # 再次刷新和获取账户信息
Dict2 = ext.Sell(nowAccount.Stocks - initAccount.Stocks) if state == PD_LONG else ext.Buy(initAccount.Stocks - nowAccount.Stocks) # 平仓逻辑,是多头就平多头,是空头就平空头。
state = STATE_IDLE # 标记平仓后持仓状态。
nowAccount = ext.GetAccount() # 再次刷新和获取账户信息
LogProfit(nowAccount.Balance - initAccount.Balance,'钱:',nowAccount.Balance,'币:',nowAccount.Stocks,'平仓详情:',Dict2,'交叉周期:',n) # 日志信息
Sleep(Interval * 1000) # 循环暂停一秒,防止API访问频率过快导致账户被限制。
Trên trang chỉnh sửa chiến lược, chúng tôi đã hoàn thành việc viết chiến lược. Tiếp theo, chúng tôi cần kiểm tra lại chiến lược này để xem nó hoạt động như thế nào trong các điều kiện thị trường lịch sử. Kiểm tra lại đóng vai trò quan trọng trong việc phát triển bất kỳ chiến lược định lượng nào, nhưng nó cũng chỉ có thể dùng làm tài liệu tham khảo quan trọng. Kiểm tra ngược không có nghĩa là đảm bảo lợi nhuận, vì thị trường liên tục thay đổi. Kiểm tra ngược chỉ là hành động nhìn lại và vẫn thuộc về phạm trù quy nạp. Thị trường là suy diễn.
Nhấp vào backtest mô phỏng, bạn có thể thấy có nhiều tham số có thể điều chỉnh, có thể được sửa đổi trực tiếp trong đó. Khi chiến lược ngày càng phức tạp và số lượng tham số tăng lên, phương pháp sửa đổi này có thể giúp người dùng tránh phải sửa đổi chúng từng cái một trong mã. Quá trình sửa đổi không phức tạp, nhanh chóng và dễ dàng, và được tổ chức rõ ràng.

Các tùy chọn điều chỉnh tiếp theo có thể tự động tối ưu hóa các tham số đã đặt. Hệ thống sẽ thử nhiều tham số tối ưu khác nhau để giúp các nhà phát triển chiến lược tìm ra lựa chọn tốt nhất.
Từ các ví dụ trên, chúng ta có thể thấy rằng cơ sở của giao dịch định lượng là sự tương tác giữa phân tích dữ liệu chuỗi thời gian và kiểm tra ngược dữ liệu tick. Bất kể logic phức tạp đến đâu, nó cũng không thể tách rời khỏi hai yếu tố cơ bản này. Sự khác biệt chỉ là kích thước. Ví dụ, giao dịch tần suất cao đòi hỏi các phần dữ liệu chi tiết hơn và dữ liệu chuỗi thời gian phong phú hơn. Ví dụ, giao dịch chênh lệch giá đòi hỏi dữ liệu tương đối cao cho các mẫu kiểm tra ngược. Có thể cần hơn mười năm dữ liệu chuyên sâu liên tục về hai mục tiêu giao dịch để tìm ra kết quả thống kê về sự mở rộng và thu hẹp của chênh lệch lãi suất của chúng. Trong các bài viết sau, tôi sẽ giới thiệu về giao dịch tần suất cao và chiến lược giao dịch chênh lệch giá, hãy chú ý theo dõi.