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 st euro värda kr och y st dollar värda kr.
Vi vill vikta dessa valutor så att värdet i portfolion har vikterna ( , ) där summan alltid är 1
Generellt sett kan då det sökta antalet x skrivas som , 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, = 1, y = 200, = 1 . De sökta vikterna är (0.5, 0.5)
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 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 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
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.
Hej!
Om man generaliserar till fallet med stycken valutor så verkar det som att
du vill bestämma vikterna (där k=1,...,n) sådana att kvoten
är konstant för alla valutor; konstanten är lika med summan
Albiki
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.
Albiki skrev :Hej!
Om man generaliserar till fallet med stycken valutor så verkar det som att
du vill bestämma vikterna (där k=1,...,n) sådana att kvoten
är konstant för alla valutor; konstanten är lika med summan
Albiki
Okej, jag gör en hel generalisering av fallet nu.
Vi antar att vi har olika valutor, där beskriver antalet, och 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.
Vi antar att vi har olika valutor, där
mängdvektorn beskriver antalet för den n:te valutan,
prisvektorn beskriver värdet på den n:te valutan.
viktvektor beskriver hur den n:te valutan fördelad där
Oavsett hur portfolion ser ut, kan vi ta fram en formel för det sökta antalet x, givet vikten.
Skulle vårt förra 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 samt = 1 så ger formeln
det antal som ska säljas istället för , 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.
Efter att ha skrivit om fick jag fram formeln
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 samt kan tänkas betyda vid flera valutor.
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 , där är det gamla antalet vi har och är hur mycket vi köper/säljer och vi definierar
Här antar vi alltså att vi vet om vi köper eller säljer. Ekvationerna vi nu har är att
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
där , den säger att det vi köper/säljer går jämnt ut. Vi kan skriva om den första ekvationen som
Detta är bara ett vanlig linjärt ekvationssystem som man kan lösa (med hjälp av datorn), och lösningen är giltig om 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.
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 , där är det gamla antalet vi har och är hur mycket vi köper/säljer och vi definierar
Här antar vi alltså att vi vet om vi köper eller säljer. Ekvationerna vi nu har är att
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
där , den säger att det vi köper/säljer går jämnt ut. Vi kan skriva om den första ekvationen som
Detta är bara ett vanlig linjärt ekvationssystem som man kan lösa (med hjälp av datorn), och lösningen är giltig om 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 får för värde om är över 0.
EDIT: Är 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 , hur vet jag vilka ä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.
Ja ä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.
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.
Du har att
Så därför får man att
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 ä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 sättas till detta.
ä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 beror på , 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 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 sättas till detta.
Stokastisk skrev :ä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 beror på , 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 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 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 eller , 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...
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å
och
samt vektorn f definierad av
Nu är alltså ekvationssystemet
som går att lösa med Gauss elimination.
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?
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 om du löser det korrekt. Får se om jag orkar slänga ihop ett exempel senare.
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 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.
Säg att vi har tre valutor, och det gäller för alla att . Samt att och vi har även att för enkelhetens skull samt att alla . 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
Samt att
Nu ska vi alltså lösa ekvationssystemet
och gör man det med Gauss elimination så får man att
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.
Stokastisk skrev :Säg att vi har tre valutor, och det gäller för alla att . Samt att och vi har även att för enkelhetens skull samt att alla . 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
Samt att
Nu ska vi alltså lösa ekvationssystemet
och gör man det med Gauss elimination så får man att
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?
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
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?
Ojdå, ser att jag tappade en vikt i definition f ska vara definierad som
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?
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.
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
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.
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
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?
Okej jag får andra lösningar än det där. Jag får att
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
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å
och
samt vektorn f definierad av
Nu är alltså ekvationssystemet
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.
Äh, tusan också det ser ju ut och vara fel i en rad där. Det ska vara
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.
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?
kommer det ju aldrig bli när vi har en 3x3 matris?
Fast i beteckningarna som i inlägget där jag har 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.
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.]]
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.
Nu fungerar allt, tack för all hjälp!