37 svar
245 visningar
auxdes behöver inte mer hjälp
auxdes 23 – Fd. Medlem
Postad: 25 jul 2017 17:28 Redigerad: 25 jul 2017 17:57

Svårt viktningsproblem med avgift

Har stött på ett otroligt svårt viktningsproblem som jag inte kan reda ut på egen hand. Jag kommer först att presentera problemet generellt och sen ge ett exempel.

Anta att vi har x st euro värda vx kr och y st dollar värda vy kr.

Vi vill vikta dessa valutor så att värdet i portfolion har vikterna (wx , wy) där summan alltid är 1

Generellt sett kan då det sökta antalet x skrivas som x =(x·vx+y·vy)·wxvx, y P.S.S

Jag ger ett exempel, för att simplifiera problemet kommer både x och ys värde vara 1
x = 100, vx = 1, y = 200, vy = 1 . De sökta vikterna är (0.5, 0.5)

x =(100·1+200·1)·0.51=150y =(100·1+150·1)·0.51=150 

Då vi tidigare hade 200st y ska vi sälja 50st y
Då vi tidigare hade 100st x ska vi köpa 50st x
Vi gör alltså en försäljning på 50kr och ett köp på 50kr, vilket går ihop
Vi har nu 150x och 150y, då både x och y är värda 1 så kommer värdet vara (150, 150) vilket stämmer med vikten (0.5 , 0.5)


Nu till problemet. Anta att vi har en avgift när vi köper och säljer, låt oss säga 20%.
När vi nu säljer 50st y så kommer vi bara få tillbaka 50*0,8 = 40. 
När vi nu ska köpa x så kommer vi få ut (40*0,8) = 32

Då har vi 150y värda 150kr, men bara 132x värda 132kr. Vikterna blir (0.53, 0.47), ej (0.5, 0.5)

Min tanke är alltså att en variabel för avgift ax  och ay som någonstans måste appliceras för att vi ska köpa och sälja rätt antal.

Jag har med hjälp av excels solver räknat fram att för att ovanstående ekvation ska gå ihop måste  61st y säljas. Vi får då tillbaka 61*0.8 = 49kr
När vi nu ska köpa x så kommer vi få ut (49*0,8)=39.

Vi kommer då ha (200-61)=139st y och (100+39)=139st x, vilket stämmer med vikterna.

I detta specifika fall delades de 50 y som skulle säljas med 0,82.


Någon som kan hjälpa mig nysta ut detta, tanken är att jag ska kunna göra detta på ett oändligt antal valutor.


EDIT

Otroligt bra att skriva en tråd, man tänker på så många nya sätt.

Jag har nu fått fram att om vi delar det som ska säljas med(1+axay)2 så kommer vi få fram hur mycket som ska säljas. 

Nu är problemet hur jag applicerar detta på ett godtyckligt antal valutor, med andra vikter

Bubo 7368
Postad: 25 jul 2017 20:58

Intressant tankeexperiment! Men vad är själva frågan? Och vad är "investerarens" uppgift?

Är tanken att inte förlora kapital när man växlar? Med din avgift på 20% blir man ju snabbt utfattig av att omfördela mellan euro och dollar några gånger.

Albiki 5096 – Fd. Medlem
Postad: 25 jul 2017 21:27

Hej!

Om man generaliserar till fallet med n n stycken valutor så verkar det som att

du vill bestämma vikterna wk w_k (där k=1,...,n) sådana att kvoten

    xk·vkwk \displaystyle x_k\cdot \frac{v_k}{w_k}

är konstant för alla valutor; konstanten är lika med summan x1v1+xnvn. x_1v_1+\cdots x_nv_n.

Albiki

auxdes 23 – Fd. Medlem
Postad: 25 jul 2017 22:03
Bubo skrev :

Intressant tankeexperiment! Men vad är själva frågan? Och vad är "investerarens" uppgift?

Är tanken att inte förlora kapital när man växlar? Med din avgift på 20% blir man ju snabbt utfattig av att omfördela mellan euro och dollar några gånger.

Verkligen, har suttit med den nu i snart 15 timmar.
Bakom detta ligger en relativt avancerad strategi, anledningen till att jag satt avgiften på 20% i exemplet är för att siffrorna ska vara lättare att ta på. I verkligheten är avgiften runt 0,2%.

 

Jag har fortfarande inte kommit fram till något vettigt tyvärr. Ska omformulera mig och försöka få rätt på det sen.

auxdes 23 – Fd. Medlem
Postad: 25 jul 2017 22:13 Redigerad: 25 jul 2017 23:47
Albiki skrev :

Hej!

Om man generaliserar till fallet med n n stycken valutor så verkar det som att

du vill bestämma vikterna wk w_k (där k=1,...,n) sådana att kvoten

    xk·vkwk \displaystyle x_k\cdot \frac{v_k}{w_k}

är konstant för alla valutor; konstanten är lika med summan x1v1+xnvn. x_1v_1+\cdots x_nv_n.

Albiki

Okej, jag gör en hel generalisering av fallet nu.

Vi antar att vi har  n n olika valutor, där xn x_n beskriver antalet, och vn v_n beskriver värdet på valutan.

EDIT: Verkar ej kunna redigera inlägg efter en viss tid och hinner ej fortsätta just nu, så skriver ett nytt inlägg senare.

auxdes 23 – Fd. Medlem
Postad: 25 jul 2017 23:46 Redigerad: 26 jul 2017 01:26

Vi antar att vi har n n olika valutor, där

mängdvektorn x¯ =(x1,....,xn) beskriver antalet för den n:te valutan,
prisvektorn v¯ =(v1,....,vn) beskriver värdet på den n:te valutan.
viktvektor w¯ =(w1,....,wn)  beskriver hur den n:te valutan fördelad där {w:wn+, i=1n wi = 1}

 

Oavsett hur portfolion ser ut, kan vi ta fram en formel för det sökta antalet x, givet vikten.

xkvk =wki=1n xivi  xk =wki=1n xivivk , vk0

Skulle vårt förra xk x_k vara större än nyberäknade ska det säljas, annars köpas.

Allt vore nu frid och fröjd om det inte vore för att det är en transaktionsavgift emellan varje köp och försäljning som påverkar vikterna. 

I tidigare exempel utgick vi från en avgift på 20%, i verkligheten är den mycket mindre, men den fungerar bra för att visualisera.

 Någonstans i dessa formler måste jag få in en variabel med avgiften som sker vid köp och försäljning så att vikterna stämmer efter avgifterna är fråndragna.

 

Om vi sätter vektorn w = (0.5 , 0.5) och x1 x_1 samt x2 x_2 = 1 så ger formeln 
(xförra - xnya )·2(1+a1a2)  det antal som ska säljas istället för (xförra - xnya ), a1 är avgift vid köp och a2 är avgift vid sälj.

Anledningen till att detta fungerar är för att Varför det är så är jag inte helt säker på, det var dock ett samband som kom upp. Behöver hjälp med att hitta hur det fungerar för andra vikter än 0.5, 0.5 och hur det fungerar med flera valutor.

auxdes 23 – Fd. Medlem
Postad: 26 jul 2017 01:47

Efter att ha skrivit om x1-mw1=x2+mw2   fick jag fram formeln m =x1·w2w1(a1a2+w2w1) - x2(a1a2+w2w1)


Denna formel fungerar för två valutor, oavsett vikt, nu återstår alltså bara att göra så att den fungerar med godtyckligt antal valutor.

Det jag då frågar er är om någon kan tänkas förstå vad w2 w_2 samt  x2 x_2 kan tänkas betyda vid flera valutor.

Stokastisk 3597 – Fd. Medlem
Postad: 26 jul 2017 10:03 Redigerad: 26 jul 2017 10:04

Du kommer behöva "veta" vilka du ska sälja och vilka du ska köpa. Så vi ser det som att det nya antalet i varje valuta vi har är yi=xi+dia^i, där xi är det gamla antalet vi har och di är hur mycket vi köper/säljer och vi definierar a^i=1om di<0aiannars

Här antar vi alltså att vi vet om vi köper eller säljer. Ekvationerna vi nu har är att

yivijyjvj=wi 

samt en ekvation jag antar att du vill att den gäller, men du har inte uttryckt den i din fråga, nämligen att

ibividi=0

där bi=aiom di<01annars, den säger att det vi köper/säljer går jämnt ut. Vi kan skriva om den första ekvationen som

a^ivi(1 - wi)di-wijia^jvjdj=-xivi+wijvjxj

Detta är bara ett vanlig linjärt ekvationssystem som man kan lösa (med hjälp av datorn), och lösningen är giltig om di d_i i lösningen matchar med hur vi antog att vi skulle sälja/köpa. Rent praktiskt så skulle man kunna gå igenom alla möjliga kombinationer av köp/sälj (förutsatt att man inte har för många olika valutor dvs) tills man hittar en giltig lösning.

auxdes 23 – Fd. Medlem
Postad: 26 jul 2017 10:31 Redigerad: 26 jul 2017 10:55
Stokastisk skrev :

Du kommer behöva "veta" vilka du ska sälja och vilka du ska köpa. Så vi ser det som att det nya antalet i varje valuta vi har är yi=xi+dia^i, där xi är det gamla antalet vi har och di är hur mycket vi köper/säljer och vi definierar a^i=1om di<0aiannars

Här antar vi alltså att vi vet om vi köper eller säljer. Ekvationerna vi nu har är att

yivijyjvj=wi 

samt en ekvation jag antar att du vill att den gäller, men du har inte uttryckt den i din fråga, nämligen att

ibividi=0

där bi=aiom di<01annars, den säger att det vi köper/säljer går jämnt ut. Vi kan skriva om den första ekvationen som

a^ivi(1 - wi)di-wijia^jvjdj=-xivi+wijvjxj

Detta är bara ett vanlig linjärt ekvationssystem som man kan lösa (med hjälp av datorn), och lösningen är giltig om di d_i i lösningen matchar med hur vi antog att vi skulle sälja/köpa. Rent praktiskt så skulle man kunna gå igenom alla möjliga kombinationer av köp/sälj (förutsatt att man inte har för många olika valutor dvs) tills man hittar en giltig lösning.

Det är helt korrekt antagande att köp och sälj ska gå jämt ut, det är också korrekt antagande att jag vet vad som ska köpas och säljas ska läsa igenom ditt svar ett antal gånger tills jag förstår vad som verkligen händer här. Något jag direkt inte ser är vad ai a_i får för värde om di d_i är över 0.


EDIT: Är  ai a_i avgiften? Tänker att när vi säljer har vi en avgift och när vi köper har vi en avgift, iof så påverkas bara köpet av de båda avgifterna, antar det är därför du sätter avgiften till 1 när vi säljer?


EDIT2: Du säger i sista formeln att jag letar efter en giltig  di d_i , hur vet jag vilka  dj d_j är? Utöver det känner jag att allt är bestämt, även om jag inte är helt säker på att jag förstår vad som händer.

Stokastisk 3597 – Fd. Medlem
Postad: 26 jul 2017 10:45 Redigerad: 26 jul 2017 10:53

Ja ai är avgiften.

Såg att du la till ytterligare en edit, ja jag sätter det till 1 eftersom det påverkar olika beroende på om man köper eller säljer. Om man säljer blir man alltid av med allt, när man köper så får man inte allt.

auxdes 23 – Fd. Medlem
Postad: 26 jul 2017 11:00

Tror min förståelse tappas lite när jag inte riktigt kan se hur vi skriver om den första formeln till den sista. 

Stokastisk 3597 – Fd. Medlem
Postad: 26 jul 2017 11:17

Du har att

yivi-wijyjvj =(xi+dia^i)vi-wij(xj+dja^j)vj=vidia^i-wijdja^jvj + xivi-wijxjvj

Så därför får man att

yivijyjvj=wi yivi-wijyjvj=0 vidia^i-wijdja^jvj=-xivi+wijxjvj a^ivi(1 - wi)di-wijia^jvjdj=-xivi+wijxjvj

auxdes 23 – Fd. Medlem
Postad: 26 jul 2017 11:36 Redigerad: 26 jul 2017 11:37

Nu förstår jag algoritmen helt och dess ursprung. Dock får jag inte den till att fungera.
Jag tror det beror på att jag inte är helt säker på vad dj d_j är, hur ska jag veta hur mycket som ska köpas och säljas innan jag räknar ut det? 

Jag antar att om jag vill att 0,166667 ska finnas i en valuta så ska wi w_i sättas till detta.

Stokastisk 3597 – Fd. Medlem
Postad: 26 jul 2017 11:46

dj är de okända variablerna i ekvationssystemet, så du ska inte sätta dom till någonting, utan du ska lösa ekvationssystemet för dom variablerna.

Jag antar att det som kanske kan förvirrar här är att jag då säger att a^i beror på di, men det var där a priori antagandet om vad som ska säljas/köpas kommer in, om vi antar att vi ska köpa av valuta i så vet vi att di>0 och därför blir det inget problem att lösa ekvationssystemet efter det. Men noter att lösningen även måste vara konsistent med antagandet, så om vi får en lösning som inte stämmer överens med antagandet så är antagandet om vilka vi ska köpa/sälja felaktigt.

Ja, precis om du vill ha att andelen av det totala värdet av valuta i ska vara 0.166667 så ska wi sättas till detta.

auxdes 23 – Fd. Medlem
Postad: 26 jul 2017 11:55 Redigerad: 26 jul 2017 11:56
Stokastisk skrev :

dj är de okända variablerna i ekvationssystemet, så du ska inte sätta dom till någonting, utan du ska lösa ekvationssystemet för dom variablerna.

Jag antar att det som kanske kan förvirrar här är att jag då säger att a^i beror på di, men det var där a priori antagandet om vad som ska säljas/köpas kommer in, om vi antar att vi ska köpa av valuta i så vet vi att di>0 och därför blir det inget problem att lösa ekvationssystemet efter det. Men noter att lösningen även måste vara konsistent med antagandet, så om vi får en lösning som inte stämmer överens med antagandet så är antagandet om vilka vi ska köpa/sälja felaktigt.

Ja, precis om du vill ha att andelen av det totala värdet av valuta i ska vara 0.166667 så ska wi sättas till detta.

Precis, de är okända, och kan anta alla reella värden? Så hur ska jag kunna testa alla värden för alla valutor? Även om vi har tre valutor blir det ju i praktiken omöjligt? Du sa att det var ett linjärt ekvationssystem, förstår inte riktigt hur jag kan få fram något di d_i eller dj d_j , då jag så fort jag ändrar ett av dem kommer alla tidigare beräkningar ändras.

 

Försöker lösa ekv. systemet men får inte riktigt till det...

Stokastisk 3597 – Fd. Medlem
Postad: 26 jul 2017 12:04

Nej dom kan inte anta alla reella värden, eftersom dom inte löser ekvationssystemet för alla reella värden. För att formulera ekvationen lite annorlunda. Om vi har n stycken valutor så har vi matrisen M, definierad av, då i  n

Mij=a^ivi(1 - wi)om i =j-wia^jvjannars

och 

M(n + 1)j=bivi

samt vektorn f definierad av

fi=-xivi+jvjxjom i n0om i = n + 1.

Nu är alltså ekvationssystemet

Md =f

som går att lösa med Gauss elimination.

auxdes 23 – Fd. Medlem
Postad: 26 jul 2017 12:05

Jag verkar nu ha kunnat använda formeln för att få fram hur mycket som ska köpas, då jag har 2 valutor som ska säljas och en som ska köpas. Men hur får jag ut hur mycket som ska säljas? Är tanken att denna formel bara ska ta reda på hur mycket som ska köpas?

Stokastisk 3597 – Fd. Medlem
Postad: 26 jul 2017 12:08
auxdes skrev :

Jag verkar nu ha kunnat använda formeln för att få fram hur mycket som ska köpas, då jag har 2 valutor som ska säljas och en som ska köpas. Men hur får jag ut hur mycket som ska säljas? Är tanken att denna formel bara ska ta reda på hur mycket som ska köpas?

Nej, du kommer få ut alla di om du löser det korrekt. Får se om jag orkar slänga ihop ett exempel senare.

auxdes 23 – Fd. Medlem
Postad: 26 jul 2017 12:34
Stokastisk skrev :
auxdes skrev :

Jag verkar nu ha kunnat använda formeln för att få fram hur mycket som ska köpas, då jag har 2 valutor som ska säljas och en som ska köpas. Men hur får jag ut hur mycket som ska säljas? Är tanken att denna formel bara ska ta reda på hur mycket som ska köpas?

Nej, du kommer få ut alla di om du löser det korrekt. Får se om jag orkar slänga ihop ett exempel senare.

Vore väldigt tacksam för det, har försökt ett antal gånger nu med en mängd data men det går inte riktigt.

Stokastisk 3597 – Fd. Medlem
Postad: 26 jul 2017 12:59 Redigerad: 26 jul 2017 13:05

Säg att vi har tre valutor, och det gäller för alla att wi=13. Samt att x1=100, x2=150, x3=300 och vi har även att vi=1 för enkelhetens skull samt att alla ai=0.8. Nu ska vi sälja av de två senare valutorna och köpa av den första, så sätter man in värde i definitionen för M så får man att

M=0.5333-0.3333-0.333-0.26670.6667-0.333-0.2667-0.33330.666710.80.8

Samt att

f =500-500

Nu ska vi alltså lösa ekvationssystemet

Md =f

och gör man det med Gauss elimination så får man att

d =52.6316-7.8947-57.8947

Vi ska alltså köpa 52.6316 av första valutan, sälja 7.8947 av andra och sälja 57.8947 av tredje. Om du har Matlab så kan jag dela med mig av scriptet jag använde för att sätta ihop det här.

auxdes 23 – Fd. Medlem
Postad: 26 jul 2017 13:21 Redigerad: 26 jul 2017 13:44
Stokastisk skrev :

Säg att vi har tre valutor, och det gäller för alla att wi=13. Samt att x1=100, x2=150, x3=300 och vi har även att vi=1 för enkelhetens skull samt att alla ai=0.8. Nu ska vi sälja av de två senare valutorna och köpa av den första, så sätter man in värde i definitionen för M så får man att

M=0.5333-0.3333-0.333-0.26670.6667-0.333-0.2667-0.33330.666710.80.8

Samt att

f =500-500

Nu ska vi alltså lösa ekvationssystemet

Md =f

och gör man det med Gauss elimination så får man att

d =52.6316-7.8947-57.8947

Vi ska alltså köpa 52.6316 av första valutan, sälja 7.8947 av andra och sälja 57.8947 av tredje. Om du har Matlab så kan jag dela med mig av scriptet jag använde för att sätta ihop det här.

Tack! Nu hoppas jag det kommer gå upp för mig, antar att du menar att x3 = 200, inte 300. 
Tar gärna emot matlab scriptet även om jag aldrig använt matlab.

 

Så som du definierat f, så står det att fi = -  xi*vi + summan av alla x*v. 

I ditt exempel, blir inte f1 då = - 100 + 450 = 350?

Stokastisk 3597 – Fd. Medlem
Postad: 26 jul 2017 13:34

Ja, jag menar 200 inte 300. Nu misshandlar väl pluggakuten indenteringen av scriptet, men här är det iaf

w = [1; 1; 1];
w = w/sum(w);
x = [100; 150; 200];
v = [1; 1; 1];
a = [0.8; 0.8; 0.8];

M = zeros(length(x) + 1, length(x));
f = zeros(length(x) + 1, 1);

ahat = zeros(size(a));


for i = 0:(2^length(x) - 1)
sell = zeros(size(x));
binRep = de2bi(i);
sell(1:length(binRep)) = binRep;
sell = 2*sell - 1;
sellIndex = sell < 0;

ahat(sellIndex) = 1;
ahat(~sellIndex) = a(~sellIndex);

f(1:length(x)) = -x.*v + w * (x' * v);
f(end) = 0;
M(1:length(x), 1:length(x)) = -w * (ahat .* v)';
for j = 1:length(x)
M(j, j) = ahat(j)*v(j)*(1 - w(j));
end

M(end, sellIndex) = v(sellIndex) .* a(sellIndex);
M(end, ~sellIndex) = v(~sellIndex);

solution = M\f;
if ~any(sign(solution .* sell) == -1), break, end
end

M
f
solution
x + ahat .* solution

auxdes 23 – Fd. Medlem
Postad: 26 jul 2017 13:45

Så som du definierat f, så står det att fi = -  xi*vi + summan av alla x*v. 

I ditt exempel, blir inte f1 då = - 100 + 450 = 350?

Stokastisk 3597 – Fd. Medlem
Postad: 26 jul 2017 13:48

Ojdå, ser att jag tappade en vikt i definition f ska vara definierad som

fi=-xivi+wijvjxjom i  n0om i =n + 1.

auxdes 23 – Fd. Medlem
Postad: 26 jul 2017 13:53 Redigerad: 26 jul 2017 13:56

 Tack så hemskt mycket! Nu bör jag reda ut allt. 

En fråga av rent intresse, hur ser du att det är ett linjärt system som du kan ställa upp som en matris? Jag förstod formlerna, och även i matrisrepresentation, men undrar hur man kan se att man kan göra den omvandlingen. Har gått både endim, flerdim och linalg och är lite besviken på att jag ej kan detta bättre.. 

 

Nu tror jag att jag förstår varför det blev fel tidigare, skiljde ej på a och ahat. Anledningen till att vi kan råkna ut det är alltså att vi kombinerar ena funktionen med att summan av bi vi di blir 0?

Stokastisk 3597 – Fd. Medlem
Postad: 26 jul 2017 14:04

Ja, hur ska man säga utan att bli onödigt teknisk, att systemet är linjärt ser man genom att d-variablerna bara dyker upp som "linjär kombinationer". Så när man ser det så vet man omedelbart att man ska leta efter matris representationen (ungefär), för att göra det så är det bara att flytta över alla d-variabler i VL och alla termer som inte innehåller någon d variabel i HL.

auxdes 23 – Fd. Medlem
Postad: 26 jul 2017 17:02 Redigerad: 26 jul 2017 17:26

När jag kör detta i python så verkar det som att vanliga solve funktioner ej fungerar, detta då matrisen är överbestämd(?), hur hanteras det i matlab? Jag kan köra en least squares fitting på lösningen vilket ger mig flera resultat varav ett är exakt det du skrev.

Det som händer sist i koden förstår jag mig inte riktigt på, i övrigt fungerar det suveränt!

solution = M\f;
if ~any(sign(solution .* sell) == -1), break, end
end

M
f
solution
x + ahat .* solution

 



Stokastisk 3597 – Fd. Medlem
Postad: 26 jul 2017 17:19

Egentligen kommer du kunna stryka en av de rader som inte är den rad som säger att köp/sälj ska gå jämnt ut, vilken du stryker kvittar nog, så testa stryka en av ekvationerna och se om du kan använda solver i det fallet.

Att du får fler lösningar med least squares låter som det är något knas, för lösningen är unik, åtminstone i exemplet jag visade, så även least squares lösningen måste vara unik.

I Matlab så löser man ekvationssystemet Mb = f med kommandot M\f, så man får alltså lösningen b = M\f.

När jag skriver if ~and(sign.... det har bara med loopen att göra, jag går igenom alla möjliga sätt man kan köpa eller sälja valutorna. Dvs först testar jag och ser om man får en giltig lösning om man köper alla valutor, sedan ser jag om man får en giltig lösning om man säljer den första valutan men köper resten, osv. Raden med if ~any(sign.... verifierar om lösningen är giltig eller ej, om den är det så avbryter jag sökandet.

Sedan "M.. f ... solution......." det är bara för att Matlab ska skriva ut vektorerna i konsolen.

auxdes 23 – Fd. Medlem
Postad: 26 jul 2017 17:26 Redigerad: 26 jul 2017 17:26

När jag testar med andra vikter är lösningen även något off, Jag testade att bara ändra vikterna till 3/6, 1/6, 2/6 och resultatet jag får är då 

[[ 104.38839849]
[ -70.03783102]
[ -60.44766709]]

Verkar kanske som det är något i mitt program som blivit galet. 
Laddar just nu ner matlab för att kunna testa med ditt program istället.

 

Okej, så om jag redan vet vilka som ska köpas och vilka som ska säljas så behöver jag ej kolla detta.

Slutligten, vad ger

x + ahat .* solution

auxdes 23 – Fd. Medlem
Postad: 26 jul 2017 17:33

 Testade att stryka en av raderna i M, dock blir då F för stor, så behöver stryka en rad där också. Tyvärr fick jag ej fram några vettiga svar. Hur kan du utläsa vilken av radera som säger att köp och sälj ska gå jämnt ut? Skulle det vara den sista i M?

Stokastisk 3597 – Fd. Medlem
Postad: 26 jul 2017 17:33

Okej jag får andra lösningar än det där. Jag får att

d =121.9512-84.1463-68.2927

det verkar åtminstone stämma att man får rätt proportioner på valutorna med detta. Jag skulle ju kunna kolla på python koden och se om jag ser något fel. Sista raden med x + ahat .* solution beräknar y vektorn, alltså hur mycket man har av varje valuta efter man köpt/sålt. Om man redan vet vilka valutor man ska sälja/köpa av så kan man modifiera scriptet till

w = [3; 1; 2];
w = w/sum(w);
x = [100; 150; 200];
v = [1; 1; 1];
a = [0.8; 0.8; 0.8];

M = zeros(length(x), length(x));
f = zeros(length(x), 1);

ahat = zeros(size(a));
sell = [1 -1 -1]; %Sätt -1 på de som ska säljas och 1 på de som ska köpas.

ahat(sellIndex) = 1;
ahat(~sellIndex) = a(~sellIndex);

f(1:length(x)) = -x.*v + w * (x' * v);
f(end) = 0;
M(1:length(x), 1:length(x)) = -w * (ahat .* v)';
for j = 1:length(x)
M(j, j) = ahat(j)*v(j)*(1 - w(j));
end

M(end, sellIndex) = v(sellIndex) .* a(sellIndex);
M(end, ~sellIndex) = v(~sellIndex);

solution = M\f;

M
f
solution
y = x + ahat .* solution

auxdes 23 – Fd. Medlem
Postad: 26 jul 2017 17:47
Stokastisk skrev :

Nej dom kan inte anta alla reella värden, eftersom dom inte löser ekvationssystemet för alla reella värden. För att formulera ekvationen lite annorlunda. Om vi har n stycken valutor så har vi matrisen M, definierad av, då i  n

Mij=a^ivi(1 - wi)om i =j-wia^jvjannars

och 

M(n + 1)j=bivi

samt vektorn f definierad av

fi=-xivi+jvjxjom i n0om i = n + 1.

Nu är alltså ekvationssystemet

Md =f

som går att lösa med Gauss elimination.

Stämmer ovan med i och j? Har märkt att jag på 1/3, 1/3, 1/3 versionen kan byta ut i mot j utan att det påverkar resultatet.

Stokastisk 3597 – Fd. Medlem
Postad: 26 jul 2017 17:55 Redigerad: 26 jul 2017 17:56

Äh, tusan också det ser ju ut och vara fel i en rad där. Det ska vara

M(n + 1)j=bjvj

men detta kanske du insåg? Men annars ser det rätt ut (bortsett från den felaktiga definitionen av f), tycker jag, men det kanske finns något ytterligare slarvfel där som jag inte ser.

auxdes 23 – Fd. Medlem
Postad: 26 jul 2017 18:00 Redigerad: 26 jul 2017 18:01

i din första kod skriver du

M = zeros(length(x)+1, length(x));

f = zeros(length(x)+1, 1);

och i din andra

M = zeros(length(x), length(x));
f = zeros(length(x), 1);

Är det för att jag vet vad jag ska sälja och köpa som vi kan ta bort den sista?

 

Mn+1 M_n+1 kommer det ju aldrig bli när vi har en 3x3 matris?

Stokastisk 3597 – Fd. Medlem
Postad: 26 jul 2017 18:05

Fast i beteckningarna som i inlägget där jag har M(n + 1)j så kommer M vara en 4x3 matris. Vi har fyra ekvationer och tre okända. Men som jag kommenterade lite tidigare så går ju en av de tre första ekvationerna att stryka.

Att jag ändrat i koden från length(x) + 1 till bara length(x) har att göra med att jag bestämde mig för att stryka den näst sista ekvationen.

auxdes 23 – Fd. Medlem
Postad: 26 jul 2017 18:16

Precis! Så jag borde bara kunna stryka näst sista i både M och f.

I första exemplet fick vi

[[ 0.53333333 -0.26666667 -0.26666667]
[-0.33333333 0.66666667 -0.33333333]
[-0.33333333 -0.33333333 0.66666667]
[ 1. 0,8. 0,8. ]]


[[ 50.]
[ 0.]
[-50.]
[ 0.]]

Istället borde jag alltså kunna lösa systemet

[[ 0.53333333 -0.26666667 -0.26666667]
[-0.33333333 0.66666667 -0.33333333]]
[ 1. 0,8. 0,8. ]]


[[ 50.]
[ 0.]
[ 0.]]

Stokastisk 3597 – Fd. Medlem
Postad: 26 jul 2017 18:22

Fast det där ser ut som du har vänt i och j fel. Den övre 3x3 delen av matrisen i det du har där bör vara transponerat.

auxdes 23 – Fd. Medlem
Postad: 26 jul 2017 18:33

Nu fungerar allt, tack för all hjälp!

Svara
Close