Chiến lược giao dịch dựa trên dòng tiền hoạt động

Tác giả:Tốt, Tạo: 2020-08-01 09:50:44, Cập nhật: 2023-10-11 19:56:26

img

Tóm lại

Giá là hoặc tăng hoặc giảm. Trong thời gian dài, xác suất giá tăng và giảm nên là 50%, vì vậy để dự đoán chính xác giá trong tương lai, bạn cần phải có được tất cả các yếu tố ảnh hưởng đến giá trong thời gian thực, và sau đó cung cấp cho mỗi yếu tố một trọng lượng chính xác, và cuối cùng làm cho khách quan và phân tích hợp lý. Để liệt kê tất cả các yếu tố ảnh hưởng đến giá, nó có thể lấp đầy toàn bộ vũ trụ.

Tóm lại như: môi trường kinh tế toàn cầu, chính sách vĩ mô quốc gia, các chính sách công nghiệp liên quan, mối quan hệ cung và cầu, các sự kiện quốc tế, lãi suất và tỷ giá hối đoái, lạm phát và thoái vốn, tâm lý thị trường và các yếu tố không rõ khác, v.v. Dự đoán đã trở thành một nhiệm vụ rất lớn và không thể. Vì vậy, sớm, tôi hiểu rằng thị trường là không thể đoán trước được. Sau đó tất cả các dự đoán trong thị trường đã trở thành giả thuyết, và giao dịch đã trở thành một trò chơi xác suất, đó là thú vị.

Tại sao sử dụng dòng vốn

Vì thị trường không thể đoán trước được, nó có thực sự thờ ơ không? Không, tất cả các yếu tố vĩ mô và vi mô đã được phản ánh trong giá, có nghĩa là giá là kết quả của sự tương tác của tất cả các yếu tố. Chúng ta chỉ cần phân tích giá để thực hiện một chiến lược giao dịch hoàn chỉnh.

Hãy suy nghĩ về nó trước, tại sao giá lại tăng?

Bạn có thể nói, bởi vì: đất nước hỗ trợ các chính sách công nghiệp có liên quan, đất nước xuất xứ là mưa lớn, cuộc chiến thương mại quốc tế, MACD Golden Fork được mua, những người khác đã mua nó, vv Tất nhiên, những điều này có thể không sai.

Trong thực tế, sự gia tăng và giảm giá tương tự như thủy triều tăng. Sự gia tăng giá không thể tách rời khỏi việc thúc đẩy quỹ. trên thị trường, nếu có nhiều người mua hơn người bán, giá sẽ tăng. Ngược lại, nếu có nhiều người bán hơn người mua, giá sẽ giảm. Với khái niệm này, chúng ta có thể đưa ra những kỳ vọng hợp lý về xu hướng giá trong tương lai dựa trên mối quan hệ cung và cầu được phản ánh trong dòng tiền ròng.

Nguyên tắc dòng tiền

Khác với phân tích truyền thống, phân tích dòng tiền phân tích các giao dịch là dòng tiền hoạt động và các giao dịch là dòng tiền hoạt động dựa trên dữ liệu giao dịch trong một khoảng thời gian. Sau đó, bằng cách trừ khối lượng dòng tiền hoạt động từ khối lượng dòng tiền hoạt động trong khoảng thời gian này, chúng ta có thể biết dòng tiền hoạt động trong khoảng thời gian này. Nếu dòng tiền hoạt động tích cực, điều đó có nghĩa là nguồn cung của sản phẩm này đang thiếu; nếu dòng tiền hoạt động trong khoảng thời gian này có nghĩa là nguồn cung của sản phẩm này đang dư thừa.

Sau khi đọc điều này, một số người có thể tự hỏi rằng trong các giao dịch thực tế, một giao dịch sẽ chỉ được thực hiện khi ai đó mua và ai đó bán. Lệnh giao dịch phải có khối lượng bán nhiều như khối lượng mua, và các khoản tiền phải vào và ra cùng một số tiền. Lưu lượng và lưu lượng vốn đến từ đâu? Trên thực tế, nói một cách nghiêm ngặt, mọi lệnh mua phải tương ứng với một lệnh bán tương ứng, và lưu lượng vốn và lưu lượng vốn phải bằng nhau. Nếu chúng ta muốn tính toán lệnh nào được tích cực mua và lệnh nào được tích cực bán, chúng ta chỉ có thể sử dụng phương pháp thỏa hiệp, sử dụng dữ liệu thanh đường K, dựa trên khối lượng giao dịch và giá cả.

Phương pháp tính toán dòng tiền

Sự thay đổi trong dòng tiền tương ứng chính xác với hành vi thị trường thời gian thực, và dòng tiền ròng được tính toán trong thời gian thực bằng cách tích hợp dữ liệu thanh đường k. Có hai thuật toán để tính toán dòng tiền hoạt động:

