6.5デポジットが必要ですか? Moex APIと配当パーサーを使用した、株式の収益率と完全な収益性の計算

以下のテキストについて少し







最も怠portfolioなポートフォリオ投資家は通常これを行います:彼は財務マネージャーに行き、一緒に投資家プロファイルを作成し、このプロファイルに基づいて、ポートフォリオ投資家が受け入れる準備ができているリスク/リターン指標に対応する資産のポートフォリオを収集します。



投資家が非常に長期であり、ポートフォリオが正しく構成されている場合、いつでも価格を問わずに有価証券を購入できます。10年の期間は、配当の支払いによる差を平準化します(もちろん、一定のキャッシュフローを持つ有価証券を探す必要があります)。

証券を見つける必要がある状況を考えてみましょう(以下、特定の種類の証券を意味します-株式、すべてが債券で明確であり、クーポンがあります)、配当の形であなたの財務計画を満たすキャッシュフローをもたらします。 最も簡単な例は、キャッシュフローがインフレ値を超える株式を見つけることです。 4%(Rosstatによる)



このリスク/リターンペアからの2番目の要因、つまりリターン自体を見てみましょう。



株式の利回りは、証券 を購入した瞬間から得られる利益の種類を評価できる指標です。 株式が投資家に損失をもたらした場合、収益性はプラスだけでなくマイナスにもなります。 一般に、在庫返品は次の簡単な式を使用して計算されます。











アグリゲーター



必要なデータが既に含まれているリソースをいくつか紹介します。 証券の利回りに関するデータと、それらを購入する際に注意を払う必要がある要因が含まれています。 私自身も定期的にこれらのリソースを見ています: Income.ruおよびSmartlab投資セクション



それらを安全に使用できますが、特定のプロセスを自動化するタスクを設定し、特定の可能な期間の配当支払いに関するデータを処理できるようにしました。



パーサーを書く



いくつかのオプションを試した後、phpQueryに決めましたが、その前にSimple HTML DOMにパーサーを実装しようとしました。 結果は非常に長い時間処理されたため、変更する必要がありました。 Investfunds.ruのParsimデータ



パーサーコード
public function getDivsFromCode($code){ //  -    ,   . include_once './phpQuery.php'; if ( $curl = curl_init () ) //  { curl_setopt ($curl, CURLOPT_URL, 'http://stocks.investfunds.ru/stocks/'.$code.'/dividend/');//   curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($curl, CURLOPT_POST, true); curl_setopt ($curl, CURLOPT_HEADER, 0); $result = curl_exec ($curl);//  curl_close ($curl);//  } $html = phpQuery::newDocumentHTML($result); phpQuery::selectDocument($html); $a = [1,3,5]; //      (,    ) $emitent_string = htmlentities(pq('h1')->text(),ENT_COMPAT,'UTF-8'); if ($emitent_string === ""){ $divs['emitent'] = ' '; return $divs; } $re = ['  , ', '  , ','  ','  ']; $emi = str_replace($re,'',$emitent_string); $divs['emitent'] = $emi; $divs['code'] = $code; /*  ,   */ $i = pq('[cellpadding="0"] tr td:nth-child(1)'); $l = substr_count($i,'td style'); /*,     */ if ($l === 0){ $divs['data']= 'No divs'; return $divs; } /******     css************************/ for ($i =3;$i<$l+3;$i++){ foreach ($a as $j){ switch ($j) { case 1: $divs['data'][$i-2]['year'] = str_replace(' ','',htmlentities(pq("[cellpadding='0'] tr:nth-child($i) td:nth-child($j)")->text(),ENT_COMPAT,'UTF-8')); break; case 3: $divs['data'][$i-2]['date'] = str_replace(' ','',htmlentities(pq("[cellpadding='0'] tr:nth-child($i) td:nth-child($j)")->text(),ENT_COMPAT,'UTF-8')); break; case 5: $string = htmlentities(pq("[cellpadding='0'] tr:nth-child($i) td:nth-child($j)")->text(),ENT_SUBSTITUTE,'UTF-8'); $re = '/[ \s]|[]/'; $divs['data'][$i-2]['price'] = (float)preg_replace($re,'',$string); break; default: break; } } } /* ,      ,  ,      */ return $divs; }
      
      







関数の結果は、1つの発行者のデータを含む配列になります。 次に、結果をCompanies.jsonにインポートします



輸入
 $divs = $emitent->getDivsFromCode($i); if ($divs['emitent'] != ' '){ array_push($json_div, $divs); } } file_put_contents('companies_part1.json',json_encode($json_div,JSON_UNESCAPED_UNICODE));
      
      







