Amazonクラりドサヌビスず投資ポヌトフォリオ分析

最近、株匏垂堎には高いボラティリティがありたす。たずえば、有名な䌚瀟の安定した玙が、経営に察する制裁に぀いおのニュヌスで数パヌセントを䞀床に倱う可胜性がありたす。その逆は、肯定的な報告ず投資家の䜙分な利益配圓に関する期埅に぀いお急䞊昇したす。



特定のセキュリティの所有暩が収益を生み出したのか、それずも単に損倱ず倱望を生み出したのかをどのように刀断したすか







出兞



この蚘事では、調敎された有䟡蚌刞の財務結果を特定しお芖芚化する方法を説明したす。



クラむアントレポヌトOpening Brokerの䟋を䜿甚しお、株匏垂堎の蚌刞レポヌトの解析ず統合を怜蚎し、クラりドレポヌトシステムのアヌキテクチャを構築しお、AWS Quicksightで簡単で䟿利な分析を行いたす。



タスクの説明



倚くのトレヌニングず教育のレッスンは、トレヌダヌのゞャヌナルの必芁性に぀いお教えおくれたす。トレヌダヌのゞャヌナルでは、さらなる分析ず取匕戊略の芁玄のために、すべおの取匕パラメヌタヌが蚘録されたす。 この取匕所での取り組みにより、トレヌダヌを鍛え、意識を高めるこずができたすが、退屈なプロセスに疲れるこずもありたす。



最初はゞャヌナリングのアドバむスにも泚意深く埓い、各トランザクションをそのパラメヌタヌでExcelテヌブルに现心の泚意を払っお曞き、レポヌト、サマリヌチャヌト、蚈画された将来のトランザクションを䜜成したしたが、すぐに疲れたした。



トレヌダヌの日蚘を手動で保持するのが䞍䟿なのはなぜですか
  • ゞャヌナルの手動充填トレヌディングタヌミナルから毎日の取匕をアンロヌドする圢での郚分的な自動化を䜿甚する堎合でもすぐに疲れたす。
  • 手動で入力するず゚ラヌたたはタむプミスのリスクが高くなりたす。
  • アクティブなトレヌダヌがパッシブな投資家になり、この雑誌にどんどん戻っおきお、それを完党に忘れおしたうこずがありたす私の堎合。 最埌に
  • プログラミングできるので、これを掻甚しおプロセス党䜓を自動化しおみたせんか さあ、行こう


倚くの堎合、蚌刞䌚瀟は、関心のあるほがすべおの問題に぀いおかなり高品質の分析をクラむアントに提䟛するハむテク組織です。 このレポヌトは曎新ごずに改善されおいるず蚀っおも過蚀ではありたせんが、最も高床なものであっおも、芁求の倚い、奜奇心customers盛な顧客が芋たいカスタマむズや統合がない堎合がありたす。



たずえば、Opening Brokerを䜿甚するず、個人口座でXML圢匏の蚌刞取匕レポヌトを受け取るこずができたすが、モスクワ蚌刞取匕所MOEXにIIAず通垞の蚌刞口座がある堎合、これらは2぀の異なるレポヌトになりたす。 Petersburg Stock ExchangeSPB、最初の2぀はもう1぀远加したす。



合蚈で、統合された投資家のゞャヌナルを受け取るためには、XML圢匏の3぀のファむルを凊理する必芁がありたす。



前述のMOEXずSPBのレポヌトは圢匏がわずかに異なるため、デヌタマッピングを実装するプロセスで考慮する必芁がありたす。



開発䞭のシステムのアヌキテクチャ



次の図は、開発䞭のシステムのアヌキテクチャモデルを瀺しおいたす。









パヌサヌの実装



個人アカりントの3぀のアカりントすべおに぀いお、可胜な限り最倧の期間各幎に耇数のレポヌトに分割できたすのレポヌトを受け取り、XML圢匏で保存しお1぀のフォルダヌに入れたす。 調査のテストデヌタずしお、架空のクラむアントポヌトフォリオを䜿甚したすが、垂堎の珟実に可胜な限り近いパラメヌタヌを䜿甚したす。









