2012-03-20 3 views
1

업데이트 : 다음은 전체 질문 (전체 양식이 약간 복잡함)입니다. 여기에 슈퍼 단순화 된 버전이 있습니다 (이는 내가 묻는 것의 핵심입니다). 내가 49와 17의 무게를 주라고 말하면 66 (49 + 17)을 받아 66을 나누어 계산합니다 (49/66 = 74 %와 17/66 = 26 %). 내 질문은 위의 숫자에 -27을 음수로 추가하면 음수를 사용할 수없는 경우 어떻게 처리하겠습니까?부정적인 수익률로 포트폴리오 가중치를 계산하는 알고리즘?

나는 어떻게 든 전체적인 무게에서 음수를 나타낼 필요가 있지만, 음의 가중치는 내 수를 내고있다. 39 (49 + 17 + -27), 원인 39/39 = 1.25 %, 17/39 = 44 % 및 -27/39 = -69 %이다. 그래서 아래의 예에서 만약 이것이 주식이라면 나는 당신에게 100 달러를 줬습니다.


알고리즘 (또는 논리를 수행하는 방법)을 파악하는 데 문제가 있습니다.

Stock  percent of return    Return 
Blue  .98       50  
Red   .85       20  
Black  .90       -30  

그것은 기본적으로 우리는 50 %의 수익률 0.98 %, 20 %에서 수익의 85 %와 -30에서 수익의 90 % (이 경우 총을 원하는 말을 보고서 우리를 제공 39 %). 나는 이것을 실제 포트폴리오로 어떻게 변환하는지 확신 할 수 없다. (이미 펀드를 갖고 있지 않다면이 금액을 얻기 위해 얼마를 사야 할까?)

저는 이것이 가능하지 않다고 느끼기 시작했습니다.하지만 위의 테이블 (이름, 반환 및 캡처하려는 수익률)과 100 달러를 제공 할 수있는 방법을 기본적으로 묻습니다. 50 %의 주식을 한 개만 주었고 수익의 100 %를 원한다고 말하면 쉽게 단일 주식 100 달러를 살 수 있습니다. 두 주식을 사용하면 총 수익률/가중치를 더할 수 있지만 어떻게 할 수 있습니까? 당신이 포착하고자하는 부정적인 수익을 다루는가?

나는이 권리를 얻지 못하고 있지만 여기까지는 내 논리가있다. (이것이 완전히 잘못 되었다면 무시하고 원하는 것을 제안하십시오.)

Get list of data 
total_return = multiple percent_of_return and return (do this as a recursion for all stocks in the list) 
take total of all items in total_return (using absolute numbers..no negatives so above 39 equals 42) and figure out the weight of each from that. 
multiply these weights by stock price and divide by total to give weight. 

이 결과는 (주 : 93 %로 39 %로 변경 합계)이다

Blue 0.52688172 
red 0.182795699 
black 0.290322581 

문제, (A) 내로 네거티브 가중치를 변환하는 경우 정말 확실 해요 절대 (양) 중량. 나는 수학에 (그리고 최악의 재정으로) 좋지 않지만 부정적인 수익률의 퍼센트를 '사는 방법'을 확신하지 못합니다. (저는 두 가지 데이터 포인트를 얻었지만, 재고가 필요할 경우 다른 데이터로 그것을 풍부하게 할 수 있습니다. 가격 등). 또한이 포트폴리오를 이미 소유하고 있지 않으므로 기존 포트폴리오에 대해 이러한 가중치를 사용할 수는 없습니다. 위의 정보를 지침으로 사용하여 새 포트폴리오를 작성합니다 (알 고를 알아 내야 함). 하기 위해서).

도와주세요!

업데이트 :

overall_total_value = [] 
def test(data_return, datacoeff, data_value): 
    total_results = 0 
    data_total_of_return = {} 
    for x in data_return: 
     current_value = data_return[x] * (datacoeff[x]*.001) 
     data_total_of_return[x] = current_value 
     total_results = total_results + current_value 

    #abs 
    abs_total_value = 0 
    for x in data_total_of_return: 
     #print x, '=', abs(data_total_of_return[x]) 
     abs_total_value = abs_total_value + abs(data_total_of_return[x]) 

    print abs_total_value 
    weight = {} 
    for x in data_total_of_return: 
     weight[x] = abs(data_total_of_return[x]/abs_total_value) 

    total_value = 0 
    for x in weight: 
     valuer = weight[x] * data_value[x] 
     print x, weight[x], '=', valuer 
     total_value = total_value + valuer 

    print 'ABS total % return: ',total_results 
    print total_value 
    overall_total_value.append(total_value) 

    print "*"*30 


data_return = {'Blue':50, 'Red':20, 'Black':-30} 
data_value = {'Blue':10.4, 'Red':4, 'Black':8} 

datacoeff = { "Blue": 78 , "Red": 0 , "Black": 0 , } 
test(data_return, datacoeff, data_value) 
datacoeff = { "Blue": 48 , "Red": 75 , "Black": 0 , } 
test(data_return, datacoeff, data_value) 
datacoeff = { "Blue": 46 , "Red": 80 , "Black": 0 , } 
test(data_return, datacoeff, data_value) 
datacoeff = { "Blue": 38 , "Red": 100 , "Black": 0 , } 
test(data_return, datacoeff, data_value) 
datacoeff = { "Blue": 62 , "Red": 100 , "Black": 40 , } 
test(data_return, datacoeff, data_value) 
datacoeff = { "Blue": 100 , "Red": 20 , "Black": 50 , } 
test(data_return, datacoeff, data_value) 
datacoeff = { "Blue": 98 , "Red": 55 , "Black": 70 , } 
test(data_return, datacoeff, data_value) 
datacoeff = { "Blue": 90 , "Red": 75 , "Black": 70 , } 
test(data_return, datacoeff, data_value) 
datacoeff = { "Blue": 100 , "Red": 65 , "Black": 80 , } 
test(data_return, datacoeff, data_value) 
datacoeff = { "Blue": 98 , "Red": 70 , "Black": 80 , } 
test(data_return, datacoeff, data_value) 
datacoeff = { "Blue": 96 , "Red": 75 , "Black": 80 , } 
test(data_return, datacoeff, data_value) 
datacoeff = { "Blue": 94 , "Red": 80 , "Black": 80 , } 
test(data_return, datacoeff, data_value) 
datacoeff = { "Blue": 92 , "Red": 85 , "Black": 80 , } 
test(data_return, datacoeff, data_value) 
datacoeff = { "Blue": 90 , "Red": 90 , "Black": 80 , } 
test(data_return, datacoeff, data_value) 
datacoeff = { "Blue": 88 , "Red": 95 , "Black": 80 , } 
test(data_return, datacoeff, data_value) 
test(data_return, datacoeff, data_value) 
datacoeff = { "Blue": 98 , "Red": 100 , "Black": 100 , } 
test(data_return, datacoeff, data_value) 
+0

당신이 찾고있는 것이 분명하지 않습니다. @icemanind가 대답 한대로 절대 값을 취하면 "음수 값이 아닌"결과를 얻을 수 있습니다. 나는 수학을 할 때, .527, .183, .290으로 가중치를 얻습니다. 이게 니가 찾고있는거야? 일부 컨텍스트와 정밀도가 더 좋은 대답을 얻는 데 도움이 될 것입니다. 제 생각에 – mfrankli

+0

@mfrankli가 작동 할 수 있습니다. 어떻게 그 숫자를 얻었습니까? abs로 내 forumla을 둘러싼 약간 다른 숫자를 주었다. 기본적으로 나는 위의 숫자를 사용하여 질문에 대답하려고 노력하고 있는데, 어떻게 각각 동일한 구조/결과를 얻을지 알아낼 수 있습니다. 모든 숫자가 사후 적이라면 나는 그것들을 모두 더하고 합계로 나눌 수 있습니다. 그러나 음수는 나를 버리고 있습니다. –

답변

1

내 의견으로는 (또는 데이터에 혼란이 있습니다.)이 모든 것이 잘못되었습니다. 나는 반환 칼럼이 당신이 미리 가지고 있지 않은 것으로 가정한다. 그렇지 않으면, 당신은 말도 안되는 재차 차용을 할 수있다. 기본 이론 : 일부 주식은 긍정적 인 베타 계수 (시장에 포함됨)를 갖고 있고, 다른 주식은 (시장에 반하는) 음의 베타 계수를 가지고 있습니다. 상황에서 당신은 첫 번째 두 종목은 (아마도) 같은 부호와 베타 계수를 가지고 있고 나머지 하나는 반대 부호의 베타 계수를 제안했습니다. 따라서 손실을 줄이기 위해 노력하고 있으므로 손실이 다른 두 주식의 이익으로 상쇄되므로 주식 중 하나가 마이너스 수익을 올리는 것은 정상입니다.

단순성을 위해 100 달러를 투자하려고한다고 가정 해 봅시다.

첫 번째 주식 반납 (.)이 무엇이든간에 .98을 얻고 싶습니다.

둘째 주식의 반환 (.)이 무엇이든간에 .85를 얻고 싶습니다.

세 번째 주식의 반환 값은 .90 (원하는 값)을 얻고 싶습니다.

이제 합계를 1로 조정하고 비율을 유지하면서 원하는 수익을 표준화합시다. $ 포트폴리오의 각각에 대해

당신이 구입하려는 :. 첫 번째 주식의

0.98/(. 98 + 0.85 + 0.90) = 0.358974358974359 $

0.85/(98+ .85 + .90) = 0.31135531135531136 $의 두 번째 주식

.90/(.98 + .85 + .90) = 0.세 번째 주식의 32967032967032966 $

따라서 100 $의 엔 다우먼트를 고려하고 자유롭게 주식의 일부는 각각 투자 할 것을 살 수 있다고 가정 :

$ 35.90, $ 31.14, $ 32.96

을 그리고 마지막으로, () 원하는 수익률 (첫 번째 열)에 마이너스 기호가 표시되면 실제로 주식을 팔지는 못한다는 의미입니다 (즉, 원재료를 차용하여 미래에이를 판매하기를 바랍니다. 높은 가격).

>>> desired_returns = [.98,.85,.9] 
>>> real_weights = [i/sum([abs(j) for j in desired_returns]) for i in desired_returns] 
>>> real_weights 
[0.358974358974359, 0.31135531135531136, 0.32967032967032966] 
>>> cash_available=100 
>>> labels=['blue','red','green'] 
>>> for i in range(len(desired_returns)): 
...  if desired_returns[i]>=0: 
...   print "Buy %s$ of the stock %s" % (cash_available*real_weights[i],labels[i]) 
...  else: 
...   print "Short sell %s$ of the stock %s" % (abs(cash_available*real_weights[i]),labels[i]) 
Buy 35.8974358974$ of the stock blue 
Buy 31.1355311355$ of the stock red 
Buy 32.967032967$ of the stock green 
+0

나는 당신의 논리가 마음에 든다. 나는 지난 시간 동안 그것을 생각하고 놀았지만, 체중을 얻는 정상적인 방법과 약간의 불일치가 있습니다. 당신의 방법을 사용하고 단지 양수 (위의 파란색/빨간색)를 사용하면 파란색을 얻습니다 : 53 % & 빨간색 : 47 %하지만 이전 방식 (특정 값/총 전체 값)을 수행하면 파란색으로 표시됩니다. % & 적색 : 25 %. 그 결과는 너무나 다르게 보입니다. –

+0

잠깐, 샘플 코드를 추가하고 있는데, 실제로 내 포인트를 얻지 못했기 때문입니다. – luke14free

+0

나는 이러한 숫자 중 일부에 원거리 알고리즘을 적용하여 제외하고 같은 결과를 얻으려고합니다.그건 그렇고, 짧은 판매에 대한 귀하의 권리, 긴/짧은 프로그램 제안을 긴 (음수가 아닌) 버전으로 변환하려고합니다. –

0
: 난 항상 여기 내 (파이썬) 코드와 몇 가지 테스트 케이스 (난 그냥이 작업을 수행하는 방법의 논리를 이해하기 위해 프로토 타입있어로서의 무섭게 추한)의 코드에서 배울

전체 수식을 ABS()로 둘러 싸서 절대 값을 반환하면 음수를 제거 할 수 있습니까?

0

귀하의 지위가 짧은 경우 반드시 공유 수는 음수 여야합니다. -ve 값을 가진 주식의 수가 -ve 인 경우 포트폴리오에 + ve 값이 표시됩니다. 하지만 일반적으로 +/- 기호가 일치 할 필요는 없습니다. 가치를 잃어버린 주식을 보유하고 재산에 기여하는 이유는 무엇입니까?

값이 30이 아닌 90 개의 주식을 산다면 2700 개의 집 (또는 현지 통화가 무엇이든)을 잃어버린 것입니다. 개인적으로 포트폴리오의 총 가치에 대한 기여도가 -34.54 %라는 아이디어에 문제가 없습니다. 그러나 귀하의 주식 중 하나가 귀하 포트폴리오의 가치에 100 % 이상 기여하는 것이 다소 이상하다는 점에 동의합니다. 이것은 아마도 당신이 링크 된 질문에 대한 대답에서 주어진 조언을 따르고, 포트폴리오의 보유 가치에 가중치를 부여하고, 음의 값을 완전히 가중시켜야 함을 나타냅니다.

귀하의 경우 결과가 깔끔 해 보이지 않기 때문에 -ve 숫자를 무시하기 시작합니다. -에 포함 된 정보는 포트폴리오 가치를 결정하는 데 필수적입니다. 귀하의 목적에 맞는 원시 정보의 파생어를 선택하십시오. 귀하의 질문과 같이 계산할 때 가중치가 나오는 방식이 마음에 들지 않으면 귀하의 목적에 맞는 다른 통계를 선택하십시오.

+0

나는 네가하는 말을 듣지 만 위의 예와 같은 구조를 갖기 위해 내가 얼마나 오래 살 수 있는지 각자의 주식을 얼마나 많이 가지고 있어야하는지에 대한 질문에 답하려고 노력하고있다. 내가 길게 가면 부정적인 가중치가 나에게 던져진다. (2700 동 손실에 기여하지만 그 무게는 음수가 아니어야한다.) 위의 수익률을 알고 있고 최종 수익률에 기여하는 금액이 얼마인지 100 달러를주고 구매해야한다고 말하면 구조가 쉽게 변환 될 수 있습니까? –

1

지금 당장이 수익을 계산하지 않으려 고합니다. 현재 시장 가치 (즉, 현재 판매중인 경우 현재 위치 (가격 * 크기))를 포함시킬 수 있다면 포트폴리오 내 각 위치의 실제 가중치를 얻을 수 있습니다. 거기에서이 < 1 체중을 당신이 포트폴리오에 투입하는 현금으로 곱하는 것은 간단합니다.

주가에 액세스 할 수있는 경우 해당 가격을 끌어 와서 다음 로직을 사용하십시오.

decimal portfolioAssets; 
Dictionary<stock, decimal> stockAssets = new Dictionary<stock, decimal>(); 
foreach(stock in stocks) 
{ 
    decimal assets = stock.Shares*stockPrice; 
    portfolioAssets =+ assets; 
    stockAssets.Add(stock, assets); 
} 

foreach(stock in stocks) 
{ 
decimal weight = stockAssets[stock]/portfolioAssets; 
//do something with weight 
} 
+0

나는 몇 가지 해답을보고 나서 깨달았다. 나는 가격을 들였지만 위의 가중치를 취하여 합계와 비교하여 평균하는 것은 간단합니다. 또는 내가 그것을 반환에서 제외하고 있기 때문에 그것에 더 많은 것이있다. 또한, 내가 이미이 포트폴리오를 가지고 있지 않다고 가정하면,이 모든 가중치와 x 돈을 투자 할 수 있습니다. 위의 지침을 정확한 지침으로 어떻게 사용합니까? –

+0

주식에 대해 지불 한 평균 가격이 없습니까? 위 예제를 사용하려면 Blue +50이 98입니다. Unfortunatley는 단지 그들이 실제로 가치가있는 것이 아니라 98 개의 주식에 대해 얼마나 많은 돈을 버렸는가를 알려줍니다. 그 98 개의 주식은 1 달러당 1,000 달러가 될 수 있습니다. 이는 포트폴리오에서 Blue의 가중치를 결정할 방법이 없음을 의미합니다. – Chris

+0

아니요. 제가하려고하는 일은 그 수익률이며 각 수익률에서 얻고 자하는 비율은 포트폴리오를 만들 수 있습니까? 나는 기존의 지위를 가지고 있지 않지만 가능한 경우 다른 데이터 (주가, 권 등)를 가져올 수 있습니다. 내가 만든 프로그램은 포트폴리오를 구성하는 방법에 대한 지침으로, 실제 가중치 (x, 검정, 파랑, 빨강)로 변환하는 방법을 모르겠습니다. –

관련 문제