Thứ nhất, nếu giá giao dịch hiện tại của lệnh hiện tại được thực hiện ở mức giá đối tác hoặc ở mức giá quá mức, giá giao dịch mua >= giá giao dịch bán, có nghĩa là người mua sẵn sàng hoàn thành giao dịch với giá cao hơn, được bao gồm trong dòng tiền hoạt động.

Thứ hai, nếu giá giao dịch hiện tại > giá giao dịch cuối cùng, thì có thể hiểu rằng khối lượng giao dịch hiện tại tích cực đẩy tăng giá lên, được bao gồm trong dòng tiền tích cực.

Lấy thuật toán thứ hai ở trên làm ví dụ:

Giá đóng cửa của một sản phẩm nhất định lúc 10:00 là 3450, và giá đóng cửa lúc 11:00 là 3455, vì vậy chúng ta sẽ bao gồm khối lượng giao dịch giữa 10:00 và 11:00 như dòng vốn hoạt động. Nếu không, nó được bao gồm trong dòng vốn khởi động. Bài viết này dựa trên phương pháp thứ hai, thêm yếu tố biến động giá. Bằng cách so sánh giá đóng cửa thanh k trước và sau đó, khối lượng thanh k tăng hoặc giảm * biến động được bao gồm trong một chuỗi, và sau đó tiếp tục theo chuỗi Tính tỷ lệ dòng vốn hoạt động của quỹ.

Logic giao dịch

Bài viết này mô tả dòng tiền trong thị trường tương lai từ quan điểm của khối lượng , và thiết lập một mô hình giao dịch để đánh giá xu hướng giá ngắn hạn thông qua phân tích thời gian thực của dữ liệu thanh đường K. Trong hoàn cảnh bình thường, dòng vốn và xu hướng giá có thể được chia thành bốn điều kiện cơ bản:

Giá tăng và dòng tiền hoạt động ròng mỗi đơn vị thời gian: tình hình này là mạnh mẽ, và giá trong tương lai sẽ tiếp tục tăng nhiều khả năng hơn;

Giá cổ phiếu tăng, và dòng chảy ròng hoạt động của các quỹ mỗi đơn vị thời gian: Trong trường hợp này, đó là một vị trí trung bình mạnh, và tỷ lệ tăng giá trong tương lai sẽ giảm đáng kể;

Giá cổ phiếu giảm, trong khi dòng tiền hoạt động ròng mỗi đơn vị thời gian: đây là một tình huống yếu, và giá trong tương lai tiếp tục giảm nhiều khả năng hơn;

Giá cổ phiếu giảm, và đồng thời dòng chảy ròng hoạt động của các khoản tiền trên mỗi đơn vị thời gian: trong trường hợp này, nó là một vị trí vừa phải yếu, và tỷ lệ giảm giá trong tương lai sẽ được giảm đáng kể;

Các biến chính là như sau:

Mức thấp trước (ll) Tối cao trước (hh) Việc mua tích cực (bạch) Bán hàng hoạt động (barOut) Tỷ lệ dòng tiền hoạt động vào và dòng tiền hoạt động ra (barRatio) Mức ngưỡng vị trí mở (OpenValve) Vị trí nắm giữ hiện tại (myAmount) Giá đóng cuối cùng của dòng K (khép lại)

Điều kiện nhập cảnh và xuất cảnh

Một chiến lược giao dịch định lượng tốt đòi hỏi không chỉ lợi nhuận ổn định, mà còn khả năng kiểm soát rủi ro và tránh thua lỗ lớn khi có khả năng nhỏ.

  • Mở vị trí dài: nếu không có vị trí giữ hiện tại và barRatio > openValve, mở vị trí dài;

  • Mở vị trí ngắn: nếu không có vị trí giữ hiện tại và barRatio < 1 / openValve, mở vị trí ngắn;

  • Khóa vị trí dài: Nếu vị trí dài hiện tại được giữ và đóng < ll, bán và đóng vị trí dài;

  • Khóa vị trí ngắn: Nếu vị trí ngắn hiện tại được giữ và đóng > hh, mua và đóng vị trí ngắn;

Viết mã nguồn chiến lược

Thu thập và tính toán dữ liệu