怜蚎䞭の投資家X氏が5぀の有䟡蚌刞の小さなポヌトフォリオを持っおいるず仮定したす。



  1. SPB亀換に関するレポヌトには、AppleずMicrosoftの2぀のペヌパヌがありたす。
  2. MOEX亀換ブロヌカヌに関するレポヌトには、FGC UESずいう1぀の論文が含たれおいたす。
  3. MOEX取匕所IISのレポヌトには、MMKずOFZ 24019の2぀の蚌刞が含たれおいたす。


5぀の蚌刞によるず、賌入/販売、配圓の支払い、クヌポンの取匕があり、䟡栌が倉わる可胜性がありたす。 珟圚の状況、すなわち、すべおの支払い、取匕、および珟圚の垂堎䟡倀を考慮した財務結果を確認したいのです。



ここでPythonが登堎し、すべおのレポヌトの情報を1぀の配列に読み取りたす。



my_files_list = [join('Data/', f) for f in listdir('Data/') if isfile(join('Data/', f))] my_xml_data = [] #     for f in my_files_list: tree = ET.parse(f) root = tree.getroot() my_xml_data.append(root)
      
      





分析のために、レポヌトからいく぀かの゚ンティティが必芁です。



  • ポヌトフォリオ内の蚌刞のポゞション。
  • 完了した取匕。
  • 非取匕操䜜およびその他のアカりントの動き。
  • オヌプンポゞションの平均䟡栌
サンプルを準備するために、4぀の蟞曞を䜿甚しお䞊蚘のセットを説明したす。



 dict_stocks = {'stock_name': [], 'account': [], 'currency': [], 'current_cost': [], 'current_cost_rub': [], 'saldo' : []} dict_deals = {'stock_name': [], 'account': [], 'date_oper': [], 'type_oper': [], 'quantity': [], 'price': [], 'currency': [], 'brokerage': [], 'result': []} dict_flows = {'stock_name': [], 'account': [], 'date_oper': [], 'type_oper': [], 'result': [], 'currency': []} dict_avg_price = {'stock_name': [], 'account': [], 'avg_open_price' : []}
      
      





これらの蟞曞が䜕であるかに぀いおのいく぀かの蚀葉。



蟞曞dict_stocks
ポヌトフォリオに関する䞀般情報を保存するには、dict_stocks蟞曞が必芁です。



  • 甚玙の名前stock_name;
  • アカりント名SPB、MOEX BROK、MOEX IISアカりント;
  • 本曞の決枈に䜿甚される通貚通貚;
  • 珟圚の倀個人口座開蚭ブロヌカヌでレポヌトを生成した時点current_cost。 ここで、私は、芁求が厳しい顧客に察しおは、将来さらに远加の改善を行い、取匕端末たたは察応する取匕所のりェブサむトからのセキュリティ芋積もりの​​動的な受信を䜿甚するこずができたす。
  • レポヌトが生成された時点のセキュリティポゞションの珟圚の倀current_cost_rub

    䞊蚘の項目ず同様に、ここでは、珟圚の時点での䞭倮銀行のレヌトたたは為替レヌトを必芁に応じお取埗するこずもできたす。
  • 有䟡蚌刞の珟圚の残高saldo


蟞曞dict_deals
dict_deals蟞曞は、完了したトランザクションに関する次の情報を保存するために必芁です。



  • 甚玙の名前stock_name;
  • アカりント名SPB、MOEX BROK、MOEX IISアカりント;
  • 取匕日、すなわち T0date_oper;
  • 操䜜のタむプtype_oper;
  • 取匕に参加しおいる蚌刞の量量。
  • トランザクションが実行された䟡栌䟡栌。
  • トランザクションが実行された通貚通貚。
  • 取匕の仲介手数料仲介;
  • トランザクションの財務結果結果


Dict_flows蟞曞
dict_flowsディクショナリは、クラむアントアカりントの資金の動きを反映し、次の情報を栌玍するために䜿甚されたす。



  • 甚玙の名前stock_name;
  • アカりント名SPB、MOEX BROK、MOEX IISアカりント;
  • 取匕日、すなわち T0date_oper;
  • 操䜜のタむプtype_oper。 いく぀かの倀を取るこずができたすdiv、NKD、tax;
  • トランザクションが実行された通貚通貚。
  • 操䜜の財務結果結果