配列の例
 [{"emitent":", (RU0009071187, AVAZ)", "code":3, "data": {"1": {"year":"2007","date":"16.05.2008","price":0.29}, "2": {"year":"2006","date":"06.04.2007","price":0.1003}, "3": {"year":"2005","date":"07.04.2006","price":0.057} } }]
      
      







パーサーの短所:最初は、約1000ページを解析する必要があると思っていました。 しかし、その後、発行者の1つが見つからなかったため、解析を続行することにし、5kページ後でも何かが発生する可能性があることが判明しました。 解決策は、処理速度を上げるためにmulticurlを使用してパーサーを書き換えることです。 それ以前は、私の手は届きませんでしたが(読み始めました)、正しい方法で、それをするだけの価値があるでしょう。 読者の一人が助けてくれるかもしれません。 この場合も、ディーバのいるベースは半年ごとに更新できます。 これは、年次返品を行う場合に十分です。


返品率と購入時からの在庫の完全な返品を計算します



私はすでに上記の式を与えました。 自動化のために、手動で入力された初期データを使用し、必要なインジケーターを考慮するスクリプトを作成しました。



 $name = 'GAZP'; //  $year_buy = 2015; //   $buy_price = 130; //   $year_last_div = 2016; //    $v_need = 4; // 
      
      





便宜上、小さな関数を作成しました。 ティッカーによってjsonで発行者データを見つけます



ティッカー検索
 public function getDivsFromName($name){ $file = file_get_contents('companies.json'); $array = json_decode($file,true); foreach ($array as $emitent) { if ((stristr($emitent['emitent'],$name))&&(!stristr($emitent['emitent'],$name.'-'))){ return $emitent; } } }
      
      







これで、関心のあるデータを計算できます。 現在の価格( $ today_price変数)を取得するには、 前回の投稿で書いた関数と、Moscow Exchange APIを使用する関数を使用します。 すべての式はこの記事から引用されています。



 $emitent = new emitent(); $v_today; //  ; $v_need = $v; //  ; $div = $emitent->getDivsFromName($name); $sum = $emitent->getSumDivs($year_buy, $div); $last_div = $emitent->getSumDivs($year_last_div, $div,1); //  c   /*r = (D + (P1 - P0))/P0 * 100% * P0 -   * P1 -   * D -   * */ $today_price = $emitent->getPrice($name, '.json'); $r = ($sum + ($today_price-$buy_price))/$buy_price*100; $v_today = $last_div/$today_price*100; $P = ($last_div/$v_need)*100; //  
      
      





今、結果の少し分析。 例として、INDEX MSCI RUSSIAを含む2つの大企業を取り上げます。



ガスプロム





とアロサ(2015年に60ルーブルでそれを取ったとしましょう。)







ご覧のように、ガスプロムの株価は実際には購入価格と変わらないという事実にもかかわらず、配当により12%の利回りが残っています。 Alrosaはさらに良くなっています。 銀行リストのトップ50のbank.ruサイトからの預金のレートの収益性を再計算できます。 今、銀行は私たちに6.5%を与えます











したがって、このように、必要な収益率を変えることで、現在の株価がニーズと財務目標を満たしているかどうかを理解できます。



前回の記事と同様に、これは意思決定に影響を与える要因の1つを見つけたことにすぎないことに注意してください。


多くの投資家は上記の計算をExcelで行います。 このツールは、利益、キャッシュフローなどを計算するための多くの式を提供します。 しかし、私の目標は、配当データの収集とこのデータの自動処理を自動化することでした。

今回は、理論が非常に広範囲にわたるため、この記事の理論とコードは少なくなり、この問題をポートフォリオ構築の一般理論に結び付けるために、一連の記事を書く必要があります。 はい。Habr形式は純粋に投資記事を書くことを意味するものではありません。特に現在、ネットワークの広大さに多くの記事があります。



前の記事

ご清聴ありがとうございました!



All Articles