├── .gitignore ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── faq.md ├── introduction-to-risks.md ├── lists.md ├── mobilization-resistance.md ├── relocation.md ├── sanctions-risks-in-cryptocurrency.md └── src ├── binance_open_data.ipynb ├── cryptocurrency_portfolio__assets_selection.py ├── fx_currencies_analysis.Rmd ├── fx_currencies_analysis.md ├── fx_currencies_analysis_files └── figure-gfm │ └── unnamed-chunk-3-1.png ├── fx_currency_portfolio__assets_selection.ipynb └── fx_currency_portfolio__assets_selection.py /.gitignore: -------------------------------------------------------------------------------- 1 | /data/*.csv 2 | /data/*.zip 3 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # How to contribute? 2 | 3 | *Welcome on board!* 4 | 5 | If U have useful stuff related to this project's Objectives, feel free to create a branch(es) from `main`. Then just add content and [Pull request](https://github.com/codez0mb1e/resistance/pulls) changes. 6 | 7 | Thanks in advance :tada:! 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Creative Commons Legal Code 2 | 3 | CC0 1.0 Universal 4 | 5 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE 6 | LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN 7 | ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS 8 | INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES 9 | REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS 10 | PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM 11 | THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED 12 | HEREUNDER. 13 | 14 | Statement of Purpose 15 | 16 | The laws of most jurisdictions throughout the world automatically confer 17 | exclusive Copyright and Related Rights (defined below) upon the creator 18 | and subsequent owner(s) (each and all, an "owner") of an original work of 19 | authorship and/or a database (each, a "Work"). 20 | 21 | Certain owners wish to permanently relinquish those rights to a Work for 22 | the purpose of contributing to a commons of creative, cultural and 23 | scientific works ("Commons") that the public can reliably and without fear 24 | of later claims of infringement build upon, modify, incorporate in other 25 | works, reuse and redistribute as freely as possible in any form whatsoever 26 | and for any purposes, including without limitation commercial purposes. 27 | These owners may contribute to the Commons to promote the ideal of a free 28 | culture and the further production of creative, cultural and scientific 29 | works, or to gain reputation or greater distribution for their Work in 30 | part through the use and efforts of others. 31 | 32 | For these and/or other purposes and motivations, and without any 33 | expectation of additional consideration or compensation, the person 34 | associating CC0 with a Work (the "Affirmer"), to the extent that he or she 35 | is an owner of Copyright and Related Rights in the Work, voluntarily 36 | elects to apply CC0 to the Work and publicly distribute the Work under its 37 | terms, with knowledge of his or her Copyright and Related Rights in the 38 | Work and the meaning and intended legal effect of CC0 on those rights. 39 | 40 | 1. Copyright and Related Rights. A Work made available under CC0 may be 41 | protected by copyright and related or neighboring rights ("Copyright and 42 | Related Rights"). Copyright and Related Rights include, but are not 43 | limited to, the following: 44 | 45 | i. the right to reproduce, adapt, distribute, perform, display, 46 | communicate, and translate a Work; 47 | ii. moral rights retained by the original author(s) and/or performer(s); 48 | iii. publicity and privacy rights pertaining to a person's image or 49 | likeness depicted in a Work; 50 | iv. rights protecting against unfair competition in regards to a Work, 51 | subject to the limitations in paragraph 4(a), below; 52 | v. rights protecting the extraction, dissemination, use and reuse of data 53 | in a Work; 54 | vi. database rights (such as those arising under Directive 96/9/EC of the 55 | European Parliament and of the Council of 11 March 1996 on the legal 56 | protection of databases, and under any national implementation 57 | thereof, including any amended or successor version of such 58 | directive); and 59 | vii. other similar, equivalent or corresponding rights throughout the 60 | world based on applicable law or treaty, and any national 61 | implementations thereof. 62 | 63 | 2. Waiver. To the greatest extent permitted by, but not in contravention 64 | of, applicable law, Affirmer hereby overtly, fully, permanently, 65 | irrevocably and unconditionally waives, abandons, and surrenders all of 66 | Affirmer's Copyright and Related Rights and associated claims and causes 67 | of action, whether now known or unknown (including existing as well as 68 | future claims and causes of action), in the Work (i) in all territories 69 | worldwide, (ii) for the maximum duration provided by applicable law or 70 | treaty (including future time extensions), (iii) in any current or future 71 | medium and for any number of copies, and (iv) for any purpose whatsoever, 72 | including without limitation commercial, advertising or promotional 73 | purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each 74 | member of the public at large and to the detriment of Affirmer's heirs and 75 | successors, fully intending that such Waiver shall not be subject to 76 | revocation, rescission, cancellation, termination, or any other legal or 77 | equitable action to disrupt the quiet enjoyment of the Work by the public 78 | as contemplated by Affirmer's express Statement of Purpose. 79 | 80 | 3. Public License Fallback. Should any part of the Waiver for any reason 81 | be judged legally invalid or ineffective under applicable law, then the 82 | Waiver shall be preserved to the maximum extent permitted taking into 83 | account Affirmer's express Statement of Purpose. In addition, to the 84 | extent the Waiver is so judged Affirmer hereby grants to each affected 85 | person a royalty-free, non transferable, non sublicensable, non exclusive, 86 | irrevocable and unconditional license to exercise Affirmer's Copyright and 87 | Related Rights in the Work (i) in all territories worldwide, (ii) for the 88 | maximum duration provided by applicable law or treaty (including future 89 | time extensions), (iii) in any current or future medium and for any number 90 | of copies, and (iv) for any purpose whatsoever, including without 91 | limitation commercial, advertising or promotional purposes (the 92 | "License"). The License shall be deemed effective as of the date CC0 was 93 | applied by Affirmer to the Work. Should any part of the License for any 94 | reason be judged legally invalid or ineffective under applicable law, such 95 | partial invalidity or ineffectiveness shall not invalidate the remainder 96 | of the License, and in such case Affirmer hereby affirms that he or she 97 | will not (i) exercise any of his or her remaining Copyright and Related 98 | Rights in the Work or (ii) assert any associated claims and causes of 99 | action with respect to the Work, in either case contrary to Affirmer's 100 | express Statement of Purpose. 101 | 102 | 4. Limitations and Disclaimers. 103 | 104 | a. No trademark or patent rights held by Affirmer are waived, abandoned, 105 | surrendered, licensed or otherwise affected by this document. 106 | b. Affirmer offers the Work as-is and makes no representations or 107 | warranties of any kind concerning the Work, express, implied, 108 | statutory or otherwise, including without limitation warranties of 109 | title, merchantability, fitness for a particular purpose, non 110 | infringement, or the absence of latent or other defects, accuracy, or 111 | the present or absence of errors, whether or not discoverable, all to 112 | the greatest extent permissible under applicable law. 113 | c. Affirmer disclaims responsibility for clearing rights of other persons 114 | that may apply to the Work or any use thereof, including without 115 | limitation any person's Copyright and Related Rights in the Work. 116 | Further, Affirmer disclaims responsibility for obtaining any necessary 117 | consents, permissions or other rights required for any use of the 118 | Work. 119 | d. Affirmer understands and acknowledges that Creative Commons is not a 120 | party to this document and has no duty or obligation with respect to 121 | this CC0 or use of the Work. 122 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Антикризисный риск-менеджмент 2 | 3 | [![Contributors Welcome](https://img.shields.io/badge/contributing-welcome-blue.svg)](CONTRIBUTING.md) 4 | [![GitHub license](https://img.shields.io/badge/license-CC0-blue.svg)](LICENSE) 5 | 6 | ***Снижаем персональные риски в условиях кризиса***. 7 | 8 | --- 9 | 10 | В проекте: 11 | 12 | :heavy_plus_sign: Рассматривается использование *исключительно экономических или юридических* методов для минимизации *персональных рисков*. 13 | 14 | :heavy_minus_sign: *Не* рассматривается использование никаких *политических* методов: они важны для общества, но увеличивают риски для индивидуума. 15 | 16 | :heavy_check_mark: Берегите себя. Не нарушайте законы юрисдикции(й), в которой(ых) живете. 17 | 18 | --- 19 | 20 | > :information_source: Содержимое проекта носит исключительно образовательный характер и не является рекомендацией к каким-либо действиям. Учитывайте, что к моменту прочтения часть информации может устареть. 21 | 22 | ## :newspaper: **Последние обновления** 23 | 24 | **Октябрь 2020:** 25 | 26 | - :heavy_exclamation_mark: Начата работа над [списком мер для снижения риска быть незаконно мобилизованным](#мобилизация) 27 | - :heavy_exclamation_mark: Начата работа над [Иммиграция: экстренная и плановая](#иммиграция) 28 | 29 | Июнь 2022: 30 | 31 | - Обновлены [требования к брокерам](lists.md#требования-к-брокерам) 32 | - Обновлена информация [по блокировкам со стороны Coinbase](lists.md#криптобиржи) 33 | - Обновлена информация [VPN сервисам](lists.md#vpn-cервисы). 34 | 35 | Апрель-мaй 2022: 36 | 37 | - Расширенное сравнение для: 38 | - [стейблкоинов](lists.md#stablecoins) 39 | - [VPN сервисов](lists.md#vpn) 40 | - [кошельков](lists.md#некастодиальные-кошельки). 41 | - Для формирования низкорискованного валютного портфеля: 42 | - добавил скрипт [анализа волатильности валют](src/fx_currencies_analysis.md) 43 | - добавил скрипт [моделирования цен валют с использованием метода Монте-Карло](src/fx_currency_portfolio__assets_selection.ipynb). 44 | 45 | --- 46 | 47 | ## Мобилизация 48 | 49 | Список мер для снижения риска быть незаконно мобилизованным: 50 | 51 | - [Кому попытаются вручить повестку?](mobilization-resistance.md#кому-попытаются-вручить-повестку) 52 | - [Если ищут коллекторы...](mobilization-resistance.md#если-ищут-коллекторы) 53 | - [Когда пытаются вручить повестку...](mobilization-resistance.md#когда-пытаются-вручить-повестку) 54 | - [Когда вручили повестку...](mobilization-resistance.md#когда-вручили-повестку) 55 | - [В военкомате...](mobilization-resistance.md#в-военкомате) 56 | - [:telephone_receiver: Экстренные контакты](mobilization-resistance.md#telephone_receiver-экстренные-контакты) 57 | - [:link: Полезные ссылки](mobilization-resistance.md#link-полезные-ссылки) 58 | 59 | ## Иммиграция 60 | 61 | Чек-лист по подготовке к экстренной и плановой релокации: 62 | 63 | - [Документы](relocation.md#документы) 64 | - [Первоочередные документы](relocation.md#первоочередные-документы) 65 | - [Дополнительные документы](relocation.md#дополнительные-документы) 66 | - [Для получение рабочей визы/ВНЖ](relocation.md#для-получение-рабочей-визывнж) 67 | - [Экстренная релокация](relocation.md#экстренная-релокация) 68 | - [Подготовка](relocation.md#подготовка) 69 | - [В аэропорту/на границе](relocation.md#в-аэропортуна-границе) 70 | - [В стране иммиграции](relocation.md#в-стране-иммиграции) 71 | - [Плановая релокация](relocation.md#плановая-релокация) 72 | - [Подготовка](relocation.md#подготовка-1) 73 | - [:link: Полезные ссылки](relocation.md#link-полезные-ссылки) 74 | 75 | ## Личные финанcы условиях санкций 76 | 77 | Риск-менеджмент личных финансов условиях санкций и/или финансового кризиса: 78 | 79 | - [Глупые стратегии и большие риски](introduction-to-risks.md#глупые-стратегии-и-большие-риски) 80 | - [Сценарий I: «Черный день»](introduction-to-risks.md#сценарий-i-черный-день) 81 | - [Цель](introduction-to-risks.md#цель) 82 | - [План](introduction-to-risks.md#план) 83 | - [Сроки](introduction-to-risks.md#сроки) 84 | - [Сценарий II: Блэкаут](introduction-to-risks.md#сценарий-ii-блэкаут) 85 | - [Цель](introduction-to-risks.md#цель-1) 86 | - [План](introduction-to-risks.md#план-1) 87 | - [Сроки](introduction-to-risks.md#сроки-1) 88 | - [Сценарий III: Утрата сбережений](introduction-to-risks.md#сценарий-iii-утрата-сбережений) 89 | - [Цель](introduction-to-risks.md#цель-2) 90 | - [План](introduction-to-risks.md#план-2) 91 | - [Сроки](introduction-to-risks.md#сроки-2) 92 | - [Итак...](introduction-to-risks.md#итак) 93 | - [~~Общее~~ Важное](introduction-to-risks.md#общее-важное) 94 | - [:link: Полезные ссылки](introduction-to-risks.md#link-полезные-ссылки) 95 | 96 | ## Инвестиции в криптовалюту в условии санкций 97 | 98 | Риск-менеджмент инвестиций в криптовалюту в условии санкций: 99 | 100 | - [:date: Важные новости](sanctions-risks-in-cryptocurrency.md#date-важные-новости) 101 | - [TL;DR](sanctions-risks-in-cryptocurrency.md#tldr) 102 | - [0. Правила игры (подготовка)](sanctions-risks-in-cryptocurrency.md#0-правила-игры-подготовка) 103 | - [1. Что хранить?](sanctions-risks-in-cryptocurrency.md#1-что-хранить) 104 | - [Криптовалюта со свободным курсом](sanctions-risks-in-cryptocurrency.md#криптовалюта-со-свободным-курсом) 105 | - [Стейблкоин](sanctions-risks-in-cryptocurrency.md#стейблкоин) 106 | - [:pushpin: Что хранить... а что не стоит](sanctions-risks-in-cryptocurrency.md#pushpin-что-хранить-а-что-не-стоит) 107 | - [2. Где хранить?](sanctions-risks-in-cryptocurrency.md#2-где-хранить) 108 | - [Биржи](sanctions-risks-in-cryptocurrency.md#биржи) 109 | - [Кошельки](sanctions-risks-in-cryptocurrency.md#кошельки) 110 | - [:pushpin: Где хранить... а где не стоит](sanctions-risks-in-cryptocurrency.md#pushpin-где-хранить-а-где-не-стоит) 111 | - [Итак](sanctions-risks-in-cryptocurrency.md#итак) 112 | - [:link: Полезные ссылки](sanctions-risks-in-cryptocurrency.md#link-полезные-ссылки) 113 | 114 | ## Важные списки 115 | 116 | Наиболее полезные списки: 117 | 118 | - [Законодательные акты](lists.md#законодательные-акты) 119 | - [Ограничения по операция с иностранной валюты](lists.md#ограничения-по-операция-с-иностранной-валюты) 120 | - [Список недружественных государств](lists.md#список-недружественных-государств) 121 | - [Полезные ссылки](lists.md#полезные-ссылки) 122 | - [Список надежных российских банков.](lists.md#список-надежных-российских-банков) 123 | - [Требования к банкам](lists.md#требования-к-банкам) 124 | - [Банки под санкциями](lists.md#банки-под-санкциями) 125 | - [Список надежных банков](lists.md#список-надежных-банков) 126 | - [Полезные ссылки](lists.md#полезные-ссылки-1) 127 | - [Список надежных российских брокеров](lists.md#список-надежных-российских-брокеров) 128 | - [Иностранные брокеры](lists.md#иностранные-брокеры) 129 | - [Российские брокеры](lists.md#российские-брокеры) 130 | - [Полезные ссылки](lists.md#полезные-ссылки-2) 131 | - [Надежные почтовые сервисы](lists.md#надежные-почтовые-сервисы) 132 | - [Российские почтовые сервисы](lists.md#российские-почтовые-сервисы) 133 | - [Иностранные почтовые сервисы](lists.md#иностранные-почтовые-сервисы) 134 | - [Криптовалюты](lists.md#криптовалюты) 135 | - [Stablecoins](lists.md#stablecoins) 136 | - [Некастодиальные кошельки](lists.md#некастодиальные-кошельки) 137 | - [Криптобиржи](lists.md#криптобиржи) 138 | - [Сервисы поиска обменников](lists.md#сервисы-поиска-обменников) 139 | - [VPN](lists.md#vpn) 140 | - [VPN cервисы](lists.md#vpn-cервисы) 141 | - [Другие инструменты обхода блокировок](lists.md#другие-инструменты-обхода-блокировок) 142 | - [Полезные ссылки](lists.md#полезные-ссылки-3) 143 | - [Список софта](lists.md#список-софта) 144 | -------------------------------------------------------------------------------- /faq.md: -------------------------------------------------------------------------------- 1 | # Часто задаваемые вопросы 2 | 3 | **Для наличных средств**: 4 | 5 | - [В какой валюте хранить наличные средства?](#в-какой-валюте-хранить-наличные-средства) 6 | - [Как выбрать соотношение рублей, иностранной валюты для наличных средств?](#как-выбрать-соотношение-рублей-иностранной-валюты-для-наличных-средств) 7 | 8 | --- 9 | 10 | :information_source: Для российских банков и брокеров только. 11 | 12 | ### В какой валюте хранить наличные средства? 13 | 14 | Для электронных наличных средств (на банковском или брокерском счете): храните рублях и валюте, которую вы быстро (в течение дня) можете обменять в банке или у брокера. На сентябрь 2022 года это `CNY` (китайский юань). Хранение `USD` (американский доллар) и `EUR` (евро) сопряжено с высокими рисками и дополнительными комиссионными расходами. 15 | 16 | ### Как выбрать соотношение рублей, иностранной валюты для наличных средств? 17 | 18 | Оценить вероятность, что ЦБ введет фиксированный курс с одновременным запретом покупки/продажи валюты на открытом рынке. 19 | 20 | Чем выше эта вероятность, тем бОльшая доля наличных средств в рублях должна быть в корзине; максимальную долю рублей имеет смысл ограничиться 80%. 21 | 22 | Чем ниже эта вероятность, тем бОльшая доля наличных средств в иностранной валюте должна быть. Минимальная долю рубля имеет смысл ограничить 30%. 23 | 24 | ### Как сформировать низкорискованный валютный портфель? 25 | 26 | :warning: После сентября 2022 - неактуально. 27 | 28 | 1. [Проанализируйте волатильности валют](src/fx_currencies_analysis.md) на основе исторических данных и выберете те, риски по которым ниже рублевых. 29 | 2. [Смоделируйте цены валют](src/fx_currency_portfolio__assets_selection.ipynb), выбранных на шаге 1, с использованием метода Монте-Карло. 30 | 3. Основываясь на результатах моделирования, выберите наиболее подходящие Вам по соотношению доходность/риски валютные пары. 31 | -------------------------------------------------------------------------------- /introduction-to-risks.md: -------------------------------------------------------------------------------- 1 | # Россия 2022: как не потерять все? 2 | 3 | ![Status](https://img.shields.io/badge/status-нуждается_в_актуализации-orange.svg) 4 | 5 | ***Риск-менеджмент личных финансов условиях санкций и/или финансового кризиса: делаем сегодня все, чтобы завтра избежать фатальных последствий***. 6 | 7 | --- 8 | 9 | :heavy_plus_sign: Рассматривается использование *исключительно экономических* методов по минимизации персональных рисков. 10 | 11 | :heavy_minus_sign: Не рассматривается использование никаких *политических* методов: они важны для общества, но увеличивают риски для индивидуума. 12 | 13 | --- 14 | 15 | Содержание: 16 | 17 | - [Глупые стратегии и большие риски](#глупые-стратегии-и-большие-риски) 18 | - [Сценарий I: «Черный день»](#сценарий-i-черный-день) 19 | - [Цель](#цель) 20 | - [План](#план) 21 | - [Сроки](#сроки) 22 | - [Сценарий II: Блэкаут](#сценарий-ii-блэкаут) 23 | - [Цель](#цель-1) 24 | - [План](#план-1) 25 | - [Сроки](#сроки-1) 26 | - [Сценарий III: Утрата сбережений](#сценарий-iii-утрата-сбережений) 27 | - [Цель](#цель-2) 28 | - [План](#план-2) 29 | - [Сроки](#сроки-2) 30 | - [Итак...](#итак) 31 | - [~~Общее~~ Важное](#общее-важное) 32 | - [:link: Полезные ссылки](#link-полезные-ссылки) 33 | 34 | --- 35 | 36 | - :warning: Непонимание работы используемых инвестиционных инструментов: акций, облигаций, криптовалюты и/или производных финансовых инструментов - несет в себе **риски полной утраты средств**. 37 | - :warning: Несоблюдение правил ИТ-безопасности, таких как сильные неповторяющиеся пароли, 2FA, [безопасный браузер](lists.md#список-софта), [защищенное соединение](lists.md#vpn) - несет в себе **риски полной утраты средств**. 38 | - :warning: Невыполнение [законодательства](lists.md#законодательные-акты) юрисдикций, через которые происходит инвестирование, несет в себе **риски полной утраты средств**. 39 | - :warning: Слепое следование чужим инвестиционным идеям несет в себе **риски полной утраты средств**. 40 | 41 | Ничего из перечисленного в данном репозитории не является финансовой рекомендацией. К моменту прочтения вами статьи какая-то информация ниже может уже устареть. 42 | 43 | --- 44 | 45 | ## Глупые стратегии и большие риски 46 | 47 | Самое первое, что стоит понять: позиция, что «*нужно пересидеть*» так же нежизнеспособна, как и «*куплю подешевевших российских акций на всю котлету*». Просто, потому что в первом случае – вы закрываете глаза на риски, а во втором – берете дополнительные (ну и торги российскими акциями на бирже закрыты с понедельника). 48 | 49 | То, что вам нужно называется «*Управление рисками*». И начать этим заниматься нужно, *как можно скорее*. 50 | 51 | Я составил план (он подойдет не всем, и это нормально). И как бы это громко не звучало, это мой гражданский долг рассказать о нем тем, кто разделяет мою тревогу. 52 | 53 | 3 основных **финансовых последствия от санкций и контрсанкций**, которые (последствия) с высокой вероятностью наступят: 54 | 55 | 1. Потеря работы или основного источника дохода («Черный день»), 56 | 2. Отключение от мировой финансовой инфраструктуры и ИТ инфраструктуры (Блэкаут), 57 | 3. Почти полная (~90%) утрата сбережений. 58 | 59 | И, с точки зрения финансов, все это **системные риски** – они *реализуются не для меня одного, а для большинства участников российского финансового рынка*. 60 | 61 | Разберем каждый из рисков подробнее. 62 | 63 | ## Сценарий I: «Черный день» 64 | 65 | Сценарий «Черный день» – ситуация, когда большое количество людей (в т.ч. я) не смогут выполнять своих финансовых обязательств (платить за ипотеку, покупать достаточно продуктов) из-за **потери источника дохода или размер доходов не будет покрывать финансовых обязательств**. 66 | 67 | *Пример*: компания, в которой я работаю объявила себя банкротом, а у меня ипотека, неработающая жена, которая ухаживает за маленьким ребенком. 68 | 69 | ### Цель 70 | 71 | На риск потери работы уже поздно влиять (но можно). А вот риск неплатежеспособности в случае потери таковой снизить можно. 72 | 73 | ### План 74 | 75 | Что нужно сделать? 76 | 77 | - Оценить свои активы и долги 78 | - Держать в кэше средства, которых *хватит на 3 месяца*: 79 | - 60% из них держать в рублях 80 | - 40% - в долларах и/или евро 81 | - Снизить долговую нагрузку: 82 | - воздержаться от получения новых кредитов 83 | - закрыть все кредитные договоры *в валюте* 84 | - закрыть все кредитные договоры *с плавающей ставкой* 85 | - (по возможности) закрыть мелкие кредиты/рассрочки 86 | - (обязательно) отдать долги друзьям и близким , или обговорить с ними, как будете рассчитываться, если Черный день настанет 87 | - Отказаться на ближайшие 3 месяца: 88 | - от покупки дорогостоящих вещей 89 | - от поездок в отпуск. 90 | 91 | ### Сроки 92 | 93 | Выполнить план на горизонте до 3-ех месяцев. 94 | 95 | ## Сценарий II: Блэкаут 96 | 97 | Сценарий Блэкаут – ситуация, когда отключение от мировой финансовой системы и ИТ-системы приведет **к утрате доступа над собственными финансовыми активами**. 98 | 99 | ### Цель 100 | 101 | Снизить риски наступления санкций/контрсанкций я не могу. А вот снизить риски полной (но не временной) потери контроля над своими банковскими и/или инвестиционными счетами - вполне. 102 | 103 | ### План 104 | 105 | #### Финансовая инфраструктура: что сделать? 106 | 107 | По банковским счетам: 108 | 109 | - Иметь пластиковые (можно виртуальные, но лучше физические) карты, отвечающие следующим требования: 110 | - эмитенты карт: [надежные российские частные банки](lists.md#список-надежных-банков) не под санкциями (Тинькофф) 111 | - платежные системы: Visa, Mastercard, *Мир* 112 | - счета: рублевые, долларовые, (желательно) евро. 113 | 114 | По инвестиционным счетам: 115 | 116 | - Иметь верифицированные (пройти KYC/AML процедуры) аккаунты: 117 | - у 2-ух [российских надежных брокеров](lists.md#список-надежных-брокеров), которые не под санкциями (Тинькофф, БКС) 118 | - у 2-ух [иностранных брокеров](lists.md#список-надежных-брокеров), из юрисдикций разрешенных в РФ 119 | - Иметь верифицированные аккаунты у минимум одного крипто брокера (Binance) 120 | - Информация для российских брокеров: 121 | - Установить *контактный телефон и email на российские* (например, Мегафон/Теле2 и Яндекс.Почта) 122 | - Информация для иностранных и крипто брокеров: 123 | - Установить *email от иностранного почтового хостинга* (Protonmail, Gmail) 124 | - Если есть 2FA, то сменить его *с SMS на нероссийское [приложение-аутентификатор](https://www.kaspersky.ru/blog/best-authenticator-apps-2022/32158/)* (Google Authenticator, Microsoft Authenticator) или (лучше) аппаратный ключ (Yubikey). 125 | 126 | #### Инфраструктура связи: что сделать? 127 | 128 | - Купить подписку на *VPN сервис, который не ведет логов подключения и находится за пределами российской юрисдикции* (Mullvad VPN, Proton VPN) 129 | - Разобраться как поднять [собственный VPN сервер](https://habr.com/ru/company/amnezia/blog/546424/) (и скачайте нужные статьи) 130 | - Разобраться в [сетевых роутерах](https://habr.com/ru/post/491540/) (особенно в домашнем) 131 | - 2 SIMки от разных операторов 132 | - Отремонтировать все вычислительные устройства, которые вам могут пригодиться (ожидаем жесткий [дефицит компьютерной техники](https://www.tomshardware.com/news/intel-amd-nvidia-tsmc-russia-stop-chip-sales-ukraine-sanction)) 133 | - Скачать на жесткий диск все дистрибутивы необходимого ПО (минимум ОС, Chrome или Brave, VPN клиент) *как для desktop, так и на мобильный* 134 | - *3 бекапа для важных вещей*: зашифрованный жесткий диск, зашифрованная флешка, облачный жесткий диск вне российской юрисдикции (Microsoft Azure Storage, OneDrive). 135 | 136 | #### Социальные связи: что сделать? 137 | 138 | - Поддерживать дружбу с теми, кто уехал заграницу (одноклассники, сокурсники, просто друзья детства; напишите им пусть даже вы со школы не общались) 139 | - Найти среди знакомых/в сети людей, которые хорошо разбираются в том, что вы из плана выше совсем не понимаете 140 | - Забэкапить контакты людей, которые могут помочь. 141 | 142 | ### Сроки 143 | 144 | Выполнить план на горизонте до 6-ти месяцев. 145 | 146 | ## Сценарий III: Утрата сбережений 147 | 148 | Сценарий «Утрата сбережений» – ситуация, когда **сбережения будут обесценены** (вследствие гиперинфляции, дефолта), **изъяты в пользу любой из конфликтующих сторон** или **доступ к ним будет ограничен**. Пример приводить не буду – достаточно познакомиться с современной историей России. 149 | 150 | ### Цель 151 | 152 | Диверсифицировать свои накопления так, чтобы гиперинфляция, дефолт, запрет на покупку иностранных/российских акций не привели к почти полной утрате капитала. 153 | 154 | ### План 155 | 156 | #### Финансовая инфраструктура: что сделать? 157 | 158 | Для счетов у российских брокеров - *избавьтесь от иностранного долга*: 159 | 160 | - Продать долговые обязательства (облигации) иностранных компаний 161 | - Продать все иностранные ETF 162 | - Продать низколиквидные ценные бумаги и активы. 163 | 164 | Для счетов у иностранных брокеров - *избавьтесь от российских активов*: 165 | 166 | - Продать все акции/облигации российских компаний и ОФЗ 167 | - Оставить только средства, которые вы готовы не выводить на горизонте 3+ лет 168 | - Задекларировать все счета, открытые у разрешенных на территории РФ брокеров. 169 | 170 | Для крипто брокеров: 171 | 172 | - Перевести значительную часть средств (до 90%) на холодный кошелек. 173 | 174 | #### ИТ инфраструктура: что сделать? 175 | 176 | - Включить шифрование данных на дисках, хранящих финансовые данные 177 | - Включить шифрование данных для на мобильных устройствах, хранящих финансовые данные 178 | - Включить VPN для траффика, содержащего финансовые данные, на всех устройствах. 179 | 180 | #### Социальные связи: что сделать? 181 | 182 | - Найти адвоката/юриста и введите его в курс своих дел 183 | - Загран паспорт со сроком действия минимум до 2025 года для *себя и членов семьи* 184 | - Решить все юридические вопросы, которые мешают экстренно выехать за границу 185 | - Написать доверенность на управление имуществом (квартира, машина) на имя человека, которому доверяете. 186 | 187 | ### Сроки 188 | 189 | Выполнить план на горизонте до 1 года. 190 | 191 | ## Итак... 192 | 193 | Итак, в сухом ~~как слезы моей бывшей~~ остатке: 194 | 195 | | Где хранится | Соотношение RUB/USD* | Риски обесценивания на горизонте года | Риски утраты контроля | Вывод средств потенциально может быть невозможен в течение... | 196 | | -- | -- | -- | -- | -- | 197 | | Наличные средства | 70% RUB, 30% USD* | Очень высокие | Низкие | Средства могут быть изъяты в любой момент | 198 | | Инвест-счета у российских брокеров | 50% RUB, 50% USD/EUR** | Высокие | Средние | 0.5-1 год | 199 | | Инвест-счета у иностранных брокеров | 100% USD** | Низкие | Высокие | 1-3 года | 200 | | Инвест-счета у крипто брокеров | 100% USD** | Средние | Средние | 1-3 года | 201 | | Холодный крипто кошелек | 100% USD** | Средние | Низкие | 1-3 года | 202 | 203 | \* См. ["Как выбрать соотношение рублей, иностранной валюты для наличных средств?"](faq.md#как-выбрать-соотношение-рублей-иностранной-валюты-для-наличных-средств) 204 | 205 | \** Для инвест-счетов - валюта, в которой приобретены активы (акции). 206 | 207 | :warning: Не переводите средства на валютные счета за границу, пока не разберетесь в ограничениях на [перевод иностранной валюты заграницу](lists.md#законодательные-акты-ограничивающие-покупку-иностранной-валюты-и-активов). 208 | 209 | ## ~~Общее~~ Важное 210 | 211 | - Учите английский 212 | - Инвестируйте (хотя бы время) в самообразование 213 | - Поддерживайте гражданские институты 214 | - Не ссыте (волков бояться - в лес не ходить) 215 | - Помогайте людям. 216 | 217 | ## :link: Полезные ссылки 218 | 219 | 1. **[Этот пост и обсуждения](https://habr.com/ru/post/654313/) на Habr.** 220 | 221 | Peace. 222 | -------------------------------------------------------------------------------- /lists.md: -------------------------------------------------------------------------------- 1 | # Наиболее важные списки 2 | 3 | ![Status](https://img.shields.io/badge/status-нуждается_в_актуализации-orange.svg) 4 | 5 | - [Законодательные акты](#законодательные-акты) 6 | - [Ограничения по операция с иностранной валюты](#ограничения-по-операция-с-иностранной-валюты) 7 | - [Список недружественных государств](#список-недружественных-государств) 8 | - [Полезные ссылки](#полезные-ссылки) 9 | - [Список надежных российских банков.](#список-надежных-российских-банков) 10 | - [Требования к банкам](#требования-к-банкам) 11 | - [Банки под санкциями](#банки-под-санкциями) 12 | - [Список надежных банков](#список-надежных-банков) 13 | - [Полезные ссылки](#полезные-ссылки-1) 14 | - [Список надежных российских брокеров](#список-надежных-российских-брокеров) 15 | - [Иностранные брокеры](#иностранные-брокеры) 16 | - [Российские брокеры](#российские-брокеры) 17 | - [Полезные ссылки](#полезные-ссылки-2) 18 | - [Надежные почтовые сервисы](#надежные-почтовые-сервисы) 19 | - [Российские почтовые сервисы](#российские-почтовые-сервисы) 20 | - [Иностранные почтовые сервисы](#иностранные-почтовые-сервисы) 21 | - [Криптовалюты](#криптовалюты) 22 | - [Stablecoins](#stablecoins) 23 | - [Некастодиальные кошельки](#некастодиальные-кошельки) 24 | - [Криптобиржи](#криптобиржи) 25 | - [Сервисы поиска обменников](#сервисы-поиска-обменников) 26 | - [VPN](#vpn) 27 | - [VPN cервисы](#vpn-cервисы) 28 | - [Другие инструменты обхода блокировок](#другие-инструменты-обхода-блокировок) 29 | - [Полезные ссылки](#полезные-ссылки-3) 30 | - [Список софта](#список-софта) 31 | 32 | ## Законодательные акты 33 | 34 | ### Ограничения по операция с иностранной валюты 35 | 36 | :warning: Не актуально. 37 | 38 | Что запрещено, если Вы резидент: 39 | 40 | - :no_entry: Вывозить больше $10 000 наличной валюты 41 | - :no_entry: Снимать с валютных счетов больше $10 000 в долларах 42 | - :no_entry: Покупать валюту в кассах банка или обменниках 43 | - :no_entry: Перечислять другим людям за рубеж больше $5000 в месяц 44 | - :no_entry: Давать в долг в валюте иностранцам 45 | - :no_entry: Зачислять валюту на свои счета в иностранных банках и других финансовых организациях 46 | - :no_entry: Переводить деньги без открытия банковского счета через иностранные платежные системы 47 | - :no_entry_sign: Без специального разрешения давать взаймы в рублях, продавать и покупать ценные бумаги и недвижимость у граждан и компаний [государств, которые ввели санкции против России](#список-недружественных-государств). 48 | - Разрешение потребуется и на покупку бумаг и недвижимости у иностранных граждан и компаний, если они приобрели эти активы у лиц из стран, наложивших санкции на Россию 49 | - :no_entry_sign: Без специального разрешения ЦБ приобретать доли в зарубежных компаниях 50 | - На словах есть заявления, что это не касается акций, но в указе про это ни слова. 51 | 52 | Не запрещено российскими законами, но невозможно: 53 | 54 | - :no_entry_sign: Переводить валюту за рубеж через бОльшую часть [банков, попавших под санкции](#банки-под-санкциями) 55 | - :no_entry_sign: Пользоваться картами Visa, MasterCard, Wester Union, JCB за рубежом 56 | - :no_entry_sign: Расплачиваться с помощью Apple Pay и Google Pay 57 | - :no_entry_sign: Покупать иностранные бумаги через [брокеров, попавших под санкции](#брокеры-под-санкциями). 58 | 59 | ### Список недружественных государств 60 | 61 | Правительство России [утвердило список недружественных государств](http://government.ru/news/44745/): 62 | 63 | - США 64 | - Австралия 65 | - Албания 66 | - Андорра 67 | - Великобритания (включая о. Джерси (коронное владение Британской короны) и подконтрольные заморские территории - о. Ангилья, Британские Виргинские острова, Гибралтар) 68 | - 27 государств - члены Европейского союза 69 | - Исландия 70 | - Канада 71 | - Лихтенштейн 72 | - Микронезия 73 | - Монако 74 | - Новая Зеландия 75 | - Норвегия 76 | - Республика Корея 77 | - Сан-Марино 78 | - Северная Македония 79 | - Сингапур 80 | - Тайвань (Китай) 81 | - Украина 82 | - Черногория 83 | - Швейцария 84 | - Япония. 85 | 86 | ### Полезные ссылки 87 | 88 | Указы и пояснения к ним: 89 | 90 | 1. [Указ о применении специальных экономических мер в связи с недружественными действиями США и примкнувших к ним иностранных государств и международных организаций](http://kremlin.ru/events/president/news/67881) от 28 февраля 2022, Kremlin.ru. 91 | 1. [Дополнительные пояснения к указу](https://vc.ru/o2consulting/372985-novye-valyutnye-ogranicheniya-dlya-rezidentov-analiz-ukaza-prezidenta-rf-ot-28-02-2022), VC.ru. 92 | 1. [Информационное письмо об ограничении переводов физических лиц-резидентов](https://cbr.ru/Crosscut/LawActs/File/5817) от 9 марта 2022, ЦБ. 93 | 1. [Временный порядок операций с наличной валютой](https://www.cbr.ru/press/event/?id=12738) от 9 марта 2022, ЦБ. 94 | 1. [Разбор](https://habr.com/ru/news/t/654809/), Habr. 95 | 96 | Официальные источники: 97 | 98 | 1. [Работа финансовой системы в условиях санкционных ограничений](https://www.cbr.ru/faq/w_fin_sector/), ЦБ 99 | 1. [Официальный канал Минфина России](https://t.me/minfin) в Telegram 100 | 1. [Официальный канал Центробанка России](https://t.me/centralbank_russia) в Telegram 101 | 102 | Полезные статьи: 103 | 104 | 1. (Частично устарел) [Гайд: работающие способы вывести деньги за рубеж / завести в Россию](https://habr.com/ru/post/654155/), Habr. 105 | 106 | ## Список надежных российских банков. 107 | 108 | ### Требования к банкам 109 | 110 | Банк должен соответствовать всем нижеперечисленным требованиям: 111 | 112 | - Не находится под санкциями, включая родительские и дочерние компании (см. [Банки под санкциями](#банки-под-санкциями)) 113 | - Не принадлежит российскому государству или доля государства в уставном капитале невелика 114 | - Не принадлежит иностранной финансовой группе 115 | - Входит в [TOP 30 банков по капитализации](https://www.banki.ru/banks/ratings/). 116 | 117 | ### Банки под санкциями 118 | 119 | - ВТБ 120 | - Открытие и дочерний банк Точка 121 | - Новикомбанка 122 | - Совкомбанка 123 | - Газпромбанк 124 | - Россельхозбанк 125 | - Альфа-Банк 126 | - Московский Кредитный Банк 127 | - Сбербанк 128 | - Банк Россия 129 | - Промсвязьбанк. 130 | 131 | ### Список надежных банков 132 | 133 | :warning: Не актуально. 134 | 135 | - Tinkoff банк 136 | - Банк Санкт-Петербург 137 | 138 | ### Полезные ссылки 139 | 140 | Официальные источники: 141 | 142 | 1. [Список системно-значимых банков](http://www.cbr.ru/banking_sector/credit/systembanks.html/), ЦБ. 143 | 1. [Рейтинг надёжности банков в РФ от Forbes](https://www.forbes.ru/rating/424063-100-nadezhnyh-rossiyskih-bankov-2021-reyting-forbes), Forbes. 144 | 1. [Санкции против РФ, 2022](https://ru.wikipedia.org/wiki/%D0%A1%D0%B0%D0%BD%D0%BA%D1%86%D0%B8%D0%B8_%D0%BF%D1%80%D0%BE%D1%82%D0%B8%D0%B2_%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D0%B8_(2022)), wikipedia. 145 | 146 | Полезные статьи: 147 | 148 | 1. [Как работают банки под санкциями](https://vc.ru/finance/370973-kak-rabotayut-banki-pod-sankciyami-i-chto-pomenyaetsya-dlya-klientov-sbera-psb-tochki-i-drugih-podrobnosti) 149 | 1. [Российские банки попали под санкции — разбираемся в ограничениях](https://frankrg.com/61074) 150 | 151 | ## Список надежных российских брокеров 152 | 153 | ### Иностранные брокеры 154 | 155 | #### Брокеры, которые перестали работать с российскими резидентами 156 | 157 | - :no_entry_sign: Exante: 2022-03-09 ответили, что не работают с российскими резидентами. 158 | 159 | 160 | ### Российские брокеры 161 | 162 | #### Требования к брокерам 163 | 164 | Брокер должен соответствовать всем нижеперечисленным требованиям: 165 | 166 | - Не находится [под санкциями](#брокеры-под-санкциями), включая родительские и дочерние компании 167 | - Не принадлежит российскому государству или доля государства в уставном капитале невелика 168 | - Не принадлежит иностранной финансовой группе 169 | - Входит в TOP 30 брокеров по количеству активных клиентов 170 | - Если у брокера есть родителький банк, то он не под санкциями 171 | - Есть возможность отключения сделок-овернайт. 172 | 173 | #### Список надежных брокеров 174 | 175 | :warning: Не актуально. 176 | 177 | - Tinkoff Инвестиции 178 | - БКС 179 | - Финам 180 | 181 | #### Брокеры под санкциями 182 | 183 | - ВТБ Инвестиции 184 | - Открытие Брокер 185 | - Газпромбанк Инвестиции 186 | - Альфа-Капитал 187 | - МКБ Инвестиции 188 | - Сбербанк Инвестиции 189 | 190 | ### Полезные ссылки 191 | 192 | Полезные статьи: 193 | 194 | 1. [Выбираем брокеров для работы под санкциями](https://tinstaafl.shrv.xyz/brokersVSsanctions). 195 | 196 | ## Надежные почтовые сервисы 197 | 198 | ### Российские почтовые сервисы 199 | 200 | - Яндекс.Почта 201 | 202 | ### Иностранные почтовые сервисы 203 | 204 | - Protonmail ([заблокирован РКН](https://rkn.gov.ru/press/publications/news71692.htm)) 205 | - Gmail 206 | - Outlook.com 207 | 208 | ## Криптовалюты 209 | 210 | Изучите [как хранить криптовалюту в условиях санкций](sanctions-risks-in-cryptocurrency.md) при необходимости. 211 | 212 | ### Stablecoins 213 | 214 | Стейблкоины и риски блокировки/потери средств: 215 | 216 | | | Token | Project/Company | Target Price | Collateralization | Transparency/Audit | Decentralized | Type | Reviews | Hacks Risks | Defaults Risks | Sanctions Risks | 217 | | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | 218 | | :no_entry: | `UST` | Terra | $1 | LUNA, BTC | Medium | **+** | Algorithmic | [UST Falls to $0.35](https://www.coindesk.com/markets/2022/05/11/ust-falls-to-035-terra-futures-see-106m-in-liquidations/) | Medium | The highest | The lowest | 219 | | :white_check_mark: | **`DAI`** | MakerDAO | $1 | [USDC, ETH, WBTC](DaiStats.com) | High | + | Smart contract | [1](https://forklog.com/chto-takoe-makerdao/), [2](https://vc.ru/finance/387874-kak-natyanut-sovu-na-globus-razbiraem-kak-decentralizovannyy-steyblkoin-dai-mozhet-zashchitit-vashi-dengi) | Medium | Low | **The lowest** | 220 | | :o: | `USDT` | Tether | $1 | [US Treasury, Bonds, Cash](https://assets.ctfassets.net/vyse88cgwfbl/4hiNJsZ98LlZqCJHKzrLpV/2b6338482ef0093382885f80ba6f1083/Tether_Assurance-12-31-21.pdf) | Poor | - | Classic (fiat based) | [1](https://vc.ru/finance/381435-udivitelnaya-istoriya-tether-usdt-lyudi-otnesli-80-milliardov-plasticheskomu-hirurgu-kotoryy-ne-garantiruet-ih-vozvrat)| Low | Medium | The highest | 221 | | :white_check_mark: | `USDC` | Circle | $1 | [100% Cash](https://www.centre.io/hubfs/PDF/2022%20Circle%20Examination%20Report%20February%202022.pdf?hsLang=en) | [Medium](https://www.centre.io/usdc-transparency?hsLang=en) | - | Classic (fiat based) | | Low | Low | Medium | 222 | | :white_check_mark: | `BUSD` | Binance (via Paxos)| $1 | [Cash, US Treasury](https://paxos.com/busd/) | [Medium](https://paxos.com/attestations/) | - | Classic (fiat based) | | Low | Low | Low | 223 | | :o: | `USDP` | Paxos | $1 | | [Medium](https://paxos.com/attestations/) | - | Classic (fiat based) | | Low | Low | Medium | 224 | | :o: | `PAXG` | [Paxos](https://paxos.com/paxgold/) | 1 oz Gold | | [Medium](https://paxos.com/attestations/) | - | Classic (fiat based) | | Low | Low | Medium | 225 | 226 | References: 227 | 228 | 1. [Алгоритмические стейблкоины: как развиваются альтернативы USDT и USDC](https://forklog.com/algoritmicheskie-stejblkoiny-kak-razvivayutsya-alternativy-usdt-i-usdc/), Forklog. 229 | 230 | ### Некастодиальные кошельки 231 | 232 | | | Wallet name | Type | Private key/seed phrase storage | Supported tokens | Platforms | Comments | Hacks Risks | Sanctions Risks | 233 | |--|--|--|--|--|--|--|--|--| 234 | | :white_check_mark: | [**Atomic**](https://atomicwallet.io/) | Multi-wallet | Local | BTC, ETH, and 100+ tokens| Win, MacOS, Linux-based, Android, iOS | (+) Staking ready | Low | Low | 235 | | :white_check_mark: | [**Exodus**](https://www.exodus.com/download/) | Multi-wallet | Local | BTC, ETH, and 100+ tokens | Win, MacOS, Linux-based, Android, iOS | (+) Staking ready | Low | Low | 236 | | :white_check_mark: | [Trust Wallet](https://trustwallet.com/ru/) | Multi-wallet | Local | BTC, ETH, +1K tokens | Low | (-) Binance is owner, (+) Stacking ready | | [Medium](https://www.binance.com/en/blog/leadership/ukraine-russia-sanctions-and-crypto-421499824684903532) | 237 | | :white_check_mark: | [Coinomi](https://www.coinomi.com/) | Multi-wallet | Local | BTC, ETH, and 100+ tokens | Win, MacOS, Linux-based, Android, iOS | | Low | Low | 238 | | :white_check_mark: | [Samorai Wallet](https://samouraiwallet.com/) | Bitcoin wallet | Local | BTC | Android | (-) Mixer reputation | Low | The lowest | 239 | | :white_check_mark: | [Mycelium](https://wallet.mycelium.com/) | Bitcoin wallet | Local | BTC | Android | | | Low | 240 | | :white_check_mark: | [Trustee](https://trusteeglobal.com/) | Multi-wallet | Local | BTC, ETH, and 20+ tokens | iOS, Android | | Low | Low | 241 | | :o: | [Metamask](https://metamask.io/) | Multi-wallet | Local | [EVM](https://ethereum.org/en/developers/docs/evm/)-compatible tokens, e.g. ETH | Chome extension, Android, iOS | | Low | [Medium](https://metamask.zendesk.com/hc/en-us/articles/360059386712-Why-MetaMask-and-Infura-cannot-serve-certain-areas) | 242 | | :o: | [Wasabi Wallet](https://wasabiwallet.io/) | Private bitcoin wallet | Local | BTC | Win, MacOS, Linux-based | (-) Mixer reputation, (+) Open-source, privacy-focused | Low | The lowest | 243 | | :o: | [Electrum](https://electrum.org/) | Bitcoin wallet | Local | BTC | Win, Linux, OSX, Android | | [Medium](https://xakep.ru/2020/10/13/electrum-attaks/) | Low | 244 | | :no_entry: | [Coinbase](https://www.coinbase.com/wallet) | Multi-wallet | Local | BTC, ETH, and others [ERC-20](https://ethereum.org/en/developers/docs/standards/tokens/erc-20/) compatible tokens | Chome extension, Android, iOS | (-) KYC, (+) NFT | Very low | [The highest](https://twitter.com/brian_armstrong/status/1499621509651787782?s=20&t=zGROkm-WKH5Ja6f6LR7BwA) | 245 | | :no_entry: | [Blockchain.com](https://www.blockchain.com/wallet) | Multi-wallet | Remote | BTC, ETH, and 10+ others | Web UI | | Low | High | 246 | 247 | ### Криптобиржи 248 | 249 | :warning: Не актуально. 250 | 251 | :no_entry: На данный момент пополнение с карт **MasterCard** и **Visa** из РФ недоступно, но торги на некоторых биржах можно вести. 252 | 253 | - :o: [Binance](https://www.binance.com) - самая крупная криптовалютная биржа ([source](https://coinmarketcap.com/ru/rankings/exchanges/)), [ограничения для граждан РФ](https://www.binance.com/en/support/announcement/4887e569afdf4b1e89e024371d3a49b9). 254 | - :no_entry: [Coinbase](https://www.coinbase.com/) - вторая по популярности крипто биржа, имеется [преценденты блокировки кошельков](https://twitter.com/brian_armstrong/status/1499621509651787782?s=20&t=zGROkm-WKH5Ja6f6LR7BwA) резидентов РФ, с мая 2022 сервисы, расположенные в Евросоюзе, [не доступны с резидентами РФ](https://twitter.com/iampaulgrewal/status/1521487189431001089) 255 | 256 | ### Сервисы поиска обменников 257 | 258 | Поскольку обменников великое множество, нет смысла рассматривать каждый по отдельности, особенно когда для этого уже есть проверенные сервисы с отзывами. 259 | 260 | :warning: В данный период, поскольку зачисление средств на биржи затруднено, все обменники **делают** довольно большую **наценку** относительно биржевого курса - примерно **10-25%**. Раньше эта наценка варьировалось в районе 3-4%. Смотрите, сравнивайте. 261 | 262 | :warning: Использование сервисов-обменников сопряжено с повышенными рисками. Относитесь с особым вниманием к проверке репутации как обменника, так и выбранного продавца. 263 | 264 | - [BestChange](https://www.bestchange.ru/) - поиск обменников с отзывами, автоматически обновляющимся курсом и относительно большим выбором валют, к каждому обменнику прилагаются характериcтики: требует ли обменник верификацию (проверку карты/паспортных данных), как берут комиссию (и берут ли) и т.п. 265 | - [LocalBitcoins](https://localbitcoins.com/) - P2P-площадка для покупки BTC (Bitcoin) с поддержкой фиатных валют. 266 | - [LocalMonero](https://localmonero.co/) - P2P-площадка для покупки XMR (Monero) с поддержкой фиатных валют. 267 | 268 | ## VPN 269 | 270 | ### VPN cервисы 271 | 272 | Список надежных VPN сервисов (находятся за пределами российской юрисдикции): 273 | 274 | | | Name | Has Free Plan | Support BTC payments | No-logs policy | OpenSource | Blocked/partally blocked in Russsia* | Trust level | Comments | 275 | | -- | -- | -- | -- | -- | -- | -- | -- |-- | 276 | | :white_check_mark: | [Proton VPN](https://protonvpn.com/) | + | + | + | [+](https://github.com/orgs/ProtonVPN/repositories) | [Available to block](https://www.themoscowtimes.com/2022/06/02/swiss-vpn-service-proton-says-likely-blocked-in-russia-a77871) | Very high | | 277 | | :warning: | [IPVanish VPN](https://www.ipvanish.com/) | - | - | + | [-](https://github.com/ipvanish) | + | High | | 278 | | :white_check_mark: | [Mullvad VPN](https://mullvad.net/en/) | - | + | + | [+](https://github.com/mullvad) | - | High | [Review](https://www.forbes.com/advisor/business/software/mullvad-vpn-review/) | | 279 | | :warning: | [Nord VPN](https://nordvpn.com/) | - | + | + | [-](https://github.com/NordSecurity) | + | High | | 280 | | :warning: | [ExpressVPN](https://www.expressvpn.com/) | - | + | + | [-](https://github.com/expressvpn) | + | Medium | | 281 | | :o: | HighLoad VPN | Fully free | | + | [Partially](https://github.com/Jigsaw-Code/outline-server) | - | Low | Based on ShadowSocks, волонтеры сервиса 'угнали сайт' | 282 | 283 | \* [Заблокрированы РКН](https://habr.com/ru/news/t/576128/), но потенциально могут функционировать (частично или полностью). 284 | 285 | Продвинутые пользователи могут купить хостинг (VDS) и развернуть собственный VPN сервер: 286 | 287 | - [Amnezia VPN](https://amnezia.org/) ([инструкция](https://habr.com/ru/company/amnezia/blog/546424/)) 288 | - [Outline VPN](https://getoutline.org). 289 | 290 | ### Другие инструменты обхода блокировок 291 | 292 | - Psiphon 293 | - Lantern 294 | - NewNode. 295 | 296 | ### Полезные ссылки 297 | 298 | 1. [Общество защиты интернета](https://t.me/safe_runet), Телеграм канал. 299 | 2. [Безопасность. VPN](https://relocation.guide/vpn), relocation.guide. 300 | 301 | ## Список софта 302 | 303 | - Chrome или Brave 304 | - Tor Browser ([заблокирован РКН](https://blog.torproject.org/tor-censorship-in-russia/)) 305 | - Защищенный мессенджер 306 | - [VPN клиент](lists.md#vpn). 307 | -------------------------------------------------------------------------------- /mobilization-resistance.md: -------------------------------------------------------------------------------- 1 | # Мобилизация 2 | 3 | ![Status](https://img.shields.io/badge/status-нуждается_в_актуализации-orange.svg) 4 | 5 | *Список мер для снижения риска быть мобилизованным при наличии оснований для отсрочки*. 6 | 7 | --- 8 | 9 | Ниже: 10 | 11 | :heavy_plus_sign: Рассматривается использование *исключительно юридических* методов для минимизации персональных рисков. 12 | 13 | :heavy_minus_sign: Не рассматривается использование никаких *политических* методов: они важны для общества, но увеличивают риски для индивидуума. 14 | 15 | :heavy_check_mark: Берегите себя. Не нарушайте законы юрисдикции(й), в которой(ых) живете. 16 | 17 | --- 18 | 19 | **Содержание**: 20 | 21 | - [Кому попытаются вручить повестку?](#кому-попытаются-вручить-повестку) 22 | - [Если ищут...](#если-ищут) 23 | - [Когда пытаются вручить повестку...](#когда-пытаются-вручить-повестку) 24 | - [Когда вручили повестку...](#когда-вручили-повестку) 25 | - [В военкомате...](#в-военкомате) 26 | - [:telephone\_receiver: Экстренные контакты](#telephone_receiver-экстренные-контакты) 27 | - [:link: Полезные ссылки](#link-полезные-ссылки) 28 | 29 | > :information_source: Содержимое проекта носит исключительно образовательный характер и не является рекомендацией к каким-либо действиям. Учитывайте, что к моменту прочтения часть информации может устареть. 30 | 31 | ## Кому попытаются вручить повестку? 32 | 33 | Для первой волны были объявлены конкретные [критерии частичной мобилизации](https://meduza.io/feature/2022/09/28/otsenite-svoy-risk-popast-pod-mobilizatsiyu). 34 | 35 | ## Если ищут... 36 | 37 | Если вас ищут, несмотря на наличие законного основания для отсрочки, то: 38 | 39 | - :warning: не живите по месту прописки (лучше - смените регион) 40 | - предупредите тех, кто живет по месту прописки, чтоб всем, кто вас спрашивает, говорили, что вы уехали 41 | - не ходите в государственные органы 42 | - :warning: не ходите самостоятельно к коллекторам ни по каким делам - отправляйте представителя, если очень надо 43 | - не открывайте дверь, если точно не знаете, кто за ней: 44 | - газовщик, интернетчик, почтальон - коллектор может представиться, кем хочет 45 | - нигде не оставляйте актуальный адрес (ни в приложениях доставки, ни в Госуслугах) 46 | - если где-то оставили, то исправляйте на другой адрес и (лучше) удаляйте аккаунт 47 | - не выкладывайте в социальные сети фотографии из места проживания 48 | - оставьте только самые необходимые приложения с трекингом локации 49 | - не вызывайте такси прямо к месту жительства 50 | - удалите все "государственные" и квази-государственные (vk) приложения c телефона 51 | - почистите историю гелокаций, где только можно 52 | - выходите на улицу в кепке (лучше и очках) 53 | - в местах, где есть камеры компьютерного зрения (метро) надевать медицинскую маску 54 | - научиться не светиться на приподъездные камеры (если есть) в месте проживания 55 | - :warning: повестку могут вручить и в отделе кадров или учебном отделе ВУЗа: избегайте этих мест 56 | - носите с собой паспорт, военник (приписное) и все справки, которые могут подвердить, что вы не подходите под критерей о мобилизации 57 | - подключайтесь к интернет, [используя VPN](lists.md#vpn). 58 | 59 | ## Когда пытаются вручить повестку... 60 | 61 | Если пытаются вручить повестку, то нужно: 62 | 63 | 1. повестку вручить можно лично 64 | - повестку нельзя вручать кинув ее в почту или положив под дверь 65 | - повестку нельзя вручать через Госуслуги (следить за статусом [соотвествующего законопроекта](https://sozd.duma.gov.ru/bill/361804-7)) 66 | 2. фиксировать на камеру всю процедуру вручения 67 | 3. спросить удостоверение личности и документы подтверждающие полномочия того, кто вручает повестку: 68 | - :warning: повестки вручаются работниками военного комиссариата или по месту работы (учебы) гражданина руководителями, другими ответственными за военно-учетную работу должностными лицами (работниками) организаций ([п. 2 ст. 31 Закона](http://www.consultant.ru/document/cons_doc_LAW_18260/0b6fba2b4841a88fc0274d43870ea1d54a32b91d/)) 69 | - полицейские могут вручать повестки о явке в военкомат только при наличии письменного обращения военного комиссара, в котором должны быть указано на невозможность вручения гражданину повестки своими силами 70 | - :warning: полицейские не могут самостоятельно заполнить повестку и вручить ее гражданину 71 | - сотрудник полиции не может вас заставить получить повестку от третьего лица 72 | - сотрудник полиции не может поцейским доставлять граждан в военкоматы или мобилизационные пункты 73 | 4. узнать на каком основании повестка вручается и ссылаться, что не подходишь по критериям мобилизации 74 | 5. :warning: повестка действительна только если есть печать, подпись военкома, там есть ваша фамилия и дата явки 75 | - если чего-то нет, то зафиксировать это на камеру 76 | 6. не брать повестку в руки 77 | 7. нигде (в том числе в повестке) не рассписываться 78 | - если вынудят, то написать, что повестка вручена с нарушениями. 79 | 80 | :punch: [Как правильно отказаться получать незаконную повестку](https://www.youtube.com/watch?v=xLkQv_c5q74), Youtube. 81 | 82 | ## Когда вручили повестку... 83 | 84 | Если вручили повестку, то: 85 | 86 | - проконсультуруйтесь с адвокатом 87 | - если он вам советует сдаться -- посылайте его нахуй 88 | - если советует бороться, то договоритесь с ним о защите 89 | - держите под рукой все [нужные контакты](#link-полезные-ссылки) 90 | - выучите наизусть номер адвоката 91 | - дайте номер адвоката ближайшему родственнику/другу на случай если что-то с вами случится 92 | - не ходите в военкомат так долго, как получится 93 | - :grey_question: как узнать, есть ли в отношении вас уголовное дело? - закажите на Госуслугах электронную справку об отсутствии судимости. 94 | - оформите на близкого человека [нотариальную доверенность на представление ваших интересов в суде](https://soldiersmothers.ru/sm_docs/doverennost?ysclid=l8epu9weef237125174) с полномочиями на подписание и подачу административного иска с правом передоверия 95 | - напишите [заявления от альтернативной гражданской службе (АГС)](https://telegra.ph/Obrazec-zayavleniya-09-21) и отправьте его заказным письмом 96 | - п.3 ст.59 Конституции РФ: случае если убеждениям или вероисповеданию россиянина противоречит несение военной службы, гражданин Российской Федерации имеет право на замену ее АГС (никаких оговорок о мобилизации в этой статье Конституции нет) 97 | - сделайте нотариально заверенные копии паспорта и документов, подтверждающих отсрочку 98 | - с этого момента не давайте представителям власти паспорт в руки (только заверенную копию) 99 | - смените телефон (купите на авито) и сим-карту (оформите на подругу/друга) 100 | - :no_entry: пока вы не переступили порог военкомата, вы - не военнослужащий. 101 | 102 | ## В военкомате... 103 | 104 | :warning: В военкомате понадобятся: 105 | 106 | - заряженный телефон, 107 | - внешний аккумулятор для зарядки телефона (power bank), 108 | - заверенные копии документов, подтверждающих отсрочку. 109 | 110 | Находясь в военкомате, необходимо: 111 | 112 | - позвонить доверенному лицу/адвокату и сказать, где вы 113 | - вы не преступник и имеете право говорить по телефону с кем угодно и сколько угодно, не спрашивая разрешения сотрудников полиции или военкомата 114 | - [требовать дополнительного обследований здоровья](https://t.me/peaceplea/186) 115 | - [написать жалобу(ы) на незаконные призыв/нарушения в его процедуре](https://t.me/stoparmy/1536) 116 | - если есть возможность - прочитайте [этот текст](https://docs.google.com/document/d/12vJHqbLzXk0GCtTGOHUgNLUEbJUnhQ8kz49uYGE-7SA/edit#heading=h.2vw4bvzer3d6) (лучше, конечно, это сделать заранее). 117 | - [если в военкомате удерживают насильно](http://soldiersmothers.ru/prizyvniku/zashhita-ot-nasilstvennogo-prizyva) 118 | - ваше удержание незаконно! 119 | - обратитесь с жалобой на полицейских в прокуратуру и их руководству 120 | - требуйте вручить вам повестку для явки на другую дату и освободить вас. 121 | 122 | ## :telephone_receiver: Экстренные контакты 123 | 124 | - [Консультаций по теме мобилизации от Агора](https://t.me/agora_army_bot), telegram бот. 125 | - [Горячая линия для призывников и военнослужащих](https://t.me/army_help), telegram чат. 126 | - [Cписок организаций, которые постараются помочь вам избежать призыва](https://meduza.io/feature/2022/09/21/vladimir-putin-ob-yavil-chastichnuyu-mobilizatsiyu-v-rossii-vot-spisok-organizatsiy-kotorye-pomogut-vam-izbezhat-prizyva-esli-vy-ne-hotite-voevat) 127 | 128 | ## :link: Полезные ссылки 129 | 130 | Законы: 131 | 132 | 1. [Федеральный закон от 26 февраля 1997 г. N 31-ФЗ "О мобилизационной подготовке и мобилизации в Российской Федерации"](http://ivo.garant.ru/#/document/136945/paragraph/10935:0). 133 | 2. [Федеральный закон "Об альтернативной гражданской службе" от 25.07.2002 N 113-ФЗ](http://www.consultant.ru/document/cons_doc_LAW_37866/#:~:text=%D0%9D%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8-,%D0%A4%D0%B5%D0%B4%D0%B5%D1%80%D0%B0) 134 | 3. Новое в УК РФ: 135 | - ст. 203.3 УК РФ Публичное распространение заведомо ложной информации об использовании Вооруженных Сил 136 | - ст. 280.4 УК РФ «Публичные призывы к осуществлению деятельности, направленной против безопасности государства». 137 | 138 | Разъяснения и гайды: 139 | 140 | 1. [Как не попасть под мобилизацию — главные советы](https://docs.google.com/document/d/19wuN5O4hXyfLskHPPI6uw6-e3gGe4pf_EtKjlWkPZwU/edit), Медуза. 141 | 2. [Карточки мобилизации](https://meduza.io/cards/navernoe-vy-i-tak-ponimaete-chto-mobilizatsiya-v-rf-vovse-ne-chastichnaya-kogo-tochno-prizovut-i-kak-legalno-ne-poyti-na-voynu), Медуза. 142 | 3. [F.A.Q. по мобилизации](https://telegra.ph/FAQ-po-mobilizacii-09-21), Telegraph. 143 | 144 | :punch: Советы юристов: 145 | 146 | 1. [Канал юриста Павла Чикова](https://t.me/pchikov), telegram. 147 | 2. [Мобилизация. Что делать? Советы юриста](https://youtu.be/31ZrqqFkdiU), youtube. 148 | 3. [Адвокат Калой Ахильгов и правозащитник Сергей Кривенко отвечают на главные вопросы о мобилизации](https://www.youtube.com/watch?v=L-miERxesnM), youtube. 149 | -------------------------------------------------------------------------------- /relocation.md: -------------------------------------------------------------------------------- 1 | # Иммиграция: экстренная и плановая 2 | 3 | ![Status](https://img.shields.io/badge/status-нуждается_в_актуализации-orange.svg) 4 | 5 | *Чек-лист по подготовке к экстренной и плановой релокации*. 6 | 7 | --- 8 | 9 | Ниже: 10 | 11 | :heavy_plus_sign: Рассматривается использование *исключительно юридических* методов для минимизации персональных рисков. 12 | 13 | :heavy_minus_sign: Не рассматривается использование никаких *политических* методов: они важны для общества, но увеличивают риски для индивидуума. 14 | 15 | :heavy_check_mark: Берегите себя. Не нарушайте законы юрисдикции(й), в которой(ых) живете. 16 | 17 | --- 18 | 19 | - [Документы](#документы) 20 | - [Первоочередные документы](#первоочередные-документы) 21 | - [Дополнительные документы](#дополнительные-документы) 22 | - [Для получение рабочей визы/ВНЖ](#для-получение-рабочей-визывнж) 23 | - [Экстренная релокация](#экстренная-релокация) 24 | - [Подготовка](#подготовка) 25 | - [В аэропорту/на границе](#в-аэропортуна-границе) 26 | - [В стране иммиграции](#в-стране-иммиграции) 27 | - [Плановая релокация](#плановая-релокация) 28 | - [Подготовка](#подготовка-1) 29 | - [:link: Полезные ссылки](#link-полезные-ссылки) 30 | 31 | --- 32 | 33 | > :information_source: Содержимое проекта носит исключительно образовательный характер и не является рекомендацией к каким-либо действиям. Учитывайте, что к моменту прочтения часть информации может устареть. 34 | 35 | 36 | ## Документы 37 | 38 | ### Первоочередные документы 39 | 40 | Документы, без который буду проблемы с пересечением границы и/или релокацией в другую страну: 41 | 42 | - [x] загранпаспорт(а) 43 | - [x] паспорт РФ 44 | - [x] военный билет (приписное) 45 | - [x] документы подтверждающие отcрочку. 46 | 47 | *Держите эти документы под рукой, а лучше носите с собой.* 48 | 49 | ### Дополнительные документы 50 | 51 | Документы, которые желательны для длительного нахождения (от 2 месяцев) в другой стране, в том числе по туристической визе: 52 | 53 | - [x] свидетельство о рождении, в т.ч. для взрослых 54 | - [x] водительские права 55 | - [x] нотариально заверить и оставить у доверенного лица: 56 | - [x] доверенность на распоряжение имуществом (квартира, машина), в т.ч. и сделки продажи 57 | - [x] согласие на выезд несовершеннолетнего ребенка за границу с матерью 58 | - [ ] медстраховка для выезжающего заграницу* (выглядит необязательной) 59 | 60 | \* В случае наступления страхового случая, у вас должны быть средства оплатить все на месте самостоятельно, и только в РФ вы сможете получить компенсацию. 61 | 62 | ### Для получение рабочей визы/ВНЖ 63 | 64 | Документы, которые желательны для получения рабочей визы или ВНЖ: 65 | 66 | - [ ] справка о несудимости 67 | - в приоритете с апостилем; если без апостиля, то нотариально заверенный перевод 68 | - не надо до 16 лет 69 | - [ ] свидетельство о браке (сделать перевод на английский язык) 70 | - лучше: нотариально заверенный перевод свидетельства о браке 71 | - [ ] медицинские тесты (сделать перевод на английский язык, заверять нотариусом не надо): 72 | - [ ] кровь на ВИЧ, сифилис и гепатит B и C 73 | - [ ] флюрографию 74 | - [ ] прививочные сертификаты на COVID 75 | - [ ] (детям) прививочные сертификаты на все прививки 76 | - [ ] диплом(ы): 77 | - [ ] оригинал(ы) с апостилем 78 | - [ ] перевод на английском языке (нотариально заверенный) 79 | - [ ] сканы любых дипломов об образовании 80 | - [ ] скан текущего трудового договора 81 | - берите сканы всего важного вообще 82 | - [ ] CV: сухое резюме с должностями, названиями юрлиц и курсами по программированию 83 | - [ ] если задерживали на митингах, били, присылали повестки и проч., то протоколы и прочие доказательства. 84 | 85 | 86 | ## Экстренная релокация 87 | 88 | > :warning: Нужно или не нужно будет срочно иммигрировать, каждый решает сам, но **план должен быть составлен заранее**. 89 | 90 | > :newspaper: Cледите за новостями из разных источников, чтобы не пропустить момент, когда нужно бросить все и уехать по плану срочной иммиграции. 91 | 92 | ### Подготовка 93 | 94 | - [x] :warning: заплатите все налоги, оплатите все штрафы, выплатите все просроченные кредиты 95 | - [x] закрывайте любые обязательства (кроме ипотеки), из-за который вас могут отказать в выезде из страны ([список оснований](http://www.consultant.ru/edu/student/consultation/ogranichen_vyezd_za_granitsu/)) 96 | - [x] выберите [страны, потенциально подходящие для переезда](https://docs.google.com/spreadsheets/d/1n5j2qmMmcthFdohhBI46hr4OgmuQ-6To-2KT98DWd2E/edit#gid=0) 97 | - :warning: это должна быть страна, в которую вы можете прибыть по *уже имеющимся* у вас документам/визам 98 | - [x] убедитесь в наличии всех [первочередных документов](#первоочередные-документы) 99 | - [ ] подготовьте максимальное количество [дополнительных документов](#дополнительные-документы) 100 | - [ ] оставьте на карте рублевые средства: 101 | - (сначала) на покупку билетов за границу 102 | - (потом) минимум на 3 платежа по ипотеке и/или другим кредитным обязательствам 103 | - [ ] купите наличные доллары/евро (но не более $10,000 на человека) 104 | - [x] оставьте дубликаты ключей от квартиры/машины доверенным лицам 105 | - [ ] :warning: купите и храните месячный комплект всех необходимых лекарств 106 | - [ ] подготовьте вещи так, чтоб можно было собраться и уехать в течение часа. 107 | 108 | ### В аэропорту/на границе 109 | 110 | - :warning: будут спрашивать про цель выезда, в ответе всегда озвучивайте ровно ту цель, которая указана при получении визы 111 | - т.е. для туристической визы *цель всегда - отдых/путешествие* 112 | - будьте готовы к вопросам на границе, в том числе о готовности воевать, поддержке СВО 113 | - оставайтесь спокойным, подбирайте нейтральные умеренно-патриотичные ответы, не поддавайтесь на провокации 114 | - пишут, что есть случаи, когда просят показать telegram и продиктовать IMEI телефона 115 | - это незаконно, но ИМХО, если хочешь без проблем вылететь, то лучше выполнить эти требования. 116 | 117 | ### В стране иммиграции 118 | 119 | Первоочередные вопросы: 120 | 121 | - как найти жилье? 122 | - [как платить за границей?](https://telegra.ph/Kak-platit-za-granicej-i-sehkonomit-na-kurse-10-09) 123 | - [как получать/отправлять денежные перевод из/в Росссию](https://vc.ru/finance/513222-vse-sposoby-legalnogo-vyvoda-deneg-iz-rossii-detalnyy-razbor-so-ssylkami)? 124 | - как найти работу? 125 | 126 | Найдите волонтерскую организацию, помогающую иммигрантам - с ними вы быстрей найдете решение своих проблем. 127 | 128 | ## Плановая релокация 129 | 130 | > :newspaper: Cледите за новостями, чтобы определить удачное время для плановой релокации: это не должно быть начало новой волны призыва или что-то такое. 131 | 132 | ### Подготовка 133 | 134 | - [x] определите список стран, где вы может получить разрешение на работу (т.е. это не туристическая виза) 135 | - [x] определите список членов семьи, которых хотите перевезти 136 | - [ ] убедитесь, что выполнены все пункты, связанные с [подготовкой к экстренной релокации](#подготовка) 137 | - [ ] подготовьте максимальное количество [документов для рабочей визы/ВНЖ](#для-получение-рабочей-визывнж) 138 | - [ ] медицина 139 | - [ ] поправьте здоровье, сделайте зубы 140 | - [ ] для ребенка проведите все необходимые медицинские процедуры, обследования, поставьте прививки 141 | - [ ] рассмотрите возможность сделать вакцину от короновируса 142 | - [ ] найдите знакомых/друзей в стране миграции, держите с ними связь 143 | - [ ] у работодателя: 144 | - [x] узнайте о возможности работать удаленно из страны миграции 145 | - [x] оцените работоспособность схемы, по которой работодатель будет платить вам зарплату 146 | - [ ] ищите других работодателей в стране миграции и оцените зарплату, на которую можете рассчитывать 147 | - [ ] позьмите справки с работы с информацией о зарплате, сроке трудоустройства и должности 148 | - [ ] разберитесь условия открытия банковского счета/карт в стране миграции 149 | - [x] подумайте над продажей машины (она в России, понадобится вам меньше, чем деньги в другой стране) 150 | - [x] проверьте доступ к Госуслугам и личному кабинету налогоплательщика 151 | - [x] перевелите вход во все важные государственные органы и банковские аккаунты на одну SIM карту 152 | - [ ] выберети правильный заграничный роуминг и пополните баланс 153 | - [ ] обязательно возьмите эту SIM карту за границу. 154 | - [ ] оформите страховку на квартиру (особенно если она в ипотеке) 155 | - [ ] улучшите свои навыки вождения автомобиля (если необходимо) 156 | - [ ] учите английский. 157 | 158 | ## :link: Полезные ссылки 159 | 160 | Разъяснения и гайды: 161 | 162 | 1. [Relocation Guide](https://relocation.guide/) 163 | -------------------------------------------------------------------------------- /sanctions-risks-in-cryptocurrency.md: -------------------------------------------------------------------------------- 1 | # Мир 2022: Как хранить криптовалюту в условиях санкций? 2 | 3 | ![Status](https://img.shields.io/badge/status-нуждается_в_актуализации-orange.svg) 4 | 5 | ***Инвестиции в криптовалюту: риск-менеджмент в условии санкций***. 6 | 7 | --- 8 | 9 | :heavy_plus_sign: Рассматривается использование *исключительно экономических* методов по минимизации персональных рисков. 10 | 11 | :heavy_minus_sign: Не рассматривается использование никаких *политических* методов: они важны для общества, но увеличивают риски для индивидуума. 12 | 13 | --- 14 | 15 | Содержание: 16 | 17 | - [:date: Важные новости](#date-важные-новости) 18 | - [TL;DR](#tldr) 19 | - [0. Правила игры (подготовка)](#0-правила-игры-подготовка) 20 | - [1. Что хранить?](#1-что-хранить) 21 | - [Криптовалюта со свободным курсом](#криптовалюта-со-свободным-курсом) 22 | - [Стейблкоин](#стейблкоин) 23 | - [:pushpin: Что хранить... а что не стоит](#pushpin-что-хранить-а-что-не-стоит) 24 | - [2. Где хранить?](#2-где-хранить) 25 | - [Биржи](#биржи) 26 | - [Кошельки](#кошельки) 27 | - [:pushpin: Где хранить... а где не стоит](#pushpin-где-хранить-а-где-не-стоит) 28 | - [Итак](#итак) 29 | - [:link: Полезные ссылки](#link-полезные-ссылки) 30 | 31 | --- 32 | 33 | - :warning: Непонимание работы используемых инвестиционных инструментов: акций, облигаций, криптовалюты и/или производных финансовых инструментов - несет в себе **риски полной утраты средств**. 34 | - :warning: Несоблюдение правил ИТ-безопасности, таких как сильные неповторяющиеся пароли, 2FA, [безопасный браузер](lists.md#список-софта), [защищенное соединение](lists.md#vpn) - несет в себе **риски полной утраты средств**. 35 | - :warning: Невыполнение [законодательства](lists.md#законодательные-акты) юрисдикций, через которые происходит инвестирование, несет в себе **риски полной утраты средств**. 36 | - :warning: Слепое следование чужим инвестиционным идеям несет в себе **риски полной утраты средств**. 37 | 38 | Ничего из перечисленного в данном репозитории не является финансовой рекомендацией. К моменту прочтения вами статьи какая-то информация ниже может уже устареть. 39 | 40 | --- 41 | 42 | ## :date: Важные новости 43 | 44 | **17 марта 2022** 45 | 46 | В Конгресс США внесен законопроект, который предполагает введение санкций в отношении иностранных криптобирж, сотрудничающих с российскими юридическими лицами. Также документ позволит министру финансов блокировать транзакции российских пользователей на криптобиржах, работающих в Соединенных Штатах. Подробнее на [Reuters](https://www.reuters.com/world/us-democrats-introduce-bill-curb-russian-crypto-use-amid-ukraine-crisis-2022-03-17/), [Forklog](https://forklog.com/v-ssha-predstavili-zakonoproekt-protiv-tranzaktsij-s-rossijskoj-kriptovalyutoj/). 47 | 48 | ## TL;DR 49 | 50 | #### Что хранить? 51 | 52 | Стейблкоины: 53 | 54 | - Храните в стейблоинах, у которых базовый актив `USD`/`EUR`, те средства, которые нужно: 55 | - точно сберечь 56 | - захеджировать от валютных рисков (снижения курса `RUB`, например) 57 | - Не храните/минимизируйте долю сильно-централизованных стейблкоинов (`USDT`, `USDC`) 58 | - Предпочитайте децентралиованные стейблкоины с обеспечением 59 | - Избегайте алгоритмические стейблкоины 60 | - Не храните стейблкоины только одного эмитента или проекта 61 | - (Рекомендуется) соберите корзину из стейблкоинов на доллар, евро, американские трежерис, золото. 62 | 63 | Криптовалюты со свободным курсом: 64 | 65 | - Храните в криптовалюте со свободным курсом (`BTC`, `ETH`) только те средства: 66 | - которые готовы инвестировать на 1-3 года 67 | - по которым готовы понести значительные убытки 68 | - Не храните/минимизируйте долю токенов от сильно-централизованных проектов (`XRP`) 69 | - Не храните криптовалютy только одного проекта. 70 | 71 | #### Где хранить? 72 | 73 | - *Не* храните средств на Централизованных биржах (`Binance`, `Kraken`, `OKX`) или сервисах, которые используют кастодиальные кошельки. Но если все-таки надо, то: 74 | - Пройдите KYC-процедуры сейчас (пока ограничений нет), используя реальные данные 75 | - Если вы трейдер, то оставьте на CEX только тот объем средств, который необходим для торговли 76 | - Не храните все на одной CEX биржу 77 | - Храните средства на Децентрализованных биржах (`Uniswap`, `PancakeSwap`, `dYdX`) или (лучше) приложениях, которые используют некастодиальные кошельки (`Atomic`, `Exodus`, `Trustee`) 78 | - Минимизируйте использование кошелька MetaMask 79 | - Не храните все на одной DEX бирже или одном приложении-кошельке. 80 | 81 | #### Как хранить? 82 | 83 | - Разделите средства между холодными и горячими кошельками: 84 | - Холодный кошелек, как банковская ячейка - там то, что не планируется кому-то показывать никогда 85 | - Горячий кошелек, как банковский счет - могу с него что-то купить, могу не покупать, а могу девушке на свидании показать 86 | - Используйте [аппаратный кошелек](https://bitcoin.org/choose-your-wallet?step=5&platform=hardware), если Вы миллионер, параноик или гик (одно другому не мешает) 87 | - Используйте некастодиальные кошельки для хранения средств: 88 | - Сохраните приватные ключи кошельков и seed/mnemonic фразы минимум на двух защищенных или зашифрованных носителях 89 | - Не пишитe/не печатайте seed-фразы выцветающими чернилам 90 | - Не палите свой российский IP (используйте VPN), не регистрируйтесь через почту/телефоны российских почтовых хостингов или сотовых операторов 91 | - Используйте CEX биржи для активного трейдинга (для всех остальных случаев - избегайте): 92 | - 2FA должен быть включен и работать через приложение-аутентификатор или защищенный токен, но только не SMS 93 | 94 | ## 0. Правила игры (подготовка) 95 | 96 | Две вещи, которые важно сделать "на берегу": 97 | 98 | 1. понять правила игры, которые начинают работать автоматически (хотите Вы того или нет), как только Вы приобрели криптовалюту 99 | 2. приготовиться к отключению разных частей ИТ-/финансовой инфраструктуры, таких как блокировка сайта криптобиржи, пластиковых карт, сообщений мобильного оператора. 100 | 101 | Про пункт 2 было рассказано в посте [Россия 2022: как не потерять все (или хотя бы попытаться)](introduction-to-risks.md) в части "Сценарий II: Блэкаут", и повторяться не буду. На пункте 1 остановимся отдельно. 102 | 103 | Правило 1: **Не твои ключи — не твои биткоины**. 104 | 105 | Если у Вас нет приватного ключа и seed/mnemonic фразы от кошелька, значит Вы не владеете никакими монетами. Вы владеете только обещанием (чаще всего юридически закрепленным) сервиса, что Вы единственный распорядитель этих монет. 106 | 107 | Правило 2: (Большие) **крипто-бизнесы играют по правилам государств**. И Вам придется. 108 | 109 | Компании с капитализацией в десятки миллиардов долларов (Coinbase, Binance, Ripple) вынуждены выполнять огромное количество правил и нормативов тех юрисдикций, где они ведут бизнес. 110 | 111 | В контексте темы статьи важно, что в российской юрисдикции не располагается ни одного крупного *публичного* крипто-бизнеса (даркнеты не считаем). Это означает, что Вам придется выполнять требования как минимум двух юрисдикций: где проживаете, и где "прописался" сервис, которым пользуетесь. 112 | 113 | Правило 3: **Безопасность враг удобства**. Не ищите серебряных пуль. 114 | 115 | Эти две характеристики сочетаются в каком-то балансе, но недостижимы одновременно. Самые безопасные способы хранения криптовалют не подойдут, если Вы хотите каждый день удобно проверять Ваш баланс или торговать "внутри дня" на криптобирже. В то же время самые удобные приложения не подойдут, если цель - надежно сохранить право собственности над монетами на горизонте 10+ лет. 116 | 117 | Сначала выберите цель(и), а потом найдите к ней(ним) инструмент(ы). Но не наоборот. 118 | 119 | ## 1. Что хранить? 120 | 121 | Для начала определимся, что хранить. Для частного инвестора доступны минимум 2 альтернативы: 122 | 123 | - Криптовалюту со свободным курсом (они ~~могут~~ будут дорожать или дешеветь) 124 | - Криптовалюту с фиксированным курсом (1 токен = $1 и цена надолго не изменяется), или стейблкоин (Stablecoin). 125 | 126 | ### Криптовалюта со свободным курсом 127 | 128 | Криптовалюта со свободным курсом - это токены как коммерческих, так и некоммерческих криптопроектов. Наиболее известные токены: `BTC` - токен сети Bitcoin, и `ETH` - токен сети Ethereum ([топ токенов по капитализации](https://coinmarketcap.com/)). 129 | 130 | Токены волатильны, и *вместе с рыночной доходность* таких инструментов инвестор получает и *рыночные риски*. Если не заниматься риск-менеджментом для такого типа вложений, то шансы на получение прибыли, в лучшем случае, 50/50. 131 | 132 | Список криптовалют со свободным курсом зависит от цели инвестиционного портфеля: чем больше толерантность к риску, тем больше процент таких валют. 133 | 134 | ### Стейблкоин 135 | 136 | Стейблкоин (Stablecoin) - криптовалюта, чей курс привязан к *базовому активу*: доллару, евро, золоту, долговые обязательства правительства США (вообще чему угодно, что имеет высокую ликвидность и низкую волатильность). 137 | 138 | Выделяют *классические* стейблкоины или *алгоритмические* стейблкоины. 139 | 140 | Классические стейблкоины (`USDT`, `USDC`, [список](lists.md#stablecoins)): 141 | 142 | - обеспечены (но на практике не всегда так) базовым активом, поэтому имеют низкие риски просадки цены 143 | - в основном имеют одного эмитента или нескольких эмитентов (гипер-централизованы), поэтому имеют высокие риски мошенничества с стороны эмитента, блокировки аккаунтов эмитентом и т.п. 144 | - в некоторые стейблкоины механизм блокировки зашит прям в протокол/смарт-контракт, поэтому, где бы вы их не хранили, эмитент сможет заблокировать их. 145 | 146 | Алгоритмические стейблкоины (`UST`, `sUSD`, [список](lists.md#stablecoins)): 147 | 148 | - обеспечены частично (иногда очень частично), балансировка цена происходит за счет специального алгоритма, поэтому риски просадки цены выше, чем у классических стейблкоинов 149 | - регулируются комьюнити (децентрализованы), поэтому имеют низкие риски управления. 150 | 151 | Сравнительные характеристики типичных представителей: 152 | 153 | | Характеристика | Криптовалюта с плавающим курсов | Классический стейблкоин | Алгоритмический стейблкоины | 154 | |--|--|--|--| 155 | | Риски потери средств | Высокие | Самая низкие* | Низкие | 156 | | Потенциальная доходность | Высокая | Нулевая* | Низкая | 157 | | **Риски блокировки средств** | Чаще низкие | Самые высокие | Низкие | 158 | | Риски взлома | Чаще низкие | Самая низкие | Самые высокие | 159 | 160 | \* Зависит от базового актива. Показатель приведен, когда базовый актив - `USD`. 161 | 162 | ### :pushpin: Что хранить... а что не стоит 163 | 164 | Риск блокировки средств высокий для всех блокчейнов/проектов, которые: 165 | 166 | - :-1: сильно централизованы и 167 | - :-1: находятся в американской юрисдикции или 168 | - :-1: выполняли блокировку средств по требованию американских властей. 169 | 170 | К таким проектам относятся: 171 | 172 | - :warning: Tether (стейблкоин `USDT`) уже ["морозил" приличные суммы средств ($160M) на кошельках своих клиентов по требованию регулятора](https://www.coindesk.com/markets/2022/01/13/tether-freezes-160m-of-usdt-stablecoin-on-ethereum-blockchain/), но [**отклонил** просьбу Украины заблокировать и прекратить обслуживать транзакции резидентами РФ](https://cointelegraph.com/news/cexs-refuse-blanket-asset-freeze-of-all-russian-users-though-questions-linger). 173 | - :warning: Circle (стейблкоин `USDC`) уже [блокировал $100K на кошельках своих клиентов по требованию властей США](https://www.coindesk.com/markets/2020/07/08/circle-confirms-freezing-100k-in-usdc-at-law-enforcements-request/) и уже [заблокировал ввод фиата (но не кошельков) из России](https://support.usdc.circle.com/hc/en-us/articles/4486692088468-Circle-Complies-with-New-Sanctions-Requirements) 174 | - :warning: Ripple (токен `XRP`) сильно централизован и имеет [долгие и дорогие судебные тяжбы с SEC](https://www.sec.gov/news/press-release/2020-338) 175 | - :warning: Binance Coin (токен `BNB`) - сильно централизован, блокирует аккаунты под американскими санкционными списками OFAC [4] (но **отказался** блокировать аккаунты по национальной принадлежности). 176 | 177 | ## 2. Где хранить? 178 | 179 | Для частного инвестора есть минимум две альтернативы: *криптобиржи* или *криптовалютные кошельки*. 180 | 181 | ### Биржи 182 | 183 | На крипторынках существует два типа бирж: *централизованные* (CEX) и *децентрализованные* биржи (DEX). 184 | 185 | **CEX** - торговая площадка, где во главу угла ставится *скорость движка биржи*. CEX впитали в себя все плюсы и минусы классических финансовых (фиатны) бирж. [Топ CEX бирж по капитализации](https://coinmarketcap.com/rankings/exchanges/). 186 | 187 | **DEX** - торговая площадки, где во главу угла ставится *контроль над ключами своих кошельков* и раскрываемыми личными данными. [Топ DEX бирж по капитализации](https://coinmarketcap.com/rankings/exchanges/dex/). 188 | 189 | Сравнительные характеристики типичных CEX и DEX: 190 | 191 | | Характеристика | CEX | DEX | 192 | | -- | -- | -- | 193 | | Ликвидность | Высокая | Средняя или низкая | 194 | | Скорость исполнения ордеров | Высокая | Средняя | 195 | | Проверки на вшивость эмитентов | Да, но scam иногда просачивается | Слабая | 196 | | ~~Проверки на вшивость трейдеров~~ KYC | + | - | 197 | | Богатый набор фич (такие как открытый API) | + | - | 198 | | Богатый набор инструментов (такие как фьючерсы) | + | Нет, но есть DeFi и NFT | 199 | | **Контроль над приватными ключами кошелька** | + | - | 200 | | Риски взлома | Низкие | Умеренные | 201 | 202 | *CEX контролирует приватные ключи* и с ними кошельки трейдера: нарушение правил биржи или законов юрисдикции биржи (в т.ч. из-за санкций) влечет за собой *риск потери контроля над средствами* нарушающей стороной. *DEX почти лишены такого риска*. 203 | 204 | ### Кошельки 205 | 206 | Криптовалютный кошелек (сryptocurrency wallet), далее Кошелек - устройство (физическое, программное или в виде удаленного сервиса), хранящее публичные и/или приватные ключи для криптовалютных транзакций. 207 | 208 | Кошельки в зависимости от стороны владеющие ключами разделяют на *кастодиальные* и *некастодиальные*. 209 | 210 | **Кастодиальный кошелек** - сервис/софт/устройство, которому a) доверяется генерация и безопасное хранение публичного и приватного ключей, b) который требует хранения приватного ключа на своей стороне для осуществления нужных Вам криптовалютных транзакций. 211 | 212 | Кастодиальные кошельки открывают CEX биржи. 213 | 214 | **Некастодиальный кошелек** - сервис/софт/устройство, который a) не хранит приватный ключ за пределами Вашего устройства и не хранит seed фразу, b) который не требует хранения приватного ключа на своей стороне для осуществления нужных Вам криптовалютных транзакций. 215 | 216 | Некастодиальные кошельки открывают DEX биржи и [специальные сервисы-кошельки](https://www.cryptowisser.com/wallets/). 217 | 218 | Сравнительные характеристики типичных кастодиальных и некастодиальных кошельков: 219 | 220 | | Характеристика | Кастодиальный | Некастодиальный | 221 | | -- | -- | -- | 222 | | Создание кошелька (генерация пар ключей) | Удаленно (на стороне сервиса) | Локально (на стороне приложения) | 223 | | **Контроль приватного ключа** | У сервиса | У вас | 224 | | **Знание seed фразы** | Только у сервиса | Только у вас | 225 | | Восстановление доступа к кошельку | Через процедуры сервиса | Только с помощью seed фразы | 226 | 227 | *Кастодиальные кошельки под полным контролем кастодиана*: любые нарушения правил кастодиана или законов юрисдикции кастодиана (в т.ч. из-за санкций) влечет за собой *риск потери контроля над средствами* нарушающей стороной. *Некастодиальные кошельки почти лишены такого риска*. 228 | 229 | ### :pushpin: Где хранить... а где не стоит 230 | 231 | Примем риск блокировки средств как высокий для всех бирж/кошельков, которые: 232 | 233 | - :-1: находятся в американской юрисдикции или 234 | - :-1: выполняли блокировку средств по требованию американских властей. 235 | 236 | Прецеденты: 237 | 238 | - :warning: Биржа Binance: 239 | - невозможно ввести/вывести деньги на карту с российских банков 240 | - P2P переводы для [неподсанкционных бакнков](lists.md#банки-под-санкциями) доступны 241 | - [блокируют пользователей только из санкционных списков OFAC](https://www.binance.com/en/blog/leadership/ukraine-russia-sanctions-and-crypto-421499824684903532), но не всех подряд с резиденством РФ 242 | - 2022-04-21 вступили в силу ограничения для резидентов РФ, чья сумма баланса в совокупности превышает €10 000: [доступен будет только вывод средства, торговля и депозиты будут заблокированы](https://www.binance.com/en/support/announcement/4887e569afdf4b1e89e024371d3a49b9). 243 | - :warning: Американская биржа Coinbase [объявила о блокировке более 25 тыс. кошельков](https://twitter.com/brian_armstrong/status/1499621509651787782?s=20&t=zGROkm-WKH5Ja6f6LR7BwA), связанных с российскими гражданами и компаниями из американских санкционных списков OFAC [4] 244 | - :warning: Американская биржа Kraken, несмотря на [просьбы со стороны украинских властей, **отказалась** блокировать российские аккаунты](https://twitter.com/jespow/status/1498112741684363265?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1498112741684363265%7Ctwgr%5E%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fcryptocurrency.tech%2Famerikanskaya-kriptobirzha-kraken-my-zablokiruem-scheta-rossiyan-v-sluchae-polucheniya-yuridicheskogo-trebovaniya%2F) без юридических оснований на это. 245 | - :no_entry: Биржа [Kuna](https://t.me/michaelchobanian/1439), [BTC Alpha](https://btc-alpha.com/en/news/important-message-for-btc-alpha-users-from-all-the), [Qmall](https://twitter.com/QmallExchange/status/1497957646531444738?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1497957646531444738%7Ctwgr%5E%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fforklog.com%2Fplatformy-kuna-whitebit-i-cex-io-vveli-ogranicheniya-dlya-rossijskih-polzovatelej%2F) заблокировали счета жителей России, а также заморозили их активы на своей платформе. 246 | 247 | - :warning: Представители биржи EXMO пообещали не блокировать доступ для всех российских пользователей, а только для лиц из санкционных списков. 248 | - :no_entry: Крупнейшие южнокорейские криптовалютные биржи Upbit, Bithumb и Korbit закрыли доступ к своим торговым платформам для россиян. 249 | - :no_entry_sign: Биржа CEX.io [прекратила регистрацию новых пользователей](https://t.me/CEXIO_Annoucements/201). 250 | - :warning: Крупнейшая NFT-биржа OpenSea, использующая для расчетов кошелек MetaMask, подтвердила, что [заблокировала и удалила аккаунты, попавшие в санкционные списки](https://fortune.com/2022/03/04/opensea-metamask-block-users-sanctions/) 251 | - :warning: Кошелек Metamask [недоступен в санкционных юрисдикциях Крым, Л/ДНР](https://metamask.zendesk.com/hc/en-us/articles/360059386712-Why-MetaMask-and-Infura-cannot-serve-certain-areas). 252 | 253 | ## Итак 254 | 255 | В сухом остатке: 256 | 257 | | Где | Что | Цель | Горизонт | Аналог на классических финансовых рынков | Риски просадки стоимости | Риски hack'ов | Риски блокировки средств (текущие) | Риски блокировки в случае санкций | 258 | | -- | -- | -- | -- | -- | -- | -- | -- | -- | 259 | | **CEX** биржа (кастодиальный кошелек) | Криптовалюты с плавающей стоимостью | Краткосрочные и высокорискованные инвестиции | Внутридневная торговля | Спекулятивная торговля на бирже | Самые высокие | Низкие | Умеренные | Самые высокие | 260 | | **DEX** биржа (некастодиальный кошелек) | Криптовалюты с плавающей стоимостью | Среднесрочные инвестиции | 1-3 года | Инвестиции в акции | Высокие | Умеренные | Низкие | Умеренные | 261 | | **Приложение-кошелек** ([некастодиальный кошелек](lists.md#некастодиальные-кошельки)) | Криптовалютные портфели с плавающей стоимостью | Средне- или долгосрочные инвестиции | ~3 года | Инвестиции в акции и ETF | Умеренные* | Низкие | Низкие | Низкие | 262 | | **DEX** биржа (некастодиальный кошелек) | Стейкинг пар с криптовалютой | Сбережения в валюте с защитой от инфляции | - | **Валютный депозит в банке** | Низкие | Умеренные | Низкие | Умеренные | 263 | | **Приложение-кошелек** (некастодиальный кошелек) | [Алгоритмические стейблкоины](lists.md#stablecoins) | Хэджирование валютных рисков | - | **Счет в долларах в банке** | Низкие | Низкие | Низкие | Низкие | 264 | | **Холодный кошелек** (некастодиальный) | BTC и ETH (не более 10%), алгоритмические стейблкоины | Надежно спрятать сбережения | от 3 лет | Банковская ячейка с долларами, золотом, акциями FAANG | Низкие** | Самые низкие | Самые низкие | Самые низкие | 265 | 266 | \* На горизонте 3 лет с ребалансировкой портфеля. 267 | 268 | \** Инфляция "ест" сбержения. 269 | 270 | 271 | ## :link: Полезные ссылки 272 | 273 | 1. **[Этот пост и обсуждения](https://habr.com/ru/post/655735/) на Habr**. 274 | 2. [Senators Say Cryptocurrencies Could Help Russia Evade Sanctions](https://www.wsj.com/livecoverage/russia-ukraine-latest-news-2022-03-02/card/senators-say-cryptocurrencies-could-help-russia-evade-sanctions-7dQ5pvPEwJ1xcSfCnoxI?mod=article_inline), The Wall Street Journal. 275 | 2. [EU seeks to prevent use of crypto to avoid Russia sanctions](https://www.ft.com/content/325864c5-01c5-4373-bdd2-aaa56400b30b), Financial Times. 276 | 3. [Justice Department Announces First Director of National Cryptocurrency Enforcement Team](https://www.justice.gov/opa/pr/justice-department-announces-first-director-national-cryptocurrency-enforcement-team), justice.gov. 277 | 4. [OFAC sanctions list](https://sanctionssearch.ofac.treas.gov/), OFAC. 278 | -------------------------------------------------------------------------------- /src/binance_open_data.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Binance Open Data lab" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "[Binance Open Data](https://github.com/binance/binance-public-data/#klines) and analyze it.\n", 15 | "\n", 16 | "### Stet 1. Download data \n", 17 | "\n", 18 | "Downloading __1-minute candles__ for `BTC/USDT` and `BTC/UDSC` using `bash` or `powershell` scripts:" 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": null, 24 | "metadata": { 25 | "vscode": { 26 | "languageId": "shellscript" 27 | } 28 | }, 29 | "outputs": [], 30 | "source": [ 31 | "#!/bin/sh\n", 32 | "\n", 33 | "# create dir for data\n", 34 | "!mkdir ../data\n", 35 | "\n", 36 | "# download data using GET request\n", 37 | "!wget -N -P ../data https://data.binance.vision/data/spot/daily/klines/BTCUSDT/1m/BTCUSDT-1m-2022-06-21.zip\n", 38 | "!wget -N -P../data https://data.binance.vision/data/spot/daily/klines/BTCUSDC/1m/BTCUSDC-1m-2022-06-21.zip\n", 39 | "\n", 40 | "# unzip\n", 41 | "!unzip -o -d ../data ../data/BTCUSDT-1m-2022-06-21.zip \n", 42 | "!unzip -o -d ../data ../data/BTCUSDC-1m-2022-06-21.zip" 43 | ] 44 | }, 45 | { 46 | "cell_type": "markdown", 47 | "metadata": {}, 48 | "source": [ 49 | "### Step 2: Import data to Dataframe \n", 50 | "\n", 51 | "Import packages for data analysis:" 52 | ] 53 | }, 54 | { 55 | "cell_type": "code", 56 | "execution_count": null, 57 | "metadata": {}, 58 | "outputs": [], 59 | "source": [ 60 | "import numpy as np\n", 61 | "import pandas as pd\n", 62 | "\n", 63 | "import httpx\n", 64 | "\n", 65 | "from datetime import datetime" 66 | ] 67 | }, 68 | { 69 | "cell_type": "markdown", 70 | "metadata": {}, 71 | "source": [ 72 | "Import data from CSV file to Pandas DataFrame:" 73 | ] 74 | }, 75 | { 76 | "cell_type": "code", 77 | "execution_count": null, 78 | "metadata": {}, 79 | "outputs": [], 80 | "source": [ 81 | "def get_data(pair: str) -> pd.DataFrame:\n", 82 | " return pd.read_csv(f'../data/{pair}-1m-2022-06-21.csv', header = None)\n", 83 | "\n", 84 | "btcusdt_df = get_data('BTCUSDT')\n", 85 | "btcusdt_df.head()" 86 | ] 87 | }, 88 | { 89 | "cell_type": "markdown", 90 | "metadata": {}, 91 | "source": [ 92 | "Set names to columns:" 93 | ] 94 | }, 95 | { 96 | "cell_type": "code", 97 | "execution_count": null, 98 | "metadata": {}, 99 | "outputs": [], 100 | "source": [ 101 | "def set_column_names(df: pd.DataFrame) -> pd.DataFrame:\n", 102 | " column_names_mapping = {\n", 103 | " 0: 'Open_time',\n", 104 | " 1: 'Open',\n", 105 | " 2: 'High',\n", 106 | " 3: 'Low',\n", 107 | " 4: 'Close',\n", 108 | " 5: 'Volume',\n", 109 | " 6: 'Close_time',\n", 110 | " 7: 'Quote_asset_volume',\n", 111 | " 8: 'Number_of_trades',\n", 112 | " 9: 'Taker_buy_base_asset_volume',\n", 113 | " 10: 'Taker_buy_quote_asset_volume',\n", 114 | " 11: 'Ignore'\n", 115 | " }\n", 116 | " return df.rename(columns=column_names_mapping)\n", 117 | "\n", 118 | "btcusdt_df = set_column_names(btcusdt_df)\n", 119 | "btcusdt_df.head()" 120 | ] 121 | }, 122 | { 123 | "cell_type": "markdown", 124 | "metadata": {}, 125 | "source": [ 126 | "Convert timestamp to human-readable date and time format:" 127 | ] 128 | }, 129 | { 130 | "cell_type": "code", 131 | "execution_count": null, 132 | "metadata": {}, 133 | "outputs": [], 134 | "source": [ 135 | "btcusdt_df['Open_time'] = btcusdt_df.iloc[:, 0].apply(lambda t: datetime.fromtimestamp(t/1000))\n", 136 | "btcusdt_df['Close_time'] = btcusdt_df.iloc[:, 6].apply(lambda t: datetime.fromtimestamp(t/1000))\n", 137 | "\n", 138 | "btcusdt_df.head()" 139 | ] 140 | }, 141 | { 142 | "cell_type": "markdown", 143 | "metadata": {}, 144 | "source": [ 145 | "Let's take a look at _Descriptive statistics_ (min, mean, max, standard deviation):" 146 | ] 147 | }, 148 | { 149 | "cell_type": "code", 150 | "execution_count": null, 151 | "metadata": {}, 152 | "outputs": [], 153 | "source": [ 154 | "btcusdt_df.describe(datetime_is_numeric=True)" 155 | ] 156 | }, 157 | { 158 | "cell_type": "markdown", 159 | "metadata": {}, 160 | "source": [ 161 | "### Step 2: Transform data\n", 162 | "\n", 163 | "Calculate __1-hour OHLCV__ candles:" 164 | ] 165 | }, 166 | { 167 | "cell_type": "code", 168 | "execution_count": null, 169 | "metadata": {}, 170 | "outputs": [], 171 | "source": [ 172 | "def calculate_ohclv(df: pd.DataFrame) -> pd.DataFrame:\n", 173 | " df['hour'] = df['Close_time'].apply(lambda t: t.hour)\n", 174 | "\n", 175 | " return (\n", 176 | " df\n", 177 | " .groupby(['hour'])\n", 178 | " .agg(\n", 179 | " {\n", 180 | " 'Open': 'first',\n", 181 | " 'High': max,\n", 182 | " 'Low': min,\n", 183 | " 'Close': 'last',\n", 184 | " 'Volume': sum,\n", 185 | " 'Close_time': max\n", 186 | " }\n", 187 | " )\n", 188 | " .reset_index()\n", 189 | " .drop(columns=['hour'])\n", 190 | " )\n", 191 | "\n", 192 | "btcusdt_1h_df = calculate_ohclv(btcusdt_df)\n", 193 | "\n", 194 | "btcusdt_1h_df" 195 | ] 196 | }, 197 | { 198 | "cell_type": "markdown", 199 | "metadata": {}, 200 | "source": [ 201 | "Data validation is very important. Let's write domain-driven asserts:" 202 | ] 203 | }, 204 | { 205 | "cell_type": "code", 206 | "execution_count": null, 207 | "metadata": {}, 208 | "outputs": [], 209 | "source": [ 210 | "assert(\n", 211 | " isinstance(btcusdt_1h_df, pd.DataFrame)\n", 212 | " and btcusdt_1h_df.shape == (24, 6)\n", 213 | " and not btcusdt_1h_df.isnull().any().any()\n", 214 | " and btcusdt_1h_df.iloc[:, 0:5].ge(0).all().all()\n", 215 | " )" 216 | ] 217 | }, 218 | { 219 | "cell_type": "markdown", 220 | "metadata": {}, 221 | "source": [ 222 | "### Step 3: Expand the dataset with information about `BTC/USDC` \n", 223 | "\n", 224 | "Download `BTC/USDC` 1-minute candles and transform it to 1-hour candles:" 225 | ] 226 | }, 227 | { 228 | "cell_type": "code", 229 | "execution_count": null, 230 | "metadata": {}, 231 | "outputs": [], 232 | "source": [ 233 | "btcusdc_df = get_data('BTCUSDC') # download data\n", 234 | "btcusdc_df = set_column_names(btcusdc_df) # set column names\n", 235 | "btcusdc_df['Close_time'] = btcusdc_df.iloc[:, 6].apply(lambda t: datetime.fromtimestamp(t/1000)) # convert timestamp to date+time\n", 236 | "\n", 237 | "btcusdc_1h_df = calculate_ohclv(btcusdc_df) # calculate 1h OHCLV candles\n", 238 | "btcusdc_1h_df" 239 | ] 240 | }, 241 | { 242 | "cell_type": "markdown", 243 | "metadata": {}, 244 | "source": [ 245 | "Join altogether:" 246 | ] 247 | }, 248 | { 249 | "cell_type": "code", 250 | "execution_count": null, 251 | "metadata": {}, 252 | "outputs": [], 253 | "source": [ 254 | "btcusdt_1h_df['pair'] = 'BTC-USDT'\n", 255 | "btcusdc_1h_df['pair'] = 'BTC-USDC'\n", 256 | "\n", 257 | "# Join datasets\n", 258 | "candles_1h_df = pd.concat([btcusdt_1h_df, btcusdc_1h_df])\n", 259 | "\n", 260 | "# Validate result\n", 261 | "assert(\n", 262 | " isinstance(candles_1h_df, pd.DataFrame)\n", 263 | " and candles_1h_df.shape == (48, 7)\n", 264 | " and (candles_1h_df['pair'].unique() == ['BTC-USDT', 'BTC-USDC']).all()\n", 265 | ")\n", 266 | "\n", 267 | "# Sort output by Close_time\n", 268 | "candles_1h_df.sort_values('Close_time')" 269 | ] 270 | }, 271 | { 272 | "cell_type": "markdown", 273 | "metadata": {}, 274 | "source": [ 275 | "### (Optional) Use Binance API" 276 | ] 277 | }, 278 | { 279 | "cell_type": "markdown", 280 | "metadata": {}, 281 | "source": [ 282 | "# %%\n", 283 | "import pandas as pd \n", 284 | "from binance.client import Client\n", 285 | "\n", 286 | "\n", 287 | "# %%\n", 288 | "api_key = \"****\"\n", 289 | "secret_key = \"***\"\n", 290 | "\n", 291 | "client = Client(api_key, secret_key)\n", 292 | "\n", 293 | "\n", 294 | "# %%\n", 295 | "coins_response = client.get_all_coins_info()\n", 296 | "coins_df = pd.DataFrame.from_dict(coins_response, orient='columns')\n", 297 | "\n", 298 | "\n", 299 | "# %%\n", 300 | "pairs_list = coins_df.coin.apply(lambda x: f\"{x}USDT\") \n", 301 | "client.get_historical_klines(\n", 302 | " 'BTCUSDT', \n", 303 | " interval=Client.KLINE_INTERVAL_1HOUR,\n", 304 | " start_str='2022-04-21', \n", 305 | " end_str='2022-04-22'\n", 306 | ")" 307 | ] 308 | } 309 | ], 310 | "metadata": { 311 | "kernelspec": { 312 | "display_name": "Python 3.9.13 ('base')", 313 | "language": "python", 314 | "name": "python3" 315 | }, 316 | "language_info": { 317 | "codemirror_mode": { 318 | "name": "ipython", 319 | "version": 3 320 | }, 321 | "file_extension": ".py", 322 | "mimetype": "text/x-python", 323 | "name": "python", 324 | "nbconvert_exporter": "python", 325 | "pygments_lexer": "ipython3", 326 | "version": "3.9.12" 327 | }, 328 | "orig_nbformat": 4, 329 | "vscode": { 330 | "interpreter": { 331 | "hash": "6fd7ff10be7e3a66c1b3745c4cbc00041a2589eb74ab4be46a3698a7b56001aa" 332 | } 333 | } 334 | }, 335 | "nbformat": 4, 336 | "nbformat_minor": 2 337 | } 338 | -------------------------------------------------------------------------------- /src/cryptocurrency_portfolio__assets_selection.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | 4 | """Crypto Currency Portfolio: Assets Selection. 5 | 6 | Description: 7 | Crypto Currency Selection using monte Carlo simulation. 8 | """ 9 | 10 | # %% Import dependencies ---- 11 | # core 12 | import os 13 | import gc 14 | 15 | # data science 16 | import pandas as pd 17 | import numpy as np 18 | from scipy.stats import norm 19 | 20 | # Cloud integration 21 | from azureml.core import Workspace, Dataset, VERSION as aml_version 22 | print(f'Azure ML SDK v{aml_version}') 23 | 24 | # network 25 | import ssl 26 | ssl._create_default_https_context = ssl._create_unverified_context 27 | 28 | # plots 29 | import matplotlib.pyplot as plt 30 | import seaborn as sns 31 | 32 | # show info about python env 33 | from IPython import sys_info 34 | print(sys_info()) 35 | 36 | import warnings 37 | warnings.filterwarnings("ignore") 38 | 39 | 40 | # %% Set params ---- 41 | symbols = ['BTCUSDT', 'ETHUSDT', 'BNBUSDT', 'SOLUSDT', 'MATICUSDT', 'UNIUSDT'] 42 | 43 | n_days = int(252) # US market has 252 trading days in a year 44 | n_iterations = int(1e4) 45 | 46 | 47 | 48 | # %% Load quotes ---- 49 | def get_quotes(symbol: str) -> pd.DataFrame: 50 | df = pd.read_csv(f'https://www.cryptodatadownload.com/cdd/Binance_{symbol}_d.csv', skiprows=[0]) 51 | df = df.set_index('date') 52 | df = df.sort_values(by = 'date') 53 | 54 | return df[['symbol', 'open', 'high', 'low', 'close']] 55 | 56 | quotes_data = [get_quotes(s) for s in symbols] 57 | # row-wise union: 58 | # pd.concat([get_quotes(s) for s in symbols]) 59 | # column-wise: 60 | # pd.concat(list1, axis=1, ignore_index=False) 61 | 62 | 63 | btcusdt_df = quotes_data[0] 64 | 65 | pd.concat([ 66 | btcusdt_df['close'].head(5), 67 | btcusdt_df['close'].tail(5) 68 | ]) 69 | 70 | 71 | 72 | # %% Calculate Return 73 | def get_returns(close_prices) -> pd.Series: 74 | return (close_prices/close_prices.shift()) - 1 75 | 76 | 77 | btcusdt_df['diff'] = btcusdt_df['close'].diff() 78 | btcusdt_df['return'] = get_returns(btcusdt_df['close']) 79 | 80 | btcusdt_df[['close', 'diff', 'return']].tail(10) 81 | 82 | 83 | 84 | # %% Calculate LogReturn 85 | def get_log_returns(return_prices) -> pd.Series: 86 | return np.log(1 + return_prices) 87 | 88 | btcusdt_df['log_return'] = btcusdt_df['return'].apply(lambda x: get_log_returns(x)) 89 | btcusdt_df[['close', 'diff', 'return', 'log_return']].tail(10) 90 | 91 | 92 | 93 | # %% Simulate possible LogReturns 94 | 95 | def get_simulated_returns(log_returns: pd.Series, n_days: int, n_iterations: int) -> pd.Series: 96 | u = log_returns.mean() 97 | var = log_returns.var() 98 | stdev = log_returns.std() 99 | 100 | drift = u - (0.5*var) 101 | Z = norm.ppf(np.random.rand(n_days, n_iterations)) 102 | 103 | return np.exp(drift + stdev*Z) 104 | 105 | 106 | btcusd_logreturns = btcusdt_df['log_return'].dropna() 107 | btcusd_simulated_returns = get_simulated_returns(btcusd_logreturns, n_days, n_iterations) 108 | 109 | assert( 110 | btcusd_simulated_returns.shape == (n_days, n_iterations) 111 | ) 112 | 113 | 114 | 115 | # %% Monte carlo simulation functions ---- 116 | def get_breakeven_prob(predicted, threshold = 0): 117 | """ 118 | This function calculated the probability of a stock being above a certain threshhold, which can be defined as a value (final stock price) or return rate (percentage change) 119 | """ 120 | predicted0 = predicted.iloc[0,0] 121 | predicted = predicted.iloc[-1] 122 | predList = list(predicted) 123 | 124 | over = [(i*100)/predicted0 for i in predList if ((i-predicted0)*100)/predicted0 >= threshold] 125 | less = [(i*100)/predicted0 for i in predList if ((i-predicted0)*100)/predicted0 < threshold] 126 | 127 | return (len(over)/(len(over) + len(less))) 128 | 129 | 130 | def monte_carlo_simulation(simulated_returns: pd.Series, last_actual_price: float, n_days: int, plot=True): 131 | # Create empty matrix 132 | price_list = np.zeros_like(simulated_returns) 133 | 134 | # Put the last actual price in the first row of matrix 135 | price_list[0] = last_actual_price 136 | 137 | # Calculate the price of each day 138 | for t in range(1, n_days): 139 | price_list[t] = price_list[t-1]*simulated_returns[t] 140 | 141 | # Plot 142 | if plot == True: 143 | x = pd.DataFrame(price_list).iloc[-1] 144 | fig, ax = plt.subplots(1, 2, figsize=(14,4)) 145 | sns.distplot(x, ax=ax[0]) 146 | sns.distplot(x, hist_kws={'cumulative': True}, kde_kws={'cumulative': True}, ax=ax[1]) 147 | plt.xlabel('Stock Price') 148 | plt.show() 149 | 150 | 151 | print(f"Investment period: {n_days-1}") 152 | print(f"Expected Value: ${round(pd.DataFrame(price_list).iloc[-1].mean(),2)}") 153 | print(f"Return: {round(100*(pd.DataFrame(price_list).iloc[-1].mean()-price_list[0,1])/pd.DataFrame(price_list).iloc[-1].mean(),2)}%") 154 | print(f"Probability of Breakeven: {get_breakeven_prob(pd.DataFrame(price_list))}") 155 | 156 | return pd.DataFrame(price_list) 157 | 158 | 159 | # %% Run Monte carlo simulation and estimate result 160 | 161 | simulated_prices_df = monte_carlo_simulation( 162 | btcusd_simulated_returns, 163 | quotes_data[0]['close'].tail(1), 164 | n_days) 165 | 166 | 167 | plt.figure(figsize=(10,6)) 168 | plt.plot(simulated_prices_df.iloc[:, 1:10]) 169 | plt.show() 170 | 171 | 172 | 173 | # %% Monte Carlo simulation pipeline for multiple tokens ---- 174 | 175 | n_iterations = int(1e4) #! WARN: set simulations number 176 | 177 | returns_data = [get_returns(df['close']) for df in quotes_data] 178 | log_returns_data = [get_log_returns(r) for r in returns_data] 179 | simulated_returns_data = [get_simulated_returns(lr, n_days, n_iterations) for lr in log_returns_data] 180 | 181 | 182 | for i in range(len(simulated_returns_data)): 183 | print(f'Starting Monte-Carlo simulation for {symbols[i]} symbol...') 184 | prices_ms = monte_carlo_simulation(simulated_returns_data[i], quotes_data[i]['close'].tail(1), n_days, plot=True) 185 | 186 | plt.figure(figsize=(10,6)) 187 | plt.plot(prices_ms.iloc[:, 1:50]) 188 | plt.show() 189 | -------------------------------------------------------------------------------- /src/fx_currencies_analysis.Rmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Currencies Analysis" 3 | date: "`r format(Sys.time(), '%d %B, %Y')`" 4 | output: 5 | github_document: 6 | toc: false 7 | toc_depth: 2 8 | fig_width: 9 9 | fig_height: 9 10 | --- 11 | 12 | ```{r setup, include=FALSE} 13 | knitr::opts_chunk$set(echo = T, warning = F) 14 | ``` 15 | 16 | ***Analysis price of the my list of currencies.*** 17 | 18 | ## Prepare 19 | 20 | Install packages and set environment :earth_asia: 21 | 22 | `install.packages("azuremlsdk")` 23 | 24 | ```{r set_envinroment, message=FALSE} 25 | options(max.print = 1e3, scipen = 999, width = 1e2) 26 | options(stringsAsFactors = F) 27 | 28 | suppressPackageStartupMessages({ 29 | library(dplyr) 30 | library(tidyr) 31 | 32 | library(lubridate) 33 | library(stringr) 34 | 35 | library(gt) 36 | library(tidyverse) 37 | library(glue) 38 | 39 | library(ggplot2) 40 | 41 | library(azuremlsdk) 42 | }) 43 | ``` 44 | 45 | 46 | ```{r set_params} 47 | .azureml_dataset_name <- "Currencies" 48 | ``` 49 | 50 | 51 | Connect to Azure ML workspace: 52 | 53 | ```{r azureml_connect} 54 | ws <- azuremlsdk::load_workspace_from_config() 55 | sprintf( 56 | "%s workspace located in %s region", ws$name, ws$location 57 | ) 58 | ``` 59 | 60 | 61 | ## Load dataset 62 | 63 | WARNING: I used `currency exchange rates` data from [Kaggle Dataset](https://www.kaggle.com/datasets/dhruvildave/currency-exchange-rates): 64 | 65 | ```{r get_azure_dataset} 66 | currencies_ds <- azuremlsdk::get_dataset_by_name(ws, name = .azureml_dataset_name) 67 | 68 | sprintf( 69 | "Dataset name: %s. %s", 70 | currencies_ds$name, 71 | currencies_ds$description 72 | ) 73 | ``` 74 | 75 | Get `USD/RUB` top higher rates: 76 | 77 | ```{r prepare_dataframe} 78 | quotes_df <- currencies_ds$to_pandas_dataframe() 79 | 80 | # ~ 20 years, 150 currencies and 1.5M rows 81 | 82 | quotes_df %>% 83 | filter(slug == "USD/RUB") %>% 84 | select(-slug) %>% 85 | top_n(10) %>% 86 | 87 | gt() %>% 88 | tab_header( 89 | title = "USD/RUB Rate", 90 | subtitle = glue("{min(quotes_df$date)} to {max(quotes_df$date)}") 91 | ) %>% 92 | fmt_date( 93 | columns = date, 94 | date_style = 6 95 | ) %>% 96 | fmt_number( 97 | columns = c(open, high, low, close) 98 | ) 99 | ``` 100 | 101 | ## Preprocessing data 102 | 103 | Calculate `Return` and `Log Return` for last 10 years: 104 | 105 | ```{r preprocessing} 106 | quotes_df %<>% 107 | transmute( 108 | symbol = slug, 109 | price = close, 110 | date 111 | ) %>% 112 | 113 | filter( 114 | str_detect(symbol, "USD/") & 115 | date > max(date) - lubridate::years(10) 116 | ) %>% 117 | 118 | filter(!(symbol == "USD/RUB" & price < 1)) %>% 119 | 120 | arrange(date) %>% 121 | group_by(symbol) %>% 122 | 123 | mutate( 124 | return = c(NA_real_, diff(price))/lag(price), 125 | log_return = log(1 + return) 126 | ) %>% 127 | na.omit 128 | ``` 129 | 130 | ## Discover Data 131 | 132 | Calculate statistics and `volatility`: 133 | 134 | ```{r discover} 135 | quotes_stats <- quotes_df %>% 136 | 137 | summarise( 138 | max_price = max(price), 139 | min_price = min(price), 140 | last_price = last(price), 141 | max_min_rate = max(price)/min(price), 142 | volatility = sd(log_return) 143 | ) 144 | 145 | quotes_stats %>% 146 | mutate( 147 | `100x Volatility` = volatility*100 148 | ) %>% 149 | arrange(volatility) %>% 150 | select(-volatility) %>% 151 | 152 | gt() %>% 153 | tab_header( 154 | title = "The Least and The Most Volatile Currencies", 155 | subtitle = glue("{min(quotes_df$date)} to {max(quotes_df$date)}") 156 | ) %>% 157 | fmt_number( 158 | columns = c(max_price, min_price, max_min_rate, last_price, `100x Volatility`) 159 | ) 160 | ``` 161 | My broker trades the following pairs: 162 | 163 | ```{r} 164 | symbols <- c( 165 | 'RUB', 166 | 'EUR', 'GBP', 'CHF', 'CNY', 'HKD', 'JPY', 'SEK', 'SGD', 'AUD', 167 | 'AED', 'KZT', 'BYN', 'TRY', 'MXN' 168 | ) 169 | 170 | symbols <- str_c("USD", symbols, sep = "/") 171 | 172 | 173 | quotes_stats %>% 174 | filter( 175 | symbol %in% symbols 176 | ) %>% 177 | mutate( 178 | `100x Volatility` = volatility*100 179 | ) %>% 180 | arrange(volatility) %>% 181 | select(-volatility) %>% 182 | 183 | gt() %>% 184 | tab_header( 185 | title = "The Most Promised Currencies", 186 | subtitle = glue("{min(quotes_df$date)} to {max(quotes_df$date)}") 187 | ) %>% 188 | fmt_number( 189 | columns = c(max_price, min_price, last_price, max_min_rate, `100x Volatility`) 190 | ) 191 | 192 | ``` 193 | Plot exchange rate for out favorites: 194 | 195 | Define low risk symbols: 196 | 197 | ```{r} 198 | usdrub_vol <- quotes_stats %>% filter(symbol == "USD/RUB") %>% pull(volatility) 199 | 200 | low_risk_symbols <- quotes_stats %>% 201 | filter( 202 | symbol %in% symbols & 203 | volatility <= usdrub_vol 204 | ) %>% 205 | pull(symbol) %>% 206 | unique 207 | 208 | cat( 209 | sprintf( 210 | "['%s']", 211 | paste(low_risk_symbols, collapse = "', '") 212 | )) 213 | ``` 214 | 215 | 216 | ```{r} 217 | jumper_symbols <- quotes_stats %>% filter(max_min_rate > 2) %>% pull(symbol) 218 | 219 | quotes_df %>% 220 | filter(symbol %in% low_risk_symbols) %>% 221 | mutate( 222 | jumper = if_else(symbol %in% jumper_symbols, "High risk currencies", "Low risk currencies") 223 | ) %>% 224 | group_by(symbol) %>% 225 | mutate(R = cumsum(return)) %>% 226 | 227 | ggplot + 228 | geom_line(aes(x = date, y = R, color = symbol)) + 229 | scale_y_continuous(labels = scales::percent_format(accuracy = 1)) + 230 | 231 | facet_grid(jumper ~ ., scales = "free") + 232 | 233 | labs( 234 | title = "Currencies Exchange Rates", subtitle = "Return of Investment for last 10 years", 235 | x = "", y = "Return of Investment", 236 | caption = currencies_ds$description) + 237 | theme_minimal() + 238 | 239 | theme( 240 | legend.position = "top", legend.title = element_blank(), 241 | plot.caption = element_text(size = 8) 242 | ) 243 | ``` 244 | 245 | 246 | 247 | 248 | 249 | -------------------------------------------------------------------------------- /src/fx_currencies_analysis.md: -------------------------------------------------------------------------------- 1 | Currencies Analysis 2 | ================ 3 | 04 April, 2022 4 | 5 | ***Analysis price of the my list of currencies.*** 6 | 7 | ## Prepare 8 | 9 | Install packages and set environment :earth asia: 10 | 11 | `install.packages("azuremlsdk")` 12 | 13 | ``` r 14 | options(max.print = 1e3, scipen = 999, width = 1e2) 15 | options(stringsAsFactors = F) 16 | 17 | suppressPackageStartupMessages({ 18 | library(dplyr) 19 | library(tidyr) 20 | 21 | library(lubridate) 22 | library(stringr) 23 | 24 | library(gt) 25 | library(tidyverse) 26 | library(glue) 27 | 28 | library(ggplot2) 29 | 30 | library(azuremlsdk) 31 | }) 32 | ``` 33 | 34 | ``` r 35 | .azureml_dataset_name <- "Currencies" 36 | ``` 37 | 38 | Connect to Azure ML workspace: 39 | 40 | ``` r 41 | ws <- azuremlsdk::load_workspace_from_config() 42 | sprintf( 43 | "%s workspace located in %s region", ws$name, ws$location 44 | ) 45 | ``` 46 | 47 | ## [1] "portf-opt-ws workspace located in westeurope region" 48 | 49 | ## Load dataset 50 | 51 | WARNING: I used `currency exchange rates` data from [Kaggle 52 | Dataset](https://www.kaggle.com/datasets/dhruvildave/currency-exchange-rates): 53 | 54 | ``` r 55 | currencies_ds <- azuremlsdk::get_dataset_by_name(ws, name = .azureml_dataset_name) 56 | 57 | sprintf( 58 | "Dataset name: %s. %s", 59 | currencies_ds$name, 60 | currencies_ds$description 61 | ) 62 | ``` 63 | 64 | ## [1] "Dataset name: Currencies. Source: https://www.kaggle.com/datasets/dhruvildave/currency-exchange-rates" 65 | 66 | Get `USD/RUB` top higher rates: 67 | 68 | ``` r 69 | quotes_df <- currencies_ds$to_pandas_dataframe() 70 | 71 | # ~ 20 years, 150 currencies and 1.5M rows 72 | 73 | quotes_df %>% 74 | filter(slug == "USD/RUB") %>% 75 | select(-slug) %>% 76 | top_n(10) %>% 77 | 78 | gt() %>% 79 | tab_header( 80 | title = "USD/RUB Rate", 81 | subtitle = glue("{min(quotes_df$date)} to {max(quotes_df$date)}") 82 | ) %>% 83 | fmt_date( 84 | columns = date, 85 | date_style = 6 86 | ) %>% 87 | fmt_number( 88 | columns = c(open, high, low, close) 89 | ) 90 | ``` 91 | 92 | ## Selecting by close 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 |
USD/RUB Rate
1996-10-30 to 2021-08-30
dateopenhighlowclose
Jan 21, 201682.0685.8282.0681.82
Jan 22, 201680.6181.2677.9482.90
Jan 26, 201681.5482.1678.3379.84
Feb 3, 201679.5679.7577.8779.71
Feb 10, 201679.3979.4977.6579.59
Feb 12, 201679.3679.7478.5979.77
Mar 19, 202080.9282.0779.2480.92
Mar 23, 202079.7281.3479.4979.84
Mar 31, 202079.5979.6977.6679.59
Nov 3, 202080.5580.5779.0580.52
168 | 169 | 170 | ## Preprocessing data 171 | 172 | Calculate `Return` and `Log Return` for last 10 years: 173 | 174 | ``` r 175 | quotes_df %<>% 176 | transmute( 177 | symbol = slug, 178 | price = close, 179 | date 180 | ) %>% 181 | 182 | filter( 183 | str_detect(symbol, "USD/") & 184 | date > max(date) - lubridate::years(10) 185 | ) %>% 186 | 187 | filter(!(symbol == "USD/RUB" & price < 1)) %>% 188 | 189 | arrange(date) %>% 190 | group_by(symbol) %>% 191 | 192 | mutate( 193 | return = c(NA_real_, diff(price))/lag(price), 194 | log_return = log(1 + return) 195 | ) %>% 196 | na.omit 197 | ``` 198 | 199 | ## Discover Data 200 | 201 | Calculate statistics and `volatility`: 202 | 203 | ``` r 204 | quotes_stats <- quotes_df %>% 205 | 206 | summarise( 207 | max_price = max(price), 208 | min_price = min(price), 209 | last_price = last(price), 210 | max_min_rate = max(price)/min(price), 211 | volatility = sd(log_return) 212 | ) 213 | 214 | quotes_stats %>% 215 | mutate( 216 | `100x Volatility` = volatility*100 217 | ) %>% 218 | arrange(volatility) %>% 219 | select(-volatility) %>% 220 | 221 | gt() %>% 222 | tab_header( 223 | title = "The Least and The Most Volatile Currencies", 224 | subtitle = glue("{min(quotes_df$date)} to {max(quotes_df$date)}") 225 | ) %>% 226 | fmt_number( 227 | columns = c(max_price, min_price, max_min_rate, last_price, `100x Volatility`) 228 | ) 229 | ``` 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 |
The Least and The Most Volatile Currencies
2011-09-01 to 2021-08-30
symbolmax_pricemin_pricelast_pricemax_min_rate100x Volatility
USD/AED3.673.673.671.000.01
USD/HKD7.857.757.791.010.03
USD/KWD0.310.270.301.160.16
USD/CNY7.186.036.471.190.23
USD/DJF177.72172.00177.501.030.28
USD/SGD1.461.201.341.210.33
USD/SAR3.773.303.751.140.39
USD/GTQ7.897.047.731.120.41
USD/ILS4.073.133.201.300.45
USD/TTD6.785.936.761.140.47
USD/CAD1.460.971.261.510.47
USD/MYR4.492.964.161.520.50
USD/DKK7.155.186.301.380.51
USD/EUR0.960.700.851.380.51
USD/CRC619.70478.54619.701.290.53
USD/PHP54.2339.7549.711.360.54
USD/INR77.5745.7073.291.700.54
USD/RON4.542.934.181.550.55
USD/JPY125.6375.74109.901.660.55
USD/GBP0.870.580.731.490.55
USD/JMD153.8883.37150.531.850.56
USD/MKD58.9242.0751.981.400.58
USD/MDL20.3111.0917.581.830.61
USD/BDT84.7272.3984.721.170.62
USD/AUD1.740.931.371.880.63
USD/SEK10.446.298.621.660.64
USD/CHF1.030.790.921.310.64
USD/CZK26.0316.7521.671.550.64
USD/BWP12.196.5811.121.850.66
USD/NZD1.781.131.431.570.66
USD/THB36.4328.0732.451.300.67
USD/LKR199.43106.22199.431.880.67
USD/KRW1,262.93999.831,165.891.260.70
USD/RSD118.4770.0599.291.690.70
USD/UYU45.3118.0842.532.510.71
USD/PLN4.282.873.861.490.72
USD/HUF338.26188.61294.661.790.74
USD/MUR42.5526.5042.551.610.79
USD/MXN25.3411.9820.142.110.80
USD/NIO35.1322.0535.001.590.84
USD/KZT454.34174.15427.182.610.84
USD/QAR3.903.003.641.300.95
USD/TRY8.781.718.385.120.97
USD/ZAR19.256.9814.662.760.99
USD/RUB82.9028.7973.502.881.05
USD/ZMW22.645.1115.824.431.06
USD/BRL5.891.585.193.721.08
USD/ARS97.704.1097.7023.851.11
USD/TND3.061.372.792.231.17
USD/BGN1.871.211.661.551.28
USD/EGP19.605.8315.653.371.29
USD/NOK11.765.368.662.191.31
USD/PEN4.112.384.071.721.34
USD/BYN3.080.512.516.041.37
USD/MAD10.297.898.951.301.43
USD/UAH33.507.8026.924.301.83
USD/SDG451.001.39440.03324.465.96
USD/BND1.430.661.342.186.29
USD/XOF647.0058.00555.4711.166.44
USD/IDR16,504.80892.0014,370.0018.506.58
USD/HNL24.903.0023.838.308.14
USD/MZN78.493.3063.1123.788.77
USD/ETB45.231.0045.0645.239.26
USD/TWD33.731.8027.7718.729.86
USD/PKR168.152.00165.6384.0712.69
USD/UZS10,653.2083.0010,646.89128.3512.93
USD/GHS573.001.005.98573.0013.74
USD/ISK147.042.00126.6573.5216.09
USD/PGK3.510.293.5111.8916.18
USD/MMK1,642.006.231,642.00263.6516.59
USD/CLP867.505.00782.21173.5018.70
USD/SZL1,189.001.0714.911,111.2118.79
USD/XPF119.351.00100.90119.3519.32
USD/SOS1,670.006.00571.00278.3329.77
USD/MWK812.431.00804.55812.4330.83
USD/NGN412.501.00411.00412.5031.65
USD/VND23,631.0021.0022,775.001,125.2934.09
USD/COP4,174.753.673,805.251,136.6737.09
USD/IQD1,578.0010.001,458.00157.8037.10
USD/MGA3,931.180.303,808.0012,910.2946.29
USD/SLL10,250.501.0010,250.5010,250.5047.59
742 | 743 | 744 | My broker trades the following pairs: 745 | 746 | ``` r 747 | symbols <- c( 748 | 'RUB', 749 | 'EUR', 'GBP', 'CHF', 'CNY', 'HKD', 'JPY', 'SEK', 'SGD', 'AUD', 750 | 'AED', 'KZT', 'BYN', 'TRY', 'MXN' 751 | ) 752 | 753 | symbols <- str_c("USD", symbols, sep = "/") 754 | 755 | 756 | quotes_stats %>% 757 | filter( 758 | symbol %in% symbols 759 | ) %>% 760 | mutate( 761 | `100x Volatility` = volatility*100 762 | ) %>% 763 | arrange(volatility) %>% 764 | select(-volatility) %>% 765 | 766 | gt() %>% 767 | tab_header( 768 | title = "The Most Promised Currencies", 769 | subtitle = glue("{min(quotes_df$date)} to {max(quotes_df$date)}") 770 | ) %>% 771 | fmt_number( 772 | columns = c(max_price, min_price, last_price, max_min_rate, `100x Volatility`) 773 | ) 774 | ``` 775 | 776 |
777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 830 | 831 | 832 | 833 | 834 | 835 | 836 | 837 | 838 | 839 | 840 | 841 | 842 | 843 | 844 | 845 | 846 | 847 | 848 | 849 | 850 | 851 | 852 | 853 | 854 | 855 | 856 | 857 | 858 | 859 | 860 | 861 | 862 | 863 | 864 | 865 | 866 | 867 | 868 | 869 | 870 | 871 | 872 | 873 | 874 | 875 | 876 | 877 | 878 | 879 | 880 | 881 | 882 | 883 | 884 | 885 | 886 | 887 | 888 | 889 | 890 | 891 |
The Most Promised Currencies
2011-09-01 to 2021-08-30
symbolmax_pricemin_pricelast_pricemax_min_rate100x Volatility
USD/AED3.673.673.671.000.01
USD/HKD7.857.757.791.010.03
USD/CNY7.186.036.471.190.23
USD/SGD1.461.201.341.210.33
USD/EUR0.960.700.851.380.51
USD/JPY125.6375.74109.901.660.55
USD/GBP0.870.580.731.490.55
USD/AUD1.740.931.371.880.63
USD/SEK10.446.298.621.660.64
USD/CHF1.030.790.921.310.64
USD/MXN25.3411.9820.142.110.80
USD/KZT454.34174.15427.182.610.84
USD/TRY8.781.718.385.120.97
USD/RUB82.9028.7973.502.881.05
USD/BYN3.080.512.516.041.37
892 |
893 | 894 | Plot exchange rate for out favorites: 895 | 896 | Define low risk symbols: 897 | 898 | ``` r 899 | usdrub_vol <- quotes_stats %>% filter(symbol == "USD/RUB") %>% pull(volatility) 900 | 901 | low_risk_symbols <- quotes_stats %>% 902 | filter( 903 | symbol %in% symbols & 904 | volatility <= usdrub_vol 905 | ) %>% 906 | pull(symbol) %>% 907 | unique 908 | 909 | cat( 910 | sprintf( 911 | "['%s']", 912 | paste(low_risk_symbols, collapse = "', '") 913 | )) 914 | ``` 915 | 916 | ## ['USD/AED', 'USD/AUD', 'USD/CHF', 'USD/CNY', 'USD/EUR', 'USD/GBP', 'USD/HKD', 'USD/JPY', 'USD/KZT', 'USD/MXN', 'USD/RUB', 'USD/SEK', 'USD/SGD', 'USD/TRY'] 917 | 918 | ``` r 919 | jumper_symbols <- quotes_stats %>% filter(max_min_rate > 2) %>% pull(symbol) 920 | 921 | quotes_df %>% 922 | filter(symbol %in% low_risk_symbols) %>% 923 | mutate( 924 | jumper = if_else(symbol %in% jumper_symbols, "High risk currencies", "Low risk currencies") 925 | ) %>% 926 | group_by(symbol) %>% 927 | mutate(R = cumsum(return)) %>% 928 | 929 | ggplot + 930 | geom_line(aes(x = date, y = R, color = symbol)) + 931 | scale_y_continuous(labels = scales::percent_format(accuracy = 1)) + 932 | 933 | facet_grid(jumper ~ ., scales = "free") + 934 | 935 | labs( 936 | title = "Currencies Exchange Rates", subtitle = "Return of Investment for last 10 years", 937 | x = "", y = "Return of Investment", 938 | caption = currencies_ds$description) + 939 | theme_minimal() + 940 | 941 | theme( 942 | legend.position = "top", legend.title = element_blank(), 943 | plot.caption = element_text(size = 8) 944 | ) 945 | ``` 946 | 947 | ![](fx_currencies_analysis_files/figure-gfm/unnamed-chunk-3-1.png) 948 | -------------------------------------------------------------------------------- /src/fx_currencies_analysis_files/figure-gfm/unnamed-chunk-3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codez0mb1e/resistance/6e505a526a559c5111686efe8b2430a713e3c070/src/fx_currencies_analysis_files/figure-gfm/unnamed-chunk-3-1.png -------------------------------------------------------------------------------- /src/fx_currency_portfolio__assets_selection.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | """Currency Portfolio: Assets Selection. 4 | 5 | Description: 6 | Currency Selection in anti-crisis portfolio using Monte Carlo simulation. 7 | """ 8 | 9 | # %% Import dependencies ---- 10 | # core 11 | import sys 12 | import warnings 13 | import gc 14 | from IPython import sys_info 15 | 16 | # data science 17 | import pandas as pd 18 | import numpy as np 19 | from scipy.stats import norm 20 | 21 | # Cloud integration 22 | from azureml.core import Workspace, Dataset, ComputeTarget, VERSION as aml_version 23 | print(f'Azure ML SDK v{aml_version}') 24 | # plots 25 | import matplotlib.pyplot as plt 26 | import seaborn as sns 27 | 28 | # show info about python env 29 | print(sys_info()) 30 | warnings.filterwarnings("ignore") 31 | 32 | 33 | # %% Set params ---- 34 | n_days = int(252) # US market has 252 trading days in a year 35 | n_simulations = int(1e4) # number of Monte-Carlo simulations 36 | 37 | # The most promised currencies (copy this list from fx_currencies_analysis.Rmd) 38 | symbols = [ 39 | 'USD/AED', 'USD/AUD', 'USD/CHF', 'USD/CNY', 'USD/EUR', 'USD/GBP', 40 | 'USD/HKD', 'USD/JPY', 'USD/KZT', 'USD/MXN', 'USD/RUB', 'USD/SEK', 'USD/SGD' 41 | ] 42 | 43 | 44 | # %% Connect to Azure ML workspace ---- 45 | ws = Workspace.from_config() 46 | print(f"Connected to *{ws.get_details()['friendlyName']}* workspace in *{ws.get_details()['location']}*.") 47 | 48 | print('Compute Targets:') 49 | for compute_name in ws.compute_targets: 50 | compute = ws.compute_targets[compute_name] 51 | print('\t', compute.name, ':', compute.type) 52 | 53 | # > htop 54 | 55 | 56 | # %% Load dateset ---- 57 | currencies_ds = Dataset.get_by_name(ws, name='Currencies') 58 | currencies_ds.to_pandas_dataframe() 59 | 60 | print(f'Dataset name: {currencies_ds.name}. Description: {currencies_ds.description}.') 61 | print(f'Size of Azure ML dataset object: {sys.getsizeof(currencies_ds)} bytes.') 62 | 63 | 64 | # %% Preprocessing ---- 65 | quotes_df = (currencies_ds 66 | # materialize 67 | .to_pandas_dataframe() 68 | # define format 69 | .rename(columns={'slug': 'symbol'}) 70 | .loc[:, ['symbol', 'date', 'close']] 71 | # filter 72 | .query("symbol in @symbols") 73 | .query("date > '2012-01-01'") 74 | # set time index 75 | .set_index('date') 76 | .sort_values(by='date')) 77 | 78 | quotes_df 79 | 80 | 81 | # %% Discover data ---- 82 | quotes_df.groupby('symbol')['close'].agg(['count', 'last']) 83 | 84 | 85 | # %% USD/RUB dataset ---- 86 | usdrub_df = quotes_df[quotes_df.symbol == 'USD/RUB'] 87 | usdrub_df 88 | 89 | 90 | # %% Calculate Return ---- 91 | def calc_returns(close_prices: pd.Series) -> pd.Series: 92 | """Calculate Investment Return""" 93 | return (close_prices/close_prices.shift()) - 1 94 | 95 | 96 | usdrub_df['diff'] = usdrub_df['close'].diff() 97 | usdrub_df['return'] = calc_returns(usdrub_df['close']) 98 | 99 | usdrub_df[['close', 'diff', 'return']].tail(10) 100 | 101 | 102 | # %% Calculate LogReturn ---- 103 | def calc_log_returns(return_prices: pd.Series) -> pd.Series: 104 | """Calculate Log Return""" 105 | return np.log(1 + return_prices) 106 | 107 | usdrub_df['log_return'] = usdrub_df['return'].apply(lambda x: calc_log_returns(x)) 108 | 109 | usdrub_df[['close', 'diff', 'return', 'log_return']].tail(10) 110 | 111 | 112 | # %% Simulate possible LogReturns ---- 113 | 114 | def calc_simulated_returns(log_returns: pd.Series, n_days: int, n_iterations: int) -> pd.Series: 115 | """Calculate Simulated Return""" 116 | 117 | u = log_returns.mean() 118 | var = log_returns.var() 119 | stdev = log_returns.std() 120 | 121 | drift = u - (0.5*var) 122 | Z = norm.ppf(np.random.rand(n_days, n_iterations)) 123 | 124 | return np.exp(drift + stdev*Z) 125 | 126 | 127 | usdrub_simulated_returns = calc_simulated_returns( 128 | usdrub_df['log_return'].dropna(), 129 | n_days, 130 | n_simulations) 131 | 132 | assert( 133 | usdrub_simulated_returns.shape == (n_days, n_simulations) 134 | and (usdrub_simulated_returns > 0).all() 135 | and (usdrub_simulated_returns < 2).all() 136 | ) 137 | 138 | 139 | # %% Monte carlo simulation evaluation ---- 140 | 141 | def get_breakeven_prob(pred, risk_free_rate: float = 0.02) -> pd.Series: 142 | """ 143 | Calculation of the probability of a stock being above a certain threshold, 144 | which can be defined as a value (final stock price) or return rate (percentage change). 145 | """ 146 | 147 | init_pred = pred.iloc[0, 0] 148 | 149 | last_pred = pred.iloc[-1] 150 | pred_list = list(last_pred) 151 | 152 | over = [(p*100)/init_pred for p in pred_list if ((p-init_pred)*100)/init_pred >= risk_free_rate] 153 | less = [(p*100)/init_pred for p in pred_list if ((p-init_pred)*100)/init_pred < risk_free_rate] 154 | 155 | return len(over)/(len(over) + len(less)) 156 | 157 | 158 | def evaluate_simulation(simulated_returns: pd.Series, last_actual_price: float, n_days: int, plot: bool = True) -> pd.DataFrame: 159 | """ 160 | Evaluate Monte-Carlo simulations result 161 | """ 162 | 163 | # Create empty matrix 164 | price_list = np.zeros_like(simulated_returns) 165 | 166 | # Put the last actual price in the first row, 167 | # and calculate the price of each day 168 | price_list[0] = last_actual_price 169 | for t in range(1, n_days): 170 | price_list[t] = price_list[(t - 1)]*simulated_returns[t] 171 | 172 | # convert to temp dataframe 173 | price_df = pd.DataFrame(price_list) 174 | 175 | # Plot 176 | if plot == True: 177 | x = price_df.iloc[-1] 178 | fig, ax = plt.subplots(1, 2, figsize=(14, 4)) 179 | sns.distplot(x, ax=ax[0]) 180 | sns.distplot(x, hist_kws={'cumulative': True}, kde_kws={'cumulative':True}, ax=ax[1]) 181 | plt.xlabel('Stock Price') 182 | plt.show() 183 | 184 | print('Results:') 185 | print(f'\tInvestment period: {n_days-1} days') 186 | print(f'\tExpected Value: {round(price_df.iloc[-1].mean(), 2)} per USD') 187 | print(f'\tReturn: {round(100*(price_df.iloc[-1].mean() - price_list[0,1])/price_df.iloc[-1].mean(), 2)}%') 188 | print(f'\tProbability of Breakeven: {get_breakeven_prob(price_df)}') 189 | 190 | return price_df 191 | 192 | 193 | # %% Run Monte carlo simulation and estimate result ---- 194 | 195 | usdrub_mc_simulation_df = evaluate_simulation( 196 | usdrub_simulated_returns, 197 | last_actual_price=usdrub_df['close'].tail(1), 198 | n_days=n_days) 199 | 200 | 201 | plt.figure(figsize=(10, 6)) 202 | plt.plot(usdrub_mc_simulation_df.sample(10, axis='columns')) 203 | plt.title('USD/RUB Price Simulation') 204 | plt.xlabel('Days') 205 | plt.ylabel('RUB per $1') 206 | plt.ylim(10, 300) 207 | plt.show() 208 | 209 | 210 | # %% Monte Carlo simulation pipeline for multiple tokens ---- 211 | 212 | # 1. prepare 213 | quotes_data = [quotes_df.query('symbol == @s') for s in quotes_df.symbol.unique()] 214 | symbols_list = [df.symbol.unique() for df in quotes_data] 215 | 216 | # 2. simulate 217 | returns_data = [calc_returns(df['close']) for df in quotes_data] 218 | log_returns_data = [calc_log_returns(r) for r in returns_data] 219 | simulated_returns_data = [calc_simulated_returns(lr, n_days, n_simulations) for lr in log_returns_data] 220 | 221 | assert( 222 | len(quotes_data) > 0 223 | and len(quotes_data) == len(symbols_list) == len(returns_data) == len(log_returns_data) == len(simulated_returns_data) 224 | ) 225 | 226 | # 3. evaluate 227 | for i in range(len(symbols_list)): 228 | print(f'---- Starting Monte-Carlo simulation for {symbols_list[i]} symbol ----') 229 | 230 | prices_ms = evaluate_simulation(simulated_returns_data[i], quotes_data[i]['close'].tail(1), n_days, plot=False) 231 | 232 | plt.figure(figsize=(10, 6)) 233 | plt.plot(prices_ms.sample(50, axis='columns')) 234 | plt.title(f'{symbols_list[i]} Price Simulation') 235 | plt.xlabel('Days') 236 | plt.ylabel('Amount per $1') 237 | plt.show() 238 | 239 | 240 | # %% Completed ---- 241 | gc.collect() 242 | 243 | --------------------------------------------------------------------------------