蟞曞dict_avg_price
dict_avg_price蟞曞は、各論文の平均賌入䟡栌の䌚蚈情報に必芁です。



  • 甚玙の名前stock_name;
  • アカりント名SPB、MOEX BROK、MOEX IISアカりント;
  • オヌプンポゞションの平均䟡栌avg_open_price


XMLドキュメントの配列を凊理し、これらの蟞曞に適切なデヌタを入力したす。



 #       for XMLdata in my_xml_data: #      exchange_name = 'SPB' if XMLdata.get('board_list') == ' ' else 'MOEX' client_code = XMLdata.get('client_code') account_name = get_account_name(exchange_name, client_code) #   current_position, deals, flows, stock_name, \ saldo, ticketdate, price, brokerage, \ operationdate, currency, \ current_cost, current_cost_rub, \ stock_name_deal, payment_currency, currency_flows = get_allias(exchange_name) #      get_briefcase(XMLdata) df_stocks = pd.DataFrame(dict_stocks) df_stocks.set_index("stock_name", drop = False, inplace = True) #    get_deals(XMLdata) df_deals = pd.DataFrame(dict_deals) df_avg = pd.DataFrame(dict_avg_price) #       get_nontrade_operation(XMLdata) df_flows = pd.DataFrame(dict_flows)
      
      





すべおの凊理は、レポヌトのすべおのXMLデヌタのルヌプを通過したす。 取匕プラットフォヌムに関する情報、クラむアントコヌドはすべおのレポヌトで同じであるため、マッピングを䜿甚せずに同じタグから安党に抜出できたす。



ただし、レポヌトSPBたたはMOEXに基づいおタグに必芁な゚むリアスを提䟛する特別なデザむンを䜿甚する必芁がありたす。 これらのレポヌトの性質が同じデヌタは、異なる方法で呌び出されたす。



タグの䞍䞀臎
  • SBPレポヌトのトランザクションに察するブロヌカヌのコミッションは、 brokerageタグずMOEXレポヌト-broker_commissionにありたす。
  • SPBレポヌトの非取匕口座取匕日はoperationdateであり、MOEXでは、 operation_dateなどです。


タグマッピングの䟋
 tags_mapping = { 'SPB': { 'current_position': 'briefcase_position', 'deals': 'closed_deal', 'flows': 'nontrade_money_operation', ... 'stock_name_deal': 'issuername', 'paymentcurrency': 'paymentcurrency', 'currency_flows': 'currencycode' }, 'MOEX': { 'current_position': 'spot_assets', 'deals': 'spot_main_deals_conclusion', 'flows': 'spot_non_trade_money_operations', ... 'stock_name_deal': 'security_name', 'paymentcurrency': 'price_currency_code', 'currency_flows': 'currency_code' } }
      
      





get_allias関数は、取匕プラットフォヌムの名前を入力ずしお、凊理に必芁なタグの名前を返したす。



GET_ALLIASファンクション
 def get_allias(exchange_name): return( tags_mapping[exchange_name]['current_position'], tags_mapping[exchange_name]['deals'], tags_mapping[exchange_name]['flows'], ... tags_mapping[exchange_name]['stock_name_deal'], tags_mapping[exchange_name]['paymentcurrency'], tags_mapping[exchange_name]['currency_flows'] )
      
      





関数get_briefcaseは、クラむアントポヌトフォリオのステヌタスに関する情報を凊理したす。



GET_BRIEFCASEファンクション
 def get_briefcase(XMLdata): #         briefcase_position briefcase_position = XMLdata.find(current_position) if not briefcase_position: return try: for child in briefcase_position: stock_name_reduce = child.get(stock_name).upper() stock_name_reduce = re.sub('[,\.]|(\s?INC)|(\s+$)|([-\s]?)', '', stock_name_reduce) dict_stocks['stock_name'].append(stock_name_reduce) dict_stocks['account'].append(account_name) dict_stocks['currency'].append(child.get(currency)) dict_stocks['current_cost'].append(float(child.get(current_cost))) dict_stocks['current_cost_rub'].append(float(child.get(current_cost_rub))) dict_stocks['saldo'].append(float(child.get(saldo))) except Exception as e: print('get_briefcase --> Oops! It seems we have a BUG!', e)
      
      





次に、get_deals関数はトランザクションに関する情報を取埗したす。



GET_DEALS関数
 def get_deals(XMLdata): stock_name_proc = '' closed_deal = XMLdata.find(deals) if not closed_deal: return #   SPB    -    , #    MOEX:  ,      #    : if exchange_name == 'SPB': sortchildrenby(closed_deal, stock_name_deal) for child in closed_deal: sortchildrenby(child, stock_name_deal) try: for child in closed_deal: stock_name_reduce = child.get(stock_name_deal).upper() stock_name_reduce = re.sub('[,\.]|(\s?INC)|(\s+$)|([-\s]?)', '', stock_name_reduce) dict_deals['stock_name'].append(stock_name_reduce) dict_deals['account'].append(account_name) dict_deals['date_oper'].append(to_dt(child.get(ticketdate)).strftime('%Y-%m-%d')) current_cost = get_current_cost(stock_name_reduce) #    SPB     - quantity, #   MOEX  : buy_qnty  sell_qnty if exchange_name == 'MOEX': if child.get('buy_qnty'): quantity = float(child.get('buy_qnty')) else: quantity = - float(child.get('sell_qnty')) else: quantity = float(child.get('quantity')) dict_deals['quantity'].append(quantity) dict_deals['price'].append(float(child.get('price'))) dict_deals['type_oper'].append('deal') dict_deals['currency'].append(child.get(payment_currency)) brok_comm = child.get(brokerage) if brok_comm is None: brok_comm = 0 else: brok_comm = float(brok_comm) dict_deals['brokerage'].append(float(brok_comm)) #         if stock_name_proc != stock_name_reduce: if stock_name_proc != '': put_avr_price_in_df(account_name, stock_name_proc, \ pnl.m_net_position, pnl.m_avg_open_price) current_cost = get_current_cost(stock_name_proc) pnl.update_by_marketdata(current_cost) if len(dict_deals['result']) > 0: if exchange_name != 'SPB': dict_deals['result'][-1] = pnl.m_unrealized_pnl * 0.87 -dict_deals['brokerage'][-2] else: dict_deals['result'][-1] = pnl.m_unrealized_pnl - dict_deals['brokerage'][-2] stock_name_proc = stock_name_reduce pnl = PnlSnapshot(stock_name_proc, float(child.get('price')), quantity) dict_deals['result'].append(-1 * brok_comm) else: pnl.update_by_tradefeed(float(child.get('price')), quantity) #  ,   if quantity < 0: if pnl.m_realized_pnl > 0 and exchange_name != 'SPB': pnl_sum = pnl.m_realized_pnl * 0.87 - brok_comm else: pnl_sum = pnl.m_realized_pnl - brok_comm dict_deals['result'].append(float(pnl_sum)) else: pnl.update_by_marketdata(current_cost) dict_deals['result'].append(-1 * brok_comm) put_avr_price_in_df(account_name, stock_name_proc, \ pnl.m_net_position, pnl.m_avg_open_price) current_cost = get_current_cost(stock_name_proc) pnl.update_by_marketdata(current_cost) if len(dict_deals['result']) > 0: if exchange_name != 'SPB': dict_deals['result'][-1] = pnl.m_unrealized_pnl * 0.87 -dict_deals['brokerage'][-2] else: dict_deals['result'][-1] = pnl.m_unrealized_pnl - dict_deals['brokerage'][-2] except Exception as e: print('get_deals --> Oops! It seems we have a BUG!', e)
      
      





トランザクションのパラメヌタヌに関する情報を䜿甚しお配列を凊理するこずに加えお、オヌプンポゞションの平均䟡栌を蚈算し、FIFOメ゜ッドを䜿甚しおPNLによっお実珟されたす。 PnlSnapshotクラスはこの蚈算を担圓したすが、わずかな修正を加えお䜜成するために、ここに瀺されたコヌドが基瀎ずしお採甚されたした PL蚈算



そしお最埌に、実装が最も難しいのは、非トレヌディング操䜜に関する情報を取埗する機胜-get_nontrade_operationです。 その耇雑さは、非トレヌディング操䜜に䜿甚されるレポヌトブロックには、この操䜜が関連付けられおいるトランザクションのタむプずセキュリティに関する明確な情報がないずいう事実にありたす。



非取匕操䜜の支払い先の䟋
配圓の支払いたたは未払いのクヌポン収入は、次のように衚瀺されたす。



  1. 収入クラむアントの支払い<777777> 配圓 < アップル INC-ao>-> SPBレポヌトからの配圓の支払い。
  2. 収入クラむアント<777777> 配圓金の支払い < MICROSOFTCOM ->
  3. 所埗クラむアント777777iNKD 2 OFZ 24019 の源泉城収皎0.00ルヌブルの支払い-> MOEXレポヌトからのクヌポンの支払い。
  4. FGC UESのクラむアント777777 配圓ぞの収入の支払い-源泉城収皎XX.XXルヌブル-> MOEXレポヌトからの配圓の支払い。 など


したがっお、正芏衚珟なしで行うのは難しいため、それらを最倧限に䜿甚したす。 問題のもう1぀の偎面は、䌚瀟の名前が、ポヌトフォリオたたは支払目的の取匕の名前ず必ずしも䞀臎しないこずです。 したがっお、支払いの目的から受け取った発行者の名前は、蟞曞ずさらに関連付ける必芁がありたす。 蟞曞ずしお、取匕の配列を䜿甚したす。 䌁業の最も完党なリストがありたす。



get_company_from_str関数は、コメントから発行者名を取埗したす。



get_company_from_str関数
 def get_company_from_str(comment): company_name = '' #    / flows_pattern = [ '^.+\s<(\w+)?.+->$', '^.+\s(.+)-.+$', '^.+\(\s\d?\s(.+)\).+$', '^.+\s(.+)-.+$' ] for pattern in flows_pattern: match = re.search(pattern, comment) if match: return match.group(1).upper() return company_name
      
      





get_company_from_briefcase関数は、トランザクションに参加した䌚瀟の䞭で䞀臎するものを芋぀けた堎合、䌚瀟名を蟞曞に導きたす。



GET_COMPANY_FROM_BRIEFCASEファンクション
 def get_company_from_briefcase(company_name): company_name_full = None value_from_dic = df_deals[df_deals['stock_name'].str.contains(company_name)] company_arr = value_from_dic['stock_name'].unique() if len(company_arr) == 1: company_name_full = company_arr[0] return company_name_full
      
      







そしお最埌に、非トレヌディング操䜜に関するデヌタを収集する最終機胜はget_nontrade_operationです



Get_nontrade_operation関数
 def get_nontrade_operation(XMLdata): nontrade_money_operation = XMLdata.find(flows) if not nontrade_money_operation: return try: for child in nontrade_money_operation: comment = child.get('comment') type_oper_match = re.search('||^.+.+.+$', comment) if type_oper_match: company_name = get_company_from_str(comment) type_oper = get_type_oper(comment) dict_flows['stock_name'].append(company_name) dict_flows['account'].append(account_name) dict_flows['date_oper'].append(to_dt(child.get(operationdate)).strftime('%Y-%m-%d')) dict_flows['type_oper'].append(type_oper) dict_flows['result'].append(float(child.get('amount'))) dict_flows['currency'].append(child.get(currency_flows)) except Exception as e: print('get_nontrade_operation --> Oops! It seems we have a BUG!', e)
      
      





レポヌトからデヌタを収集した結果、3぀のDataFrameが生成されたすが、これらはおよそ次のずおりです。



  1. オヌプンポゞションの平均䟡栌に関する情報を含むDataFrame





  2. Deal DataFrame





  3. 非取匕操䜜に関する情報を含むDataFrame









したがっお、私たちがやるべきこずは、トランザクションテヌブルずポヌトフォリオ情報テヌブルの倖郚結合を実行するこずだけです。



 df_result = pd.merge(df_deals, df_stocks_avg, how='outer', on=['stock_name', 'account', 'currency']).fillna(0) df_result.sample(10)
      
      











最埌に、デヌタ配列の凊理の最埌の郚分は、前のステップで取埗したデヌタ配列ず非トレヌディングトランザクションのDataFrameのマヌゞです。

行われた䜜業の結果は、分析に必芁なすべおの情報を含む1぀の倧きなフラットテヌブルです。



 df_result_full = df_result.append(df_flows, ignore_index=True).fillna(0) df_result_full.sample(10).head()
      
      











DataFrameからの結果のデヌタセット最終レポヌトはCSVに簡単にアップロヌドされ、BIシステムで詳现な分析に䜿甚できたす。



 if not exists('OUTPUT'): makedirs('OUTPUT') report_name = 'OUTPUT\my_trader_diary.csv' df_result_full.to_csv(report_name, index = False, encoding='utf-8-sig')
      
      







AWSでデヌタをアップロヌドしお凊理する



進歩は止たっおおらず、珟圚、クラりドサヌビスずサヌバヌレスコンピュヌティングモデルは、デヌタ凊理ずストレヌゞで倧きな人気を集めおいたす。 これは、耇雑な蚈算やビッグデヌタ凊理甚のシステムアヌキテクチャを構築するために高䟡な機噚を賌入する必芁はないが、必芁な時間だけクラりドで電力をレンタルし、必芁なリ゜ヌスを比范的少ない料金で十分に迅速に展開する堎合、このアプロヌチのシンプルさず䜎䟡栌によるずころが倧きい。



垂堎で最倧か぀最も有名なクラりドプロバむダヌの1぀はAmazonです。 Amazon Web ServicesAWS環境の䟋を芋お、投資ポヌトフォリオのデヌタを凊理するための分析システムを構築しおみたしょう。



AWSには豊富なツヌルがありたすが、次のものを䜿甚したす。





Amazonのドキュメントは倧䞈倫です。特に、 AWS GlueでAthenaを䜿甚する際のベストプラクティスに関する蚘事があり、 AWS Glueを䜿甚しおテヌブルずデヌタを䜜成および䜿甚する方法に぀いお説明しおいたす。 この蚘事の䞻なアむデアを掻甚しお、分析レポヌトシステムの独自のアヌキテクチャを䜜成するためにそれらを適甚しおみたしょう。



レポヌトパヌサヌによっお準備されたCSVファむルがS3バケットに远加されたす。 S3の察応するフォルダヌは、毎週土曜日-取匕週の終わりに補充される予定であるため、レポヌトの䜜成ず凊理の日付にデヌタを分割せずに行うこずはできたせん。

このアプロヌチでは、このようなデヌタに察するSQLク゚リの操䜜を最適化するだけでなく、たずえば各論文の財務結果の倉化のダむナミクスを取埗するなど、远加の分析を行うこずができたす。



Amazon S3を䜿甚する
  • S3にバケットを䜜成し、「レポヌトパヌサヌ」ず呌びたす。
  • このバケット「report-parser」に「my_trader_diary」ずいうフォルダヌを䜜成したす。
  • 「my_trader_diary」ディレクトリで、珟圚のレポヌトの日付を䜿甚しおディレクトリを䜜成したす。たずえば、「date_report = 2018-10-01」ずし、その䞭にCSVファむルを配眮したす。
  • 実隓ずセクショニングの理解を深めるために、「date_report = 2018-09-27」ず「date_report = 2018-10-08」ずいう2぀のディレクトリを䜜成したす。 同じCSVファむルをそれらに入れたす。
  • 最終的なS3バケット「レポヌトパヌサヌ」は、次の図に瀺すようになりたす。









AWS Glueを䜿甚する
抂しお、S3にあるデヌタから倖郚テヌブルを䜜成するには、Amazon Athenaしかできたせんが、AWS Glueはこのためのより柔軟で䟿利なツヌルです。



  • AWS Glueに移動し、新しいクロヌラヌを䜜成したす。このクロヌラヌは、日付を報告するこずにより、個別のCSVファむルから1぀のテヌブルを収集したす。

    • 新しいクロヌラヌの名前を蚭定したす。
    • デヌタを取埗するリポゞトリを瀺したすs3// report-parser / my_trader_diary /
    • クロヌラヌを起動し、S3の指定されたリ゜ヌスにアクセスするためのアクセス暩を持぀新しいIAMロヌルを遞択たたは䜜成したす。
    • 次に、開始頻床を蚭定する必芁がありたす。 今のずころオンデマンドで蚭定しおいたすが、将来的にはこれが倉わり、ロヌンチは毎週になるず思いたす。
    • 保存しお、クロヌラヌが䜜成されるのを埅ちたす。
  • クロヌラヌが準備完了状態になったら、起動しおください







  • 動䜜するず、新しいmy_trader_diaryテヌブルがAWS Glueに衚瀺されたすDatabase-> Tablesタブ









生成されたテヌブルをより詳现に怜蚎しおください。

䜜成されたテヌブルの名前をクリックするず、メタデヌタの説明が蚘茉されたペヌゞに移動したす。 䞀番䞋にはテヌブルレむアりトがあり、最新のものは゜ヌスCSVファむルにない列date_reportです。 このAWS Glue列は、゜ヌスデヌタのセクションの定矩に基づいお自動的に䜜成されたすバケットS3では、フォルダに特別な名前を付けたした-date_report = YYYY-MM-DD。これにより、日付で区切っおセクションずしお䜿甚できたす。



テヌブルのパヌティション分割






同じペヌゞの右䞊隅にある[パヌティションの衚瀺]ボタンをクリックするず、生成されたテヌブルがどのセクションで構成されおいるかを確認できたす。







デヌタ分析



凊理枈みのデヌタを自由にロヌドできるので、簡単に分析を開始できたす。 開始するには、Amazon Athenaの機胜を分析ク゚リを実行する最も簡単で最速の方法ず考えおください。 これを行うには、Amazon Athenaサヌビスに移動し、必芁なデヌタベヌス金融を遞択しお、次のSQLコヌドを蚘述したす。



 select d.date_report, d.account, d.stock_name, d.currency, sum(d.quantity) as quantity, round(sum(d.result), 2) as result from my_trader_diary d group by d.date_report, d.account, d.stock_name, d.currency order by d.account, d.stock_name, d.date_report;
      
      





このリク゚ストにより、すべおのレポヌト日付に぀いお各蚌刞の玔財務結果が提䟛されたす。 なぜなら 同じレポヌトを異なる日付に3回アップロヌドしたしたが、結果は倉わらず、もちろん実際の垂堎では異なりたす。









しかし、受信したデヌタを柔軟な衚たたは図の圢匏で芖芚化する堎合はどうでしょうか ここでは、Amazon QuickSightが圹立ちたす。これにより、SQLク゚リを蚘述するのずほが同じ速さで柔軟な分析を構成できたす。 Amazon QuickSightサヌビスにアクセスしたす登録しおいない堎合は登録が必芁です。



[新芏分析]-> [新芏デヌタセット]ボタンをクリックし、衚瀺されるりィンドりでデヌタセットの゜ヌスを遞択しお、[Athena]をクリックしたす。











デヌタ゜ヌスの名前、たずえば「PNL_analysis」を考え出し、「デヌタ゜ヌスの䜜成」ボタンをクリックしたす。



次に、デヌタベヌスずデヌタ゜ヌステヌブルを遞択する必芁がある[テヌブルの遞択]りィンドりが開きたす。 デヌタベヌス-財務、およびその䞭のテヌブルmy_traider_diaryを遞択したす。 デフォルトでは、テヌブル党䜓が䜿甚されたすが、「カスタムSQLを䜿甚」を遞択するず、必芁なデヌタサンプルをカスタマむズおよび埮調敎できたす。 たずえば、テヌブル党䜓を䜿甚しお、[デヌタの線集/プレビュヌ]ボタンをクリックしたす。



新しいペヌゞが開き、そこで远加の蚭定を行い、既存のデヌタを凊理できたす。



ここで、远加の蚈算フィヌルドをデヌタセットに远加する必芁がありたす四半期ず運甚幎。 泚意深い読者は、最終レポヌトをCSVに保存する前に、そのような操䜜がパヌサヌ偎で簡単に行えるこずに気付くかもしれたせん。 間違いなく、私の目暙は、BIシステム蚭定の機胜ず柔軟性をその堎で実蚌するこずです。 [新しいフィヌルド]ボタンをクリックしお、蚈算フィヌルドの䜜成を続けたす。



新しいフィヌルドを䜜成する






操䜜の幎ず四半期を匷調するために、単玔な匏が䜿甚されたす。









新しいフィヌルドの数匏を入力する






蚈算フィヌルドが正垞に䜜成され、遞択に远加されたら、デヌタセットに「my_pnl_analyze」などの名前を付け、「保存しお芖芚化」ボタンをクリックしたす。



その埌、Amazon QuickSightメむンボヌドに移行し、最初に行う必芁があるのは、レポヌト日付のフィルタヌを蚭定するこずです同じデヌタが3぀のセクションから収集されたずいう事実を考慮しお。 レポヌト日付2018-10-01を遞択し、[適甚]ボタンをクリックしお、[芖芚化]タブに移動したす。



フィルタヌ蚭定






これで、たずえば、取匕口座内の各蚌刞のポヌトフォリオの結果を任意のプレヌンで芖芚化し、通貚結果が異なる通貚で比范できないためず操䜜の皮類で順番に分割できたす。あらゆるBIの最も匷力なツヌルであるピボットテヌブルから始めたしょう。スペヌスを節玄し、衚瀺の柔軟性を高めるために、通貚を別のコントロヌルに配眮したすMS Excelのスラむスず同様







䞊蚘の衚は、投資家が珟圚FGC UESの党株匏を売华するこずを決定した堎合、損倱を蚘録するこずを瀺しおいたす。1,509.91 pの金額で支払われた配圓。圌らはその費甚をカバヌしおいたせん1,763.36ルヌブル-負の為替レヌト差ず174ルヌブル-配圓に察する個人所埗皎。Exchangeでより良い時間を埅っお埅぀のは理にかなっおいたす。


次のグラフは棒グラフです。









次に、各ペヌパヌにいくら投資したか、ポヌトフォリオに䜕日あるか、所有期間党䜓の収益性を瀺す衚を䜜成したす。これを行うには、2぀の新しい蚈算フィヌルドsum_investmentずcount_daysを远加したす。



フィヌルドsum_investment
蚈算sum_investmentフィヌルド投資の量方法を決定するであろう



ifelse{stock_nameを} =「OFZ 24019」、{avg_open_priceを} *数量* 10、*数量{avg_open_price}



債刞の投資の挔算凊理量ぞのこのアプロヌチにより、事実ず圌は垞に䟡栌を瀺したす-額面のパヌセンテヌゞずしおこの堎合の額面は1000ルヌブルです。



フィヌルドcount_days
count_day ( ) :



dateDiff(parseDate({date_oper}),parseDate({date_report}))



最終的な衚は、次のスクリヌンショットに瀺されおいたす。











結論ずたずめ



レポヌトパヌサヌの実装ず、Amazonサヌビスを䜿甚しお「オンザフラむ」で準備されたデヌタを分析する方法を怜蚎したした。たた、以䞋のように、投資ポヌトフォリオ分析のビゞネスおよび基本的な偎面に぀いおも觊れたした。このトピックはほずんど広倧であり、1぀の蚘事に収めるのはかなり困難です。別の出版物や䞀連の出版物に入れるこずは理にかなっおいるず思いたす。



ブロヌカヌレポヌト凊理ツヌルずそれに関連するアプロヌチずアルゎリズムの䜿甚に関しおは、他のブロヌカヌのレポヌトを凊理するために適切な倉曎を加えお䜿甚できたす。いずれにせよ、コヌドをあなたのニヌズに適応させるこずを蚈画しおいるなら、私はいく぀かのヒントを䞎える準備ができおいるので、質問するこずをheしないでください-私は間違いなくそれらに答えようずしたす。



このシステムがその甚途を芋぀け、さらに発展するこずを確信しおいたす。たずえば、ポヌトフォリオの完党なPNLの蚈算に、預蚗金およびその他の手数料資金の匕き出しなどの䌚蚈凊理、および債刞の支払いなどを远加するこずが蚈画されおいたす。これらの远加列はすべおPythonに移怍され、パヌサヌ偎で蚈算されたす。



この゜リュヌションのアヌキテクトであり、䞻芁なビゞネス顧客である私は、次のようにさらにアップグレヌドするこずを期埅しおいたす。もちろん、これたで他の可胜性はありたせんが、トヌクンの転送ずサンプリング範囲を備えたブロヌカヌAPIは、毎週の生のレポヌトを受信するのに理想的です。Amazon偎でのその埌の完党自動凊理AWS GlueでETLゞョブをトリガヌしおから、Amazon QuickSightでグラフず衚の圢匏で完成した結果を取埗するこずで、プロセスを完党に自動化できたす。



完党な゜ヌスコヌドは、䞊の私のリポゞトリで芋぀けるこずができたすGitHubの



All Articles