function data() {
    var self = {};
    var barVol = [];
    var bars = _C(exchange.GetRecords); //Get K line bar data
    if (bars.length < len * 2) { //Control the length of the K line bar data array
        return;
    }
    for (var i = len; i > 0; i--) {
        var barSub_1 = bars[bars.length - (i + 1)].Close - bars[bars.length - (i + 2)].Close; //Calculate the difference between the current closing price and the previous K line bar closing price
        if (barSub_1 > 0) { //If the price rises, add a positive number to the array
            barVol.push(bars[bars.length - (i + 1)].Volume * (bars[bars.length - (i + 1)].High - bars[bars.length - (i + 1)].Low));
        } else if (barSub_1 < 0) { //If the price drops, add a negative number to the array
            barVol.push(-bars[bars.length - (i + 1)].Volume * (bars[bars.length - (i + 1)].High - bars[bars.length - (i + 1)].Low));
        }
    }
    if (barVol.length > len) {
        barVol.shift(); //Free up excess data
    }
    self.barIn = 0;
    self.barOut = 0;
    for (var v = 0; v < barVol.length; v++) {
        if (barVol[v] > 0) {
            self.barIn += barVol[v]; //Consolidate all active inflows funds
        } else {
            self.barOut -= barVol[v]; //Consolidate all active outflow funds
        }
    }
    self.barRatio = self.barIn / Math.abs(self.barOut); //Calculate the ratio of active inflows to active outflows
    bars.pop(); //Delete unfinished K line bar data
    self.close = bars[bars.length - 1].Close; //Get the closing price of the pervious bar
    self.hh = TA.Highest(bars, hgLen, 'High'); //Get the previous high price
    self.ll = TA.Lowest(bars, hgLen, 'Low'); //Get the previous low price
    return self;
}

Nhận dữ liệu thanh đường K trực tiếp thông quaGetRecordsphương pháp trong API FMZ. Bao gồm giá cao nhất, giá thấp nhất, giá mở cửa, giá đóng cửa, khối lượng và dấu thời gian tiêu chuẩn. Nếu giá giao dịch mới nhất lớn hơn giá giao dịch cuối cùng, thì khối lượng giao dịch mới nhất * (giá cao nhất-giá thấp nhất) được bao gồm trong mua tích cực; nếu giá giao dịch mới nhất thấp hơn giá giao dịch cuối cùng, thì khối lượng mới nhất * (giá cao nhất-giá thấp nhất) được bao gồm trong bán tích cực;

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

function positions(name) {
    var self = {};
    var mp = _C(exchange.GetPosition); //Get positions
    if (mp.length == 0) {
        self.amount = 0;
    }
    for (var i = 0; i < mp.length; i++) { //Position data processing
        if (mp[i].ContractType == name) {
            if (mp[i].Type == PD_LONG || mp[i].Type == PD_LONG_YD) {
                self.amount = mp[i].Amount;
            } else if (mp[i].Type == PD_SHORT || mp[i].Type == PD_SHORT_YD) {
                self.amount = -mp[i].Amount;
            }
            self.profit = mp[i].Profit;
        } else {
            self.amount = 0;
        }
    }
    return self;
}

Nhận dữ liệu vị trí cơ bản thông quaGetPositionNếu vị trí dài hiện tại được giữ, thì số lượng vị trí tích cực được trả về; nếu vị trí hiện tại là ngắn, thì số lượng vị trí âm được trả về. Mục đích của điều này là để tạo điều kiện cho việc tính toán logic của các vị trí mở và đóng.

Đặt lệnh

function trade() {
    var myData = data(); //Execute data function
    if (!myData) {
        return;
    }
    var mp = positions(contractType); //Get position information
    var myAmount = mp.amount; //Get the number of positions
    var myProfit = mp.profit; //Get floating profit and loss
    if (myAmount > 0 && myData.close < myData.ll) {
        p.Cover(contractType, unit); //close long position
    }
    if (myAmount < 0 && myData.close > myData.hh) {
        p.Cover(contractType, unit); //close short position
    }
    if (myAmount == 0) {
        if (myData.barRatio > openValve) {
            p.OpenLong(contractType, unit); //open long position
        } else if (myData.barRatio < 1 / openValve) {
            p.OpenShort(contractType, unit); //open short position
        }
    }
}

Đặc điểm chiến lược

  • Đặc điểm:

Một số thông số cốt lõi: Mô hình có một ý tưởng thiết kế rõ ràng, chỉ có ba thông số cốt lõi. Sự phổ quát mạnh mẽ: Chiến lược đơn giản về logic và có tính phổ quát cao. Nó có thể thích nghi với hầu hết các giống ngoại trừ các sản phẩm nông nghiệp và có thể được kết hợp với nhiều giống.

  • Cải tiến:

Thêm các điều kiện vị trí nắm giữ: dòng chảy một chiều (đồng chứng khoán) thị trường tiền có thể xác định dòng chảy hoặc dòng chảy của tiền dựa trên các yếu tố như biến động giá và khối lượng giao dịch.

Thêm điều kiện lệch chuẩn: chỉ dựa vào dòng tiền như là điều kiện để mở một vị trí, có thể có các tín hiệu sai thường xuyên, dẫn đến việc mở và đóng các vị trí thường xuyên.

Mã nguồn chiến lược đầy đủ:

/*backtest
start: 2016-01-01 09:00:00
end: 2019-12-31 15:00:00
period: 1h
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
*/

var p = $.NewPositionManager(); //Call commodity futures trading library

//Holding Position data processing
function positions(name) {
    var self = {};
    var mp = _C(exchange.GetPosition); //Get positions
    if (mp.length == 0) {
        self.amount = 0;
    }
    for (var i = 0; i < mp.length; i++) { //Holding Position data processing
        if (mp[i].ContractType == name) {
            if (mp[i].Type == PD_LONG || mp[i].Type == PD_LONG_YD) {
                self.amount = mp[i].Amount;
            } else if (mp[i].Type == PD_SHORT || mp[i].Type == PD_SHORT_YD) {
                self.amount = -mp[i].Amount;
            }
            self.profit = mp[i].Profit;
        } else {
            self.amount = 0;
        }
    }
    return self;
}

//Market data processing function
function data() {
    var self = {};
    var barVol = [];
    var bars = _C(exchange.GetRecords); //Get K line bar data
    if (bars.length < len * 2) { //Control the length of the K line bar data array
        return;
    }
    for (var i = len; i > 0; i--) {
        var barSub_1 = bars[bars.length - (i + 1)].Close - bars[bars.length - (i + 2)].Close; //Calculate the difference between the current closing price and the previous K line bar closing price
        if (barSub_1 > 0) { //If the price rises, add a positive number to the array
            barVol.push(bars[bars.length - (i + 1)].Volume * (bars[bars.length - (i + 1)].High - bars[bars.length - (i + 1)].Low));
        } else if (barSub_1 < 0) { //If the price drops, add a negative number to the array
            barVol.push(-bars[bars.length - (i + 1)].Volume * (bars[bars.length - (i + 1)].High - bars[bars.length - (i + 1)].Low));
        }
    }
    if (barVol.length > len) {
        barVol.shift(); //Free up excess data
    }
    self.barIn = 0;
    self.barOut = 0;
    for (var v = 0; v < barVol.length; v++) {
        if (barVol[v] > 0) {
            self.barIn += barVol[v]; //Consolidate all active inflows funds
        } else {
            self.barOut -= barVol[v]; //Consolidate all active outflow funds
        }
    }
    self.barRatio = self.barIn / Math.abs(self.barOut); //Calculate the ratio of active inflows to active outflows
    bars.pop(); //Delete unfinished K line bar data
    self.close = bars[bars.length - 1].Close; //Get the closing price of the last K line bar
    self.hh = TA.Highest(bars, hgLen, 'High'); //Get the previous high price
    self.ll = TA.Lowest(bars, hgLen, 'Low'); //Get the previous low price
    return self;
}

//Trading function
function trade() {
    var myData = data(); //Execute data function
    if (!myData) {
        return;
    }
    var mp = positions(contractType); //Get position information
    var myAmount = mp.amount; //Get the number of positions
    var myProfit = mp.profit; //Get floating profit and loss
    if (myAmount > 0 && myData.close < myData.ll) {
        p.Cover(contractType, unit); //close long position
    }
    if (myAmount < 0 && myData.close > myData.hh) {
        p.Cover(contractType, unit); //close short position
    }
    if (myAmount == 0) {
        if (myData.barRatio > openValve) {
            p.OpenLong(contractType, unit); //open long position
        } else if (myData.barRatio < 1 / openValve) {
            p.OpenShort(contractType, unit); //open short position
        }
    }
}

//The main entrance of the program, start from here
function main() {
    while (true) { //Enter the loop
        if (exchange.IO("status")) { //If it is the market opening time
            _C(exchange.SetContractType, contractType); //Subscription contract
            trade(); //Execute trade function
        }
    }
}

Địa chỉ chiến lược:https://www.fmz.com/strategy/87698

Kiểm tra lại chiến lược

Cấu hình chiến lược:

img

Hiệu suất thử nghiệm sau:

img

Tóm lại

Thông qua mô hình hóa, bài viết này sử dụng dữ liệu thanh đường K tương lai hàng hóa được cung cấp bởi nền tảng giao dịch FMZ để thiết lập mô hình dòng vốn ròng thông qua thu thập dữ liệu, phân tích liên quan và công nghệ dự đoán. Sử dụng phân tích chuỗi thời gian để dự đoán giá tương lai hàng hóa và thiết kế chiến lược giao dịch định lượng cho tương lai hàng hóa.

Cần lưu ý rằng dòng tiền được đề cập trong bài viết này đề cập đến dòng tiền hoạt động. Nó đề cập đến sức mạnh của người bán và người mua trên thị trường, chứ không phải là nhập hoặc xuất của tiền. Đánh giá giá trong tương lai bằng cách phân tích hành vi của người mua và người bán trên thị trường không có ý nghĩa tham chiếu ngắn hạn.


Có liên quan

Thêm nữa