4.4 Cách thực hiện các chiến lược trong ngôn ngữ Python

Tác giả:Tốt, Tạo: 2019-04-28 16:51:22, Cập nhật:

Tóm lại

Trong bài viết trước, chúng tôi đã tìm hiểu về phần giới thiệu về ngôn ngữ Python, cú pháp cơ bản, khung chiến lược và nhiều hơn nữa. Mặc dù nội dung là nhàm chán, nhưng nó là một kỹ năng cần thiết trong việc phát triển chiến lược giao dịch của bạn. Trong bài viết này, hãy tiếp tục con đường của Python với một chiến lược đơn giản, từng bước để giúp bạn đạt được một chiến lược giao dịch định lượng khả thi.

Chiến lược giới thiệu

Trong số nhiều chiến lược giao dịch, chiến lược kênh Donchian là một trong những chiến lược đột phá cổ điển nhất. Nó đã nổi tiếng từ năm 1970.

Sau đó, tại Hoa Kỳ, các sự kiện đào tạo thương nhân turtle nổi tiếng đã xảy ra, đã thành công rất lớn trong lịch sử giao dịch chứng khoán.

Chiến lược giao dịch đột phá được điều chỉnh theo xu hướng tương đối trơn tru của các loại giao dịch. Cách phổ biến nhất để đột phá là sử dụng mối quan hệ vị trí tương đối giữa hỗ trợ giá và kháng cự để xác định vị trí giao dịch cụ thể. Chiến lược kênh Donchian trong phần này cũng dựa trên nguyên tắc này.

Quy tắc chiến lược kênh Donchian

Kênh Donchian là một chỉ số định hướng xu hướng, và ngoại hình và tín hiệu của nó tương tự như chỉ số Bollinger Band. Tuy nhiên, kênh giá của nó được xây dựng theo giá cao nhất và thấp nhất trong một khoảng thời gian nhất định. Ví dụ: đường ray trên được tính bằng giá cao nhất gần đây 50 k-line; đường ray dưới được tính bằng giá thấp nhất gần đây 50 k-line.

img

như được hiển thị ở trên: chỉ số này với đường cong bao gồm ba màu khác nhau, cài đặt mặc định là giá cao nhất và thấp nhất trong chu kỳ 20 để hiển thị biến động giá. Nó sẽ hiển thị biến động ít hơn khi giá ở trong kênh hẹp, và ngược lại.

Nếu giá tăng trên đường ray trên, tín hiệu mua sẽ xuất hiện; ngược lại, nếu giá giảm dưới đường ray dưới, tín hiệu bán sẽ xuất hiện.

Phương pháp tính kênh Donchian

Trên nền tảng FMZ Quant, việc tính toán kênh Donchian rất đơn giản, bạn chỉ có thể truy cập vào giá cao nhất hoặc thấp nhất trong chu kỳ nhất định, như được hiển thị dưới đây: dòng 5 là để có được giá cao nhất trong 50 chu kỳ, dòng 6 là để có được giá thấp nhất trong 50 chu kỳ.

def main(): # program entry
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line 
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        upper = TA.Highest(record, 50, 'high') # get the highest price of 50 cycles
        lower = TA.Lowest(record, 50, 'low') # get the lowest price of 50 cycles
        middle = (upper + lower) / 2 # calculate the average value of upper and lower rails 
        Log("upper rail: ", upper) # print the upper rail value in the log
        Log("lower rail: ", lower) # print the lower rail value in the log
        Log("middle rail: ", middle) # print the middle rail value in the log

Chiến lược logic

Có nhiều cách để sử dụng kênh Donchian, có thể được sử dụng một mình hoặc kết hợp với các chỉ số khác. Trong phần này chúng tôi sẽ sử dụng nó theo cách dễ nhất. đó là: khi giá vượt qua đường ray trên, có nghĩa là nó phá vỡ trên đường áp suất, sức mua mạnh mạnh mẽ, nó đã hình thành một làn sóng năng lượng tăng, tín hiệu mua được tạo ra; khi giá vượt qua đường ray dưới, có nghĩa là nó phá vỡ dưới đường hỗ trợ, tín hiệu bán được tạo ra.

img

Nếu giá lại giảm trở lại đường ray giữa của kênh sau khi mở vị trí dài, chúng tôi tin rằng sức mạnh của sức mua đang suy yếu, hoặc sức mạnh của sức mạnh bán đang tăng cường, và tín hiệu mở vị trí ngắn được tạo ra; nguyên tắc tương tự áp dụng cho vị trí mở ngắn

Điều kiện giao dịch

  • Vị trí mở dài: Nếu không có vị trí giữ và giá đóng lớn hơn đường sắt trên

  • Vị trí ngắn mở: Nếu không có vị trí giữ và giá đóng thấp hơn đường sắt dưới

  • Khóa vị trí dài: Nếu hiện đang nắm giữ vị trí dài và giá đóng thấp hơn đường sắt giữa

  • Khóa vị trí ngắn: Nếu hiện đang nắm giữ vị trí ngắn và giá đóng lớn hơn đường sắt giữa

Thực hiện mã chiến lược

Bước đầu tiên trong việc thực hiện chiến lược là lấy dữ liệu trước, bởi vì dữ liệu là một điều kiện tiên quyết của chiến lược giao dịch.

Tiếp theo là tính toán logic giao dịch dựa trên dữ liệu này; bước cuối cùng là giao dịch theo logic. các bước như sau:

Bước 1: Sử dụng thư viện lớp giao dịch

Bạn có thể nghĩ về thư viện lớp giao dịch như một mô-đun chức năng. Lợi thế của việc sử dụng thư viện lớp giao dịch là nó cho phép bạn tập trung vào việc viết logic chiến lược. Ví dụ, khi chúng ta sử dụng thư viện lớp giao dịch, để mở hoặc đóng một vị trí, chúng ta có thể trực tiếp sử dụng giao diện API trong thư viện lớp giao dịch; nhưng nếu chúng ta không sử dụng thư viện lớp giao dịch, chúng ta cần có được giá thị trường khi mở vị trí. Cần xem xét vấn đề lệnh chưa thực hiện và vấn đề lệnh rút tiền, v.v.

def main();
    wile true:
        obj = ext.NewPositionManager() # using the trading class library
        # followed by strategy logic and placing order part

Phần mã hóa ở trên là khung chiến lược CTA sử dụng công cụ FMZ Quant. Đây là định dạng mã hóa cố định và tất cả mã logic giao dịch sẽ bắt đầu từ dòng 4. Không cần thay đổi khác ở nơi khác.

Bước 2: Thu thập tất cả các loại dữ liệu

Hãy suy nghĩ về nó, những loại dữ liệu chúng ta cần? Từ chiến lược giao dịch logic của chúng tôi, trước tiên chúng ta cần phải có được tình trạng vị trí hiện tại, và sau đó so sánh giá đóng với các đường ray trên, giữa và dưới của chỉ số Bollinger Band.

  • Nhận dữ liệu đường K

Đầu tiên là lấy mảng dữ liệu đường K và giá đóng đường K hiện tại, với mảng đường K, chúng ta có thể tính toán thời gian chu kỳ N của giá cao nhất và thấp nhất thông qua giao diện API. nó có thể được viết như thế này:

def main(): # main function
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line 
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
        close = records[len(records) - 1].Close # get the closing price of the latest k-line

Như được thể hiện ở trên:

Dòng 4: lấy mảng đường K, đó là một định dạng cố định.

Dòng 5: lọc chiều dài của đường K, bởi vì tham số để tính toán chỉ số kênh Donchian là 50, khi số đường K nhỏ hơn 50, không thể tính toán nó. Vì vậy, ở đây chúng ta cần lọc số đường K. Nếu số đường K nhỏ hơn 50, nó sẽ bỏ qua vòng lặp hiện tại và tiếp tục chờ đợi đường K tiếp theo.

Dòng 6: Chúng tôi sử dụng mã " records [ len (records) - 1 ] " để lấy dữ liệu cuối cùng của mảng đường K, đó là dữ liệu đường K mới nhất. Dữ liệu này là một đối tượng, chứa: giá mở, giá cao nhất, thấp nhất và giá đóng, cũng như khối lượng giao dịch, thời gian và các dữ liệu khác, vì nó là một đối tượng, vì vậy chúng tôi chỉ sử dụng .Close để có được giá đóng mới nhất của đường K.

  • Nhận dữ liệu vị trí

Thông tin vị trí là một điều kiện rất quan trọng trong chiến lược giao dịch định lượng. Khi các điều kiện giao dịch được thiết lập, cần phải đánh giá liệu có nên đặt lệnh theo tình trạng vị trí và số lượng vị trí. Ví dụ, khi các điều kiện để mở các vị trí dài được thiết lập, nếu có vị trí giữ, không đặt lệnh; nếu không có vị trí giữ, đặt lệnh. Lần này chúng tôi trực tiếp đóng gói thông tin vị trí thành một hàm, chúng tôi chỉ có thể gọi hàm này để sử dụng nó. như thế này:

# get the position information function
def mp():
    positions = exchange.GetPosition() # get the holding position array
    if len(position) == 0: # if the holding position array is 0
        return 0 # meaning currently has no position holding, return 0
    for i in range(len(position)): # Traversing the position array
        if (position[i]['Type'] == PD_LONG): 
            return 1 # if there are long position holding, return 1
        elif (position[i]['Type'] == PD_SHORT):
            return -1 # if there are short position holding, return -1
        
def main(): # main function
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
        close = records[len(records) - 1].Close # get the closing price of the latest k-line
        position = mp() # get the position information function

Như được thể hiện ở trên:

Đây là hàm lấy thông tin vị trí. Nếu có vị trí dài, giá trị là 1; nếu có vị trí ngắn, giá trị là -1; nếu không có vị trí, giá trị là 0.

Dòng 2: Tạo hàm với tên mp. Chức năng này không có tham số.

Dòng 3: Nhận mảng vị trí, đó là một định dạng cố định.

Dòng 4: Xác định chiều dài của mảng vị trí. Nếu chiều dài của nó bằng 0, nó có nghĩa là nó không có vị trí giữ, trả về 0.

Dòng 6: Sử dụng vòng lặp for, bắt đầu đi qua mảng này, logic sau rất đơn giản, nếu nó giữ vị trí dài, trả về 1 ; nếu nó giữ vị trí ngắn, trả về -1.

Dòng 18: Gọi hàm thông tin vị trí mp.

  • Nhận giá cao nhất và thấp nhất của 50 K-line gần đây nhất

Trong công cụ giao dịch định lượng FMZ Quant, bạn có thể trực tiếp sử dụng các hàm " TA.Highest " và " TA.Lowest " mà không cần phải viết các tính toán logic của riêng bạn. Và hàm TA.HighestTA.Lowest trả về kết quả của các giá trị cụ thể thay vì một mảng. Điều này rất thuận tiện. không chỉ vậy, nền tảng FMZ Quant có hàng trăm chức năng chỉ số khác được xây dựng chính thức.

# get the position information function
def mp():
    positions = exchange.GetPosition() # get the holding position array
    if len(position) == 0: # if the holding position array is 0
        return 0 # meaning currently has no position holding, return 0
    for i in range(len(position)): # Traversing the position array
        if (position[i]['Type'] == PD_LONG): 
            return 1 # if there are long position holding, return 1
        elif (position[i]['Type'] == PD_SHORT):
            return -1 # if there are short position holding, return -1
        
def main(): # main function
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
        close = records[len(records) - 1].Close # get the closing price of the latest k-line
        position = mp() # get the position information function
        upper = TA.Highest(record, 50, 'High') # get the highest price of 50 cycles
        lower = TA.Lowest(record, 50, 'Low') # get the lowest price of 50 cycles
        middle = (upper + lower) / 2 # calculate the average value of the upper and lower rail

Như được thể hiện ở trên:

Dòng 19: gọi hàm TA.Highest để có được giá cao nhất trong 50 chu kỳ

Dòng 20: gọi hàm TA.Lowest để nhận được giá thấp nhất trong 50 chu kỳ

Dòng 21: tính giá trị trung bình của đường ray trên và dưới theo giá cao nhất và thấp nhất trong 50 chu kỳ

Bước 3: Đặt lệnh và giao dịch

Với dữ liệu trên, chúng ta có thể viết logic giao dịch và đặt lệnh phần bây giờ. Nó cũng rất đơn giản, phổ biến nhất được sử dụng là câu nói if, có thể được mô tả như sau: nếu điều kiện 1 và điều kiện 2 là đúng, đặt lệnh; nếu điều kiện 3 hoặc điều kiện 4 là đúng, đặt lệnh. Như được hiển thị dưới đây:

# get the position information function
def mp():
    positions = exchange.GetPosition() # get the holding position array
    if len(position) == 0: # if the holding position array is 0
        return 0 # meaning currently has no position holding, return 0
    for i in range(len(position)): # Traversing the position array
        if (position[i]['Type'] == PD_LONG): 
            return 1 # if there are long position holding, return 1
        elif (position[i]['Type'] == PD_SHORT):
            return -1 # if there are short position holding, return -1
        
def main(): # main function
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
        close = records[len(records) - 1].Close # get the closing price of the latest k-line
        position = mp() # get the position information function
        upper = TA.Highest(record, 50, 'High') # get the highest price of 50 cycles
        lower = TA.Lowest(record, 50, 'Low') # get the lowest price of 50 cycles
        middle = (upper + lower) / 2 # calculate the average value of the upper and lower rail
        obj = ext.NewPositionManager() # using the trading class library
        if position > 0 and close < middle: # If currently holding long position, and the closing price is less than the middle rail
            obj.CoverAll() # close all position
        if position < 0 and close > middle: # If currently holding short position, and the closing price is greater than the middle rail
            obj.CoverAll() # close all position
        if position == 0: # if currently holding no position
            if close > upper: # if the closing price is greater than the middle rail
                obj.OpenLong("this_week", 1) # open long position
            elif close < lower: # if the closing price is less than the middle rail
                obj.OpenShort("this_week", 1) # open short position

Như được thể hiện ở trên:

Dòng 22: Sử dụng thư viện lớp giao dịch, đây là một định dạng cố định

Các dòng 23, 24: Đây là một tuyên bố vị trí dài kết thúc sử dụng các toán tử so sánh và toán tử logic mà chúng tôi đã học trước đây, có nghĩa là nếu nắm giữ hiện tại là vị trí dài và giá đóng cửa thấp hơn đường sắt giữa, đóng tất cả các vị trí.

Các dòng 25, 26: Đây là một tuyên bố vị trí ngắn đóng lại sử dụng các toán tử so sánh và toán tử logic mà chúng tôi đã học trước đây, có nghĩa là nếu lệnh hiện tại là vị trí ngắn và giá đóng cửa lớn hơn đường ray giữa, đóng tất cả các vị trí.

Dòng 27: Xác định trạng thái vị trí hiện tại.

Các dòng 28, 29: Xác định xem giá đóng cửa có lớn hơn đường sắt trên không. Nếu giá đóng cửa tăng trên đường sắt trên không, mở vị trí dài.

Các dòng 30, 31: Xác định xem giá đóng cửa có thấp hơn đường sắt dưới không. Nếu giá đóng cửa giảm xuống dưới đường sắt dưới không, mở vị trí ngắn.

Tóm lại

Trên đây chúng ta đã học được từng bước để phát triển một chiến lược giao dịch định lượng hoàn chỉnh bằng cách sử dụng Python, bao gồm: giới thiệu chiến lược, phương pháp tính toán kênh Donchian, logic chiến lược, điều kiện giao dịch, thực hiện mã chiến lược, v.v. Phần này chỉ là một chiến lược đơn giản. Là một phương pháp truyền cảm hứng, có nhiều cách để hoàn thành nó. Bạn có thể chồng lên các phương pháp giao dịch khác nhau theo hệ thống giao dịch của mình để hình thành chiến lược giao dịch định lượng của riêng bạn.

Thông báo phần tiếp theo

Trong việc phát triển các chiến lược giao dịch định lượng, từ quan điểm của tốc độ thực thi ngôn ngữ lập trình, ngôn ngữ nào là nhanh nhất? nó phải là C ++. Đặc biệt trong lĩnh vực phái sinh tài chính và giao dịch tần số cao. C ++ là duy nhất về tính cụ thể của ngôn ngữ và nó có lợi thế trong tính toán số. So với JavaScript và Python, tốc độ của nó có thể tăng lên nhiều thứ bậc. Nếu bạn muốn đi đến lĩnh vực phái sinh tài chính hoặc giao dịch tần số cao trong tương lai. Đây sẽ là khóa học bạn không nên bỏ lỡ.

Các bài tập sau giờ học

  1. Bắt đầu từ cơ bản và thực hiện chiến lược của phần này.

  2. Cố gắng thêm một chỉ số trung bình động vào chiến lược trong phần này để giảm tần suất giao dịch.


Thêm nữa