un trader effectue des operations d'achat et vendre d'une seule action sur une periode de 10 jours . Chque jour, le prix de action est donnee dans un tableaux. Contraintes: le trader ne peut effectuer qu'une seule operation par jour: soit acheter une action, soit en vendre une. Il ne peut pas achter et vendre le meme jour, le trader ne peut detenir qu'une seule action a la fois, le trader peut commencer par vendre une action (ce qui signifie qu'il commence par une position courte), chaque fois qu'il change de position (c'est a dire qu'apres avoir achete il vend, ou apres avoir vendu il achete) il doit payer une commission fixe de 2 unites monetaires, l'objectif est de maximiser le gain total net (c'est a dire la somme des profits et pertes realises sur les operations, apres deduction des commissions. Donnees: un tableau prix de taille 10 contenant les prix de l'action pour chauqe jour: prix = [100,98,105,102,110,107,115,112,120,117]. Objectif: en c#, ecrire un algorithme qui, a partir du tableau des prix, determiner la strategie d'achat/vente (une seule operation par jour) permettant de maximiser le gain total net sur 10 jours)
===============
Ý tưởng (rất gọn)
Mỗi ngày chỉ cần giữ 3 giá trị tốt nhất:
-
flat: đang không giữ vị thế (lời/lỗ đã “chốt” hết) -
longPos: đang giữ LONG (đã mua 1 cổ) -
shortPos: đang giữ SHORT (đã bán khống 1 cổ)
Mỗi ngày ta có thể:
-
mở long từ
flat:flat - price -
đóng long về
flat:longPos + price - fee -
mở short từ
flat:flat + price -
đóng short về
flat:shortPos - price - fee
Phí fee=2 được trừ khi đóng vị thế (tức là khi đổi trạng thái từ long/short về flat).
Kết quả cần “lợi nhuận thực hiện” ⇒ lấy flat ở ngày cuối.
=======================
using System;
class Program
{
static void Main()
{
int[] prices = { 100, 98, 105, 102, 110, 107, 115, 112, 120, 117 };
int fee = 2;
int flat = 0;
int longPos = -prices[0]; // mua ngày 1
int shortPos = prices[0]; // bán khống ngày 1
for (int i = 1; i < prices.Length; i++)
{
int p = prices[i];
int newFlat = flat;
newFlat = Math.Max(newFlat, longPos + p - fee); // đóng long
newFlat = Math.Max(newFlat, shortPos - p - fee); // đóng short
int newLong = Math.Max(longPos, flat - p); // mở long
int newShort = Math.Max(shortPos, flat + p); // mở short
flat = newFlat;
longPos = newLong;
shortPos = newShort;
}
Console.WriteLine(flat); // max profit net, kết thúc flat
}
}
Aucun commentaire:
Enregistrer un commentaire