米国の株式ニュース中に「配当」の文字があったら装飾して表示する

書籍「退屈なことはPythonにやらせよう」を教本にした「投資家のためのプログラミング勉強会(投プロ会)」の第7回目です。

これまでの勉強会では、プログラミングのベースとなる「変数」「条件分岐」「ループ」を学んできましたが、このあたりで復習を兼ねて、第1回からの演習を自力でやってみることをお勧めします。

プログラミングはコードをただ書き写しているだけではできた気になるだけで、いざやりたいことを書こうとしてもなかなか手が動かない、といったことが多いです。

二度、三度と自分の手でコードを書くことで基礎を固めていく方法がお勧めです。英語でもなんでも同じだと思いますが、基礎を固めることで、新しいことを勉強する際にいちいち後ろに戻って確認するストレスが無くなり、学習効率が上がるというわけです。

ということで、本日は文字列に対する操作を学びながら、前回作ったアメカブくんを改良してきましょう。

アメカブくんは指定したティッカーの企業名で米国のニュースサイトを検索し、日本語に翻訳してくれるアプリでした。こんな感じです。

今回はさらに、ニュースの題名にキーワード(例えば「配当」)という単語が含まれていたら、【】で囲んで目立つように表示形式を変えてみましょう。

例:

元の文:アトラシラン(TEAM)は本日の決算発表で配当を$10とする増配をアナウンスしました。

変更後:アトラシラン(TEAM)は本日の決算発表で【配当】を$10とする増配をアナウンスしました。

#ニュースは私の妄想です(^^)

元の文をこのように変更するためには、文字列操作について以下の事項を学ぶ必要があります。

  • 文字列中でキーワード「配当」を検索して、この単語が含まれているか否かを調べる
  • 含まれている場合は位置情報(インデックス)を取得する
  • 文字列中の指定した位置に文字【と】を挿入する

それでは文字列中でキーワードを検索する方法から学んで行きましょう。

と、その前に、Pythonにおける文字列の約束事を一つだけ確認しておきましょう。

変数に文字列をセットする際はこれまでこのようにしてきました。

ここで重要なのは 、Pythonにおける文字列は “(ダブルコーテーション)で囲むということです。試しに ” で囲まないで変数を宣言した下記のプログラムを実行してみてください。

エラーになりましたか?

Pythonは文字列を ” で囲んではじめてそれが文字列であることを認識します。逆に ” で囲まないと文字列以外の数値型や他の特殊な型として認識しようとしておかしな動きになりますので「Pythonにおける文字列は ” で囲む」を常に意識してください。

ちなみに ” ではなく ‘ のシングルコーテーションで囲んでも同じ意味となります。最新のPythonの文法ではシングルコーテーションで囲むとなっていますが、他の言語ではダブルコーテーションの ” で囲む場合も多いということと、筆者の趣味もあり、本勉強会では ” で囲む記法を採用しています。

どちらを使ってもOK なのですが、他の人がコードを読んだ時に混乱しますので、混在させるのではなく、どちらかに統一するようにしてください。

それでは本題の文字列中でキーワードを検索する方法を学んでいきます。

Pythonで文字列を検索するにはfind()関数を使います。find()関数は指定した文字が存在する場合はその位置情報を返します。それではさっそく試してみましょう。

newsという変数にニュース文を、key_wordという変数に検索したい単語 “配当” をセットして、newsの中にkey_wordが含まれるかどうかをfind()関数で調べて、位置情報をindexという変数にセットしています。

上記の実行結果は 21 と表示されました。

それではkey_wordを “配当” から “TEAM” に変更して再度実行してみましょう。

今度は 7 と表示されました。

このindex変数にセットされた位置情報は何を表しているのでしょうか?

ピンとこない場合は、さらにkey_wordを “アトラシアン” にして実行してみましょう。(すでに分かっている方は出力結果を予想してみてください)

今度は 0 と表示されました。

そうです、このfind()関数は指定したキーワードが何文字目に現れるかという位置情報を返してくれる関数なのです。

最初に指定した “配当” は22文字目に現れますし、”TEAM” は8文字目、”アトラシアン” は1文字目に現れます。

前回学習したリストと同じく、Pythonに限らずプログラミング言語の多くでは、順番を表現する際は0から開始しますので、それぞれ 21 / 7 / 0 と表示されたわけです。

それではもう一つ、存在しないキーワードをfind()関数にセットした場合 indexに何が返ってくるでしょうか。(実際に手を動かしてやってみてくださいね〜)

はい、存在しないという意味で位置情報としてはありえない -1 という数字が返ってきました。

ではfind()関数のこれらの性質を利用して簡単なプログラムを作ってみましょう。

news変数の文字列の中に、キーボードから入力した文字が入っているかどうかを判断して、

文字が入っていた場合:「あり!」

文字が入っていなかった場合:「なし!」

それぞれ上記の表示をするプログラミングを書いてみましょう。もちろん前回学習した条件分岐のifとwhileループも使いますよ。(想定時間:5min)

書き方はいろいろありますが私は上記のように作りました。まず最初に入力された文字が “END” であればプログラムを終了する処理を入れています(これがないと無限ループになってしまいます)。

そして、入力された文字をfind()関数に渡して、その結果が -1 かどうかでnews変数の文字列中にあるかないかを判断しています。( != は == の反対で、Falseの場合にTrueとして条件分岐する比較演算子です。詳しくは教本の2.2を参照してください)

いかがでしたか?このアプリを実行して、いろいろな単語や文字を入力しながら正しく動くかどうかを確認してみてください。

ちなみに、文字列の中に単語があるかないか「だけ」を調べたいときはin という演算子も使えます。(もちろんfind()関数をつかってもよいのですが、より直感的なコードにするために in を使うことをお勧めします)

newsという変数にニュース文を、key_wordという変数に検索したい単語「配当」をセットして、newsの中にkey_wordが含まれるかどうかをinという演算子で調べて、その結果をprint()関数で表示しています。in は含まれていればTrue、そうでなければFalseを返します。

さきほどの課題を in を使って書くとこのようになります。

inはいろいろなところで出てくる演算子です。第5回のリストに要素が含まれるか、forループでリストから順番に要素を取得する場面などです。

上記は東証の株価コードをリスト変数に入れて、指定したコードがそのリストに含まれているかを確認しています。考え方は文字列内の単語検索と同じですので便利なinを是非習得してください。

それでは、キーワードが現れる位置情報が取れるようになったところで、指定した箇所に【と】のカッコを挿入して、配当という文字が目立つように改造していきましょう。

Pythonにおける文字列の扱いで便利な点がスライスという考え方です。Pythonでは文字列をあたかもリストのごとく扱うことができます。



と表示されたかと思います。このように文字列変数に[]をつけてインデックスを入れるとその位置の文字を取り出すことができるのです。もちろんリストと同様に -1 をいれると後ろから一つ目の文字を取得できます。

さらに便利なのがスライスもリストと同じように扱えます。

news[0:6]とすると0番目から6番目の文字列を抽出できます。news[13:]と終わりのインデックスを省略すると、その文字列の最後までを切り取ります。どうようにnews[:12]は最初のインデックスを省略しているのでnews[0:12]と同じ意味となります。(スライスとは切り取るということですね)

では上記の表示結果を確認してみてください。

アトラシアン
本日の決算発表で配当を$10とする増配決議をしました。
アトラシアン(TEAM)

str1〜str3の変数にそれぞれ上記の文字列がセットされたことがわかると思います。(スライスについては教本の6.1.2も参照ください)

ここまでくれば、”配当” の前後に【】をつけた文字列を作るのは簡単です。

考え方としては以下の順番でプログラミングするとよいでしょう。

  1. “配当” の文字が現れるインデックスを取得する
  2. 取得したインデックスの前後の文字列をスライスで変数にそれぞれセットする
  3. 【】をそれぞれの変数に加えて作りたい文字列を生成して表示する

ちなみに文字列同士をくっつけるのは +演算子を使います。使い方は第1回で学んでいますので確認してください。

ではアメカブ君の改造の前に、さきほど作ったfind()関数を使ったプログラムを改造して、指定した文字列の前後に【】をつけて表示するプログラムを作ってみましょう。

ちょっと頭をひねる必要がありますが、ポイントは文字列をどのようにスライスして、最後にどのようにくっつけるか、です。それでは Let’s try! (目安時間:10min)

いかがでしたか?うまくスライスできましたか?文字列を切り取る際のlen()関数の使い方も要チェックですのでしっかり理解していきましょう。

この技がマスターできれば様々な文字列操作が行えますので、例えば企業名から特定の文字を削除したり、URLの文字列を自在に作成したりなど、後々必要になってくる文字列操作の基礎ができたとも言えますよ。

それでは本日最後の課題です。先日作ったアメカブ君を改造して、配当という文字の前後に【】をつけて表示するアプリにバージョンアップしてみましょう。前回作成したアメカブ君はこのようなものでした。

翻訳結果の文字列がセットされている trans変数をそのままprint()関数で表示するのではなく、find()関数をつかって配当という文字が見つかったら【】をつけて表示するように改造してみましょう。(所要時間:5min)

いかがでしたか?上のプログラムでは配当という文字が入っていたら【】をつけて表示、なければそのまま表示という条件分岐を追加しています。実際に試してみてアメカブ君の使い心地がよくなったか実感してみてください。

今回もループと条件分岐がたくさん出てきましたが、前回同様、プログラミングはループと分岐でできているといっても過言ではありません、ぜひ慣れていきましょう。

本日はここまでです。お疲れ様でした!

 


退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング
退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

こちらの本を教本にした「投資家のためのプログラミング勉強会(投プロ会)」を主宰しています。
そもそもプログラミングとはなんぞや、Pythonを実行させる環境をどのように用意するか、などプログラミングにおける超基本的な内容が、我々のような非ソフトウェアエンジニア向けに分かりやすく記載されています。はじめの一歩にはこれ以上ない教材です(^^)

ビジネスエアポート各店舗の営業時間と会議室

ビジネスエアポートの営業時間と会議室料金をまとめ(自分用)

日祝もやってほしい&会議室はあと二割ぐらい値段が下がると使い勝手がいいんですけどね。

 

店名 営業時間 休館日 会議室(¥/時)
青山 平日 8:00~21:00

日曜祝日 10:00〜18:00

土曜、年末年始 8名 ¥3,500
16名 ¥7,000
6名 ¥3,500
4名 ¥3,150
品川 平日 8:00~20:00 土日、祝日、年末年始 8名 ¥7,000
4名 ¥2,800
東京(パレス横) 平日 8:00~21:00
日曜祝日 10:00〜18:00
土曜、年末年始 6名 ¥ ¥3,500
※ 机が狭い
丸の内 平日 8:00~20:00 土日、祝日、年末年始 8名 ¥5,600
8名 ¥4,200
六本木 平日 8:00~20:00
土曜 10:00〜18:00
日曜祝日 10名 ¥9,100
6名 ¥4,900
8名 ¥7,000
神田 平日 8:00~20:00
土曜 10:00〜18:00
日曜祝日  8名 ¥5,600
6名 ¥4,900
新橋 平日 8:00〜21:00
土曜 10:00~18:00
日曜祝日 8名 ¥7,700
6名 ¥6,300
6名 ¥4,900
8名 ¥5,600
渋谷 平日 8:00~20:00
土曜 10:00〜18:00
日曜祝日、年末年始 8名 ¥4,900
8名 ¥4,900
6名 ¥4,200

 

 

投資効率がすこぶる良かった英語学習

ソフトウェア開発やら海外マーケティングを進める上での最大のネックは、英語です。

コニャックなどのカジュアルに利用できる翻訳サービスもかなり増えてはきていますが、翻訳までのタイムラグや翻訳結果の検証コスト(ほんとに合ってるのかなーこの翻訳?をどう確認するか?!)などを考えると、どうしてもボトルネックとしての英語が浮かび上がってきてしまいます。

革新的な翻訳システムも待たれるところですが、自分の思考回路と同等スピードのアウトプット力と翻訳結果の検証コストが0にならない限り、今後もビジネスの現場で使えるものとしては広がらないでしょう。(AIだって所詮は99%が限界で最後の担保は人間の脳が行う必要がある)

ではどうするか、「これはもう自分の脳みそに英語回路を作るしかない」わけで、人生何度目かの英語学習ウェーブがやってきた私は「勉強する英語」は卒業し「活用する英語」のステージに登るべく学習を再開したのでした。

結果的には最高の自己投資といっても過言ではない果実を得ることができました。TOEICは500点台から850点まで上がり英検準一級などの資格面はもとより、ソフトウェア分野や投資分野での情報を直接得ることで、情報鮮度が桁違いにあがり、海外旅行もかなーり楽しくなったのでした。

みっちりした学習期間は2年弱ぐらいかけましたが、十分に投資回収できたと思っています。

特に最初の半年間は単語に集中しました。

単語の暗記というと「単語は基礎的なものさえ覚えれば、あとは前後の文脈で推測すればよい」ということが言われたりしますが、これは通訳級の超上級者の言葉であって、我々初学者には残念ながらあてはまりません。

なぜなら、学習の効率化を図る上では単語の意味を推測している時間が無駄になるからです。また、例えば文法を学習する目的なのにいちいち例文に出てきた単語に脳がひっかかっていては、本来鍛えるべき分野に集中できるはずがありません。

ですので単語の暗記は野球を始めるのにバットとグローブを揃えるのと同じで、最低限の基礎をつくる作業だと思って、コツコツではなく一気に単語のベースを作るべきなのです。俗に言うボキャブラリービルディングです。

私はこのボキャビルを毎日30分ひたすらiKnow!で単語を脳にインストールすることに集中しました。単語学習を30分毎日続けるのは正直苦痛以外なにものでもありませんが、iKnow!というアプリはこの苦痛をかなり低減してくれました。

iKnow! ぜひおすすめします。

whileループを使って対話式アプリを作る

書籍「退屈なことはPythonにやらせよう」を教本にした「投資家のためのプログラミング勉強会(投プロ)」第6回目です。

本日は、whileループ(2章7.4) を使って、対話式に処理をしてくれるアプリを作ってみます。

前回開発したアプリ「アメカブくん」は、ティッカーコードを入力すると米国のニュースサイトを検索&翻訳して表示してくれるお便利アプリでしたが、続けてティッカーコードを入力しようとすると、いちいちアプリを起動する必要がありました。

今回はwhileループを使って、ティッカーコードを対話式に入力できるように改善していきます。

whileループは、第四回で学習したforループの親戚みたいなもので、使用頻度はforループが多いのですが、便利な機能なのでぜひ覚えておきましょう。

forループとの使い分けは、whileループは「終わりなく処理させ続けたいケースで利用する」と覚えてください。

例えば今回のように、ティッカーコードを繰り返し入力したいといったケースが該当します。またユーザーに選択メニューを表示して、そのメニューにそったプログラムを実行する(対話型アプリ)を実装する際などに利用する機能です。

ではまず最初にシンプルなwhileループから

以上のコードを実行してみましょう。

だーーーーっと同じ文が表示され続けているかと思います。

このまま放っておいても止まりことはありませんので、Ctrl + Cやcmd + Cなどで強制終了してください。(実行環境アプリそのものを終了してもよいです)

このようにwhile True: と記載すると次に書かれた処理(今回の場合はprint()関数 )を永久に繰り返すのがwhile文の機能です。while の後ろには条件を記載して、それがTrueの間中、繰り返し処理(ループ)を続けます。今回はTrueと直接記載していますので人が外側から強制的に止める必要がありました。

プログラムの世界では、プログラム自身にループを止める構造がないことを無限ループと呼びます。無限ループに一旦陥るとアプリとしては暴走状態に入ってしまい、今回のように止めるのにも一苦労といったことになります。
意図しない無限ループは、コンピュータに不要な負荷を与えることになり、通常は重篤なバグとしてみなされます。
例えばファイルを生成する処理で、無限にファイルを作成し続けてディスクが一杯になってしまったり、ウェブサイトへのアクセスが集中してサーバーをダウンさせてしまうなどです。(今回の例は print()関数のみの無限ループなので実害はありません)
このように、whileに限らずforなどのループ処理を実装する際は、無限ループに陥らないかどうか、慎重にロジックを検討する必要があります。

それでは、ループを抜ける命令 breakを使って、3回ループしたら終了するロジックに変更してみましょう。
使用するのは演算子のプラス+ (教本の1.4)と条件分岐の if (同2.7.1) です。

では先ほどのコードを改造してみましょう。(目安時間:5min)

いかがですか。

やり方はいろいろありますが私は上記のように書きました。

ループした回数を入れてる変数 countを用意し、初期値として0をセットしておきます。

whileループに入ったら、条件分岐の if でcountが3かどうかを調べます。count が3に達していたらbreakでループを抜けます。

3に達していなかったら、print()関数を呼び出し countに1を足したものを新たにcount変数にセットし、次のループ処理に入ります。

最後の表現 count = count + 1 は初めて出てきましたが、このように元の値に何かをした(今回の例では1を足した)結果を、同じ変数にセットし直すことができます。これによりcountという変数を使いまわすことができるのです。

変数は値を入れる箱でしたね。変数についは教本の1.4を参照してください。

whileを使ってよく実装するのが対話式アプリを作るときです。

通常のアプリは一度実行すると自動的に終了してしまいますが、前回作成したアメカブのように、いちいちプログラムを終了せずに、繰り返しティッカーコードを入力したい場合に対話式アプリを実装します。

例えばこのようなプログラムを実行させてみましょう。

前回学んだ辞書型変数 us_stocks で米国株のティッカーと会社名を定義しています。

さらにwhileループを使って、入力したティッカーに対する会社名を表示するアプリとなっています。
このように、ユーザーと対話式で繰り返し処理を行わせたい場合にwhileループがよく使われます。

ついでにプログラムを終了する処理も追加してみましょう。

ティッカーコードに”end”を入れるとbreakしてアプリが終了する処理を追加してみてください。

では、ここまでの知識を使って、前回開発したアメカブくんをバージョンアップしましょう。

ティッカーコードを繰り返し入力できるような対話式の作りに変更してみてください。

またティッカーコードに”end”が入力されたら終了する機能もつけてみましょう。(目安時間:10分)

いかがでしたか?

どんなに複雑なプログラムも結局は「ユーザの何らかの入力に従って処理を行い、それを条件分岐しながら繰り返す」ということを行なっています。ですので今回の構造を理解できれば、プログラミングのベースはマスターといっても過言ではありません。

アメカブくんを自分なりにいろいろ改造するなりして、繰り返しと条件分岐をじっくり理解してきましょう。

 


退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング 退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

こちらの本を教本にした「投資家のためのプログラミング勉強会(投プロ)」を主宰しています。
そもそもプログラミングとはなんぞや、Pythonを実行させる環境をどのように用意するか、などプログラミングにおける超基本的な内容が、我々のような非ソフトウェアエンジニア向けに分かりやすく記載されています。はじめの一歩にはこれ以上ない教材です(^^)

目次: 投資家のためのプログラミング勉強会 #投プロ会

米国の注目株 MSFT / AMZN / TEAM / MO / PM

私が現在保有している米国株は、MSFT / AMZN / TEAM / MO / PM あたりです。

中でも注目株はオーストラリアのベンチャー企業アトラシアン(TEAM)です。この会社はソフトウェア開発者向けに様々なサービスを提供しており「自身がソフトウェア企業でその顧客もソフトウェア企業」という餅は餅屋的ビジネスが大好きな私としては、昨今の業績向上と相まって買い増しへの欲求がフツフツきています。

自身が欲しいものを作り、その結果として収益をあげるというのはひとつの幸せな形ですね。

かつてMicrosoftも”Eating our own Dogfood”といって自社ソフトを自部門でも使って改善していくようなことを言っています。

In 1988, Microsoft manager Paul Maritz sent Brian Valentine, test manager for Microsoft LAN Manager, an email titled “Eating our own Dogfood”, challenging him to increase internal usage of the company’s product. From there, the usage of the term spread through the company. (Wikipedia)

ちなみにこれはdogfoodingという言葉で特にソフトウェア業界では有名な言葉になっています。

自社で開発しているソフトを自社の業務でも使うことは一見当たり前のようなことですが、顧客に販売している商品を自社で使っていない企業って意外と多くあります。

アトラシアンのティッカー名:TEAMも企業姿勢を表していていい感じです。

ちなみにAMZNはもちろんDogfoodingを実践しており、AWSが自社のECサイトの運用技術を転用することから始まったビジネスなのは有名な話です。

AMZNは、数年前からEC企業というよりもAWSを核とした世界のインフラ企業という位置付けで投資を開始しました。

実際にAWSのサービスに触れてEC2やS3の技術に感動してしまったのがそもそもの始まりです。そのころから米国の国防省などの公的機関でもAWSが採用され始め、金融業界などの高度セキュリティが求められる顧客への浸透も進み、電気やガスなどと同等の新しい分野のインフラ企業としての地位を築いていきました。

一時期は私の全ポートフォリオの半分ほどをAMZNが占めてしまいましたが、2018年中頃の大きな下げの際に日和ってしまい一部を売却し、2018年末の暴落時には、配当銘柄へのシフトと合わせてほとんど売却しました。。。びびったトレーディングの割にはまぁまぁラッキーな売却タイミングだったのかもしれません。

ここ最近ではほとんどのアナリストからAWSの利益や成長性が言及されつつあるので、成長エンジンであるAWSへの期待値は相当程度織り込まれてきているともいえそうです。

MSFTはAWSの対抗馬としてAzure(あじゅーる、と読みます)の台頭が大きいです。AmazonやGoogleと比較してかなり出遅れたクラウド事業もOffice365を武器にいまではトップランナーの位置にきています。株価もここ2年ほど盛り上がっており、このタイミングでインするのは怖い気もしましたが、Azureの今後の伸び率についてははAWSよりも高いと期待してAMZNからスイッチしています。配当の伸び次第で長期保有を検討しますがIT業界は全般的にクラウドの次のビジネスが見えないこともあり不透明感がありますね。

ちなみにMSFTの日本法人は、AWSと違って外資のにほいが薄く、和風な対応が受けているようです。日本のほとんどの大企業におけるIT部門は時に官僚以上におそろしく保守的なので、経営から「クラウドを使え」と迫られてもリスクを重視しすぎてなかなかAWSを採用できたりしません。(AMZNは日本でもド外資の特徴よろしく和風でウェットな対応はしません。ですので主な顧客は日本のスタートアップや大企業の中でも超大企業のキャッシュを沢山払ってくれるところがほとんどではないでしょうか。これはこれで一概に悪いことではありませんが。)

MSFTは日本法人の社名を「日本マイクロソフト」にしているだけあってか、いろいろと柔軟に旧来型の日本企業へも導入が進んでいるようです。このあたりの対応も日本でAzureの存在感が増しているところにつながっていると考えます。日本以外の地域は正直わかりませんが、営業力という意味では昔からすごい企業だと思います。そこが技術者には嫌われる所以ですがw

とはいえここ最近ではGithubの買収とプライベートリポジトリの無料解放、プログラミングエディタVSCodeの高い評判など、開発者目線での投資も目立つことから、もう一段の成長も期待できますね。

残りの銘柄MOとPMはタバコメーカーです、そうです、配当狙いです (^^;)

私自身はずいぶん前にタバコをやめてから、エレベータ内のタバコの残り臭だけでも「オエー」となってしまう超嫌煙家です(^^;)。タバコ株を買うまではいつも「JTなんて早く潰れろよ..」と呪いをかけていた人間なのですが、ホルダーになってからは明らかに意識が変わりました。

タバコメーカーが仮に潰れたとしても、あの強烈な依存性を知る身としては、地球上からタバコがなくなることは無いと断言できます。

禁酒法時代と同じく闇タバコは生き残り、今より悪い方向に進んでしまうでしょう。そうならないためにも、株式を通じてタバコ会社に資本参加し、株主として、経営監視や分煙政策の推進などを求めつつ、日頃被っている多少の迷惑料として末長く配当を得る、という大人の考えに至ったのでありました。

指定したティッカーの米国株関連ニュースを翻訳して表示する

書籍「退屈なことはPythonにやらせよう」を教本にした「投資家のためのプログラミング勉強会(投プロ)」第5回目です。第1回〜第4回までは以下の項目を学びながら、指定した銘柄コードの関連サイトを一気に開いてくれる「一発くん」アプリを開発しました。

第1回:変数とは
第2回:文字列の結合、print()関数、input()関数
第3回:条件分岐
第4回:リスト、forループ

本日は、教本の第1部5章に沿って下記の内容を学んでいきましょう。

  • 辞書型変数(キーと値をセットで管理できる変数型)
  • 関数とは(組み込み関数と独自関数)

今回から「一発くん」とは別の新しいアプリを作っていきます。機能としては、自分がウォッチしたい米国株の様々な情報を自動的に収集をしてくれるアプリです。アプリ名は「アメカブくん」です(^^)

アメカブくん第一弾は、指定したティッカーに関する米国サイトのニュースを収集すると同時に翻訳してくれるアプリを作っていきます。イメージはこんな感じです。(最後のニュースが非常に気になる...)

辞書型はその名の通り、キーと対になる値を定義できる型です。

例えば「銘柄コード」と「会社名」のように値をセットで管理したいケースにはこの辞書型を使うのが常道です。

実際の記載はこのように書きます。

{キー:値, キー:値 …. } というようにキーと値をコロンで対にして全体を波括弧{}で囲みます。

これで、変数stockに銘柄コードと会社名をセットにした変数のできあがりです。まさに辞書ですね。

さっそく試してみましょう。キーに対する値を得るにはget()関数を使います。

いかがでしたか?キーに対する値が表示されましたか?

ちなみにキーの部分に変数stockの中に存在しないキーをいれてget()を呼び出したらどうなるでしょうか?

さらに、stock変数の宣言時に、キーを重複して定義したらどのようになりましたか?

このように、色々と試して動きを見ながら辞書型の特徴を掴んでいきましょう。

プログラミングは書いてあることをなぞるだけではなく、手を動かして色々試してみることが理解への早道です!
プログラミングはエラーになってもパソコンが壊れるわけではないので、安心してどんどん間違えましょう。
トライアンドエラーが多いほど、つまり間違える数が多いほど学習が進んでいる証拠です。
そしてプログラミングの間違いは、一度直せば二度と同じことを繰り返しません。
当たり前ですがプログラミングは書いた通りにしか動きませんので、人間のように指示した内容と異なる動きはしません。
これは修正後の確認コストがゼロであることを意味しており、ものすごいメリットです。

もうひとつ、辞書型で使える関数keys()をみていきましょう。

keys()関数は辞書型変数のキーの全てをリスト型で返してくれる関数です。

上記は変数keys に辞書型stockに存在する全てのキーをセットしています。

変数keysはリスト型なので、全てのキーを表示するには以下のように書くのでしたね。

これがわからない場合は前回の復習をしてくださいね。教本では4.1のリストの項目を見てください。

ちなみに前回学習したリストは角カッコ[]で囲むのでした。

辞書型もリストと同様に複数の値をセットできますが、使い方はまったく異なりますね。

これらの違いは自分で説明できるようにしておきましょう。

また、リストは文字列だけではなく「辞書型変数」を値としてセットできますよ。

例えば、東証一部の銘柄で、金融セクター、製造セクター、サービスセクターの銘柄を定義するとこんな感じです。

辞書を値にもつリスト変数 tosho を定義しました。

ではこの中身を表示してみましょう。リストの値は添字でアクセスできるのでしたね。

辞書型変数 service の中身を表示します。さらに service のキー”2181″を指定するとそれと対になっている企業名を表示します。

辞書型を値としてもつリストは慣れるまで頭がこんがらがるかもしれません。今回完全に理解できなくても徐々に慣れていきましょう。

さて、ここまで学習できたところで冒頭の「アメカブ」くんを開発していきましょう。

キーボードからティッカーコードを入力すると、銘柄名で米国のGoogle Newsを検索し、関連ニュースを取得します。さらに英語を日本語に翻訳して表示するアプリです。うーん、なかなか便利そうですね。

ニュースの検索や翻訳は中級編の範囲なのでここでは詳しく説明しませんが、プログラミングでこんなこともできるんだー、と知ってもらえればOKです。

以下は私の監視銘柄の一部です。
PEP / JNJ / PG / GIS / KO / MO / PM / BUD / CL / UL / XOM / GILD / T / HRL / IBM / XOM / V / OKTA / TEAM

これらを辞書型としてリスト変数us_stocksに入れていきましょう。キーはティッカー、値は会社名です。

では最初に、復習を兼ねて、前回作製した「一発くん」と同様に、キーボードからティッカーを入力をして、それが上記のリストにあるかどうかをチェックするロジックを作ってみましょう。入力したティッカーがリストにあれば「有効なティッカーです」なければ「有効なティッカーを入れてください」と表示するアプリにしてみましょう。

前回はforループでリスト内の銘柄コードと比較するチェックするロジックでした。

今回はリストの中に辞書型が入っていますので、キーボードからの入力値と辞書型のキーの値を比較する必要があります。

キーの値を全て取り出すにはkeys()という関数を使うのでした。では書いてみましょう(目安時間:15分)

さてどうでしたか? keys()関数はキーのリストを返しますので、forループを使って順番にそれと比較することでチェックできますね。

実は、辞書のキーの中にある値があるかをチェックするにはもっと簡単な方法があります。

以上たったの5行で同じことができてしまいます。随分すっきりしました。

” 文字列 in リスト型 変数 ” とすることで文字列がリスト型変数に含まれるかをTrue or Falseで返してくれるのです。

ここでひとつ関数について第1回のおさらいを兼ねて学習しましょう。

関数とはつまり中学生で習ったf(x) = a x + bの世界です。これだけで頭がクラクラしてしまう方もいるかもしれませんが、要するにxという値を入れた結果を返してくれるファンクションが関数です。

プログラミングの世界でも同じ関数という概念があります。

そして関数はあらかじめPythonによって用意された関数(組み込み関数)とプログラミングで独自に作成した関数があります。
前者はこれまで習ったlen()関数やget()関数です。(関数については教本の3.1も参照してみてください)

本日は以下の独自関数を作成しますが、中身については中級編で解説しますので、今日は何も考えずコピペしておけば大丈夫です。

  • get_stock_news() :銘柄名を入れると、それに関連する英語のニュースをリストで返す関数
  • translate_en_jp() :英文を入れると、それを日本語に翻訳して返す関数

なお、この関数を使うにあたっては、下記のライブラリをインポートしておく必要もありますので合わせてやっておきましょう。
> pip install requests
> pip install beautifulsoup4

これあっさり書いてしまいましたが、インポートのやり方はそれぞれの開発環境によって異なります。当勉強会では開発環境はPyCharmというフリーソフトを推奨しています。PyCharm自体のインストール方法やライブラリのインポート方法はググると沢山出てきますのでそちらを参照してください。リアル勉強会の場では環境セットアップからサポートもしたいと考えています。

ではさっそく2つの関数を使ってみましょう。

どうですか?

このget_stock_news()関数はGoogle Newsにアクセスして会社名で検索したニュースをリスト型変数に入れて返してくれる関数というわけです。

もう一つの関数translate_en_jp()はどうでしょうか?

newsはリスト型変数なのでそれをforループで取り出しながらこの関数で翻訳した結果を表示しています。下記は”TEAM”とキーボードから入れた場合の表示です。

アトラシアンは今後数週間でより高く指される
これが2月に買うべき私のトップストックです
ソフトウェア会社アトラシアンがインド事業を強化したいのはなぜですか
アトラシアン:美しいビジネスだが過大評価 – アトラシアン(ナスダック:チーム)
停止し、コラボレーションし、そして耳を傾けてください:マイクロソフトチームはアトラシアンの輝きを得ます
アトラシアン、クラウドターゲティングソフトウェア、Tech Teamsに移行
Atlassian:これらのレベルではまだ高価そう – Atlassian(NASDAQ:TEAM)
アトラシアンの株価は、収益と収益の最高見通しを受けて急上昇
Atlassian Corporation Plc – Cla – Consenusは9.4%の上昇見込みを示しています
アトラシアン:史上最高値を記録したリスキー

日本語が少々怪しいですが翻訳としてなかなかではないでしょうか?この関数はget_stock_news()関数で取得したニュースをGoogleの翻訳に渡して日本語の結果を返してくれています。

それでは2つの関数の動きを理解したところで、キーボードから入力したティッカーに関連するニュースを表示するアプリを作ってみましょう。

先ほど作製したティッカーが有効かをチェックするコードに2つの関数を追加してアメカブくんを仕上げていきましょう。

  1. ティッカーをキーボードで入力する
  2. ティッカーが有効かどうかをチェックする
  3. ティッカーと対になっている会社名を変数companyにセットする
  4. 変数companyをget_stock_news()関数に入れて、リスト変数newsに返り値をセットする
  5. リスト変数newsをforループで取り出してtranslate_en_jp()関数で翻訳した結果を表示する

プログラムの流れとしては以上となります。それでは Let’s coding time ♬ (目安時間:20分)
(最初にget_stock_news()関数とtranslate_en_jp()関数の2つをコピペしてから上記1〜5を実装してみてください)

どうでしょうか?ちゃんと動きましたか?

ここまでできるとかなりアプリっぽいことができるようになりました。

もちろん、ご自分の監視銘柄をリストに追加すれば、どんどん拡張できます。自分が決めたキーワードを含むかどうかをチェックする機構をいれても面白いかもしれませんね。

ちなみにこのTwitter botはこのようなプログラミングを駆使して作っています。

それでは本日はこのあたりで終わります!

次回は学習内容

  • whileループで対話型アプリをつくる
  • ファイル操作の基礎(HTMLファイルの作製)

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング 退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

こちらの本を教本にした「投資家のためのプログラミング勉強会(投プロ)」を主宰しています。
そもそもプログラミングとはなんぞや、Pythonを実行させる環境をどのように用意するか、などプログラミングにおける超基本的な内容が、我々のような非ソフトウェアエンジニア向けに分かりやすく記載されています。はじめの一歩にはこれ以上ない教材です(^^)

入力したコードが東証銘柄かチェックする

書籍「退屈なことはPythonにやらせよう」を教本にした「投資家のためのプログラミング勉強会(投プロ)」第4回目です。今回は、第1部4章に沿って下記の内容を学んでいきましょう。

  • リスト(大量の変数を簡単に扱う方法)
  • forループ(繰り返し処理)

「リスト」と「forループ」および前回学習した「条件分岐」が理解できれば、プログラミングにおけるベース部分をマスターしたと言っても過言ではありません。じっくり習得していきましょう。

前回作成した、複数ウェブサイトを一気にオープンするアプリ「一発くん」は、入力した銘柄コードが4文字かどうかをif文の条件分岐でチェックする機構を実装しました(プログラムコードを書いてある機能を実現することを「実装する」と言ったりします)。

今回はさらに「入力した銘柄コードが東証一部銘柄であるかないか」をチェックできるロジックに変更していきます。これによりさらに厳密に入力値のチェックが行えますので、アプリらしくなってくると思います。

ではまずは前回のおさらいから。

上記ソースでは、キーボードから入力した銘柄コードをinput()関数で変数 stock_code に入れ、さらに stock_code の文字列長をlen()関数で取得して変数 m に入れています。最後に m と 数値の4 を比較した結果(TrueかFalseでしたね)をhantei に入れ、if文の条件分岐でTrueかFalseの判定結果で処理を分岐しています。

今回は、入力された銘柄コードを、文字列長ではなく、実在する東証一部銘柄(2000以上あるはずです)に合致するかどうか、というチェック方式に変更してみましょう。

「銘柄コード」のような大量の塊(かたまり)である変数を扱う際は「リスト(配列)」に入れるのが常道手段です。

例えば、複数の銘柄コードをリストではなく別々の変数にセットしようとすると、このように銘柄コードの種類分の変数が必要となります。(私の好きな高配当株を例にとります(^^) )

このままでは銘柄が増えるたびにズラーっと変数の定義が並んでソースコードの可読性が落ちてしまいます。しかも、どの変数を使えばいいかをいちいち大量の変数の中から探す必要が出てきます。

このように「種類が同じで何パターンもある変数を定義する」ときにはリスト型の出番となります。

リストは変数の箱が鎖のようにつがったイメージです。ひとつの変数を定義すれば、それにぶら下がる複数の値を保持できます。(「変数」の考え方は第1回を参照してください)

stock_codesという一つの変数で、上記のように複数の値を定義できました。全体を中括弧で囲み、それぞれの値をカンマで区切るのがリストの文法となります。

銘柄コードの他にも、例えば銀行名や動物の種類など「種類が同じで何パターンもある変数を定義する」には、いちいち変数を定義するのではなくこのようにリスト型を使います。

リストの中の値は添字番号で呼び出します。
stock_codes[0]であれば1番目の値を呼び出すことができ、stock_code[2]は3番目の値となります。

では実際に表示してみましょう

添字で指定した銘柄コードは表示されましたか?

0や3以外にも色々な添字を使ってどのような値が返ってくるか試してみてください。

いかがでしたか?

-2の表示結果は「なるほどーっ」といった感じだったと思います。これに限らずですが、Pythonは直感的な理解のために、あたかも英文法のように分かりやすい文法が設計されています。

なお、リストの添字はゼロから始まることに注意してください。Pythonに限らずプログラミング言語の世界では、数字は1ではなく0から始まるのが普通です。

さてここで一つ質問です。このリストに入っている要素の数を知るにはどうしたらいいでしょうか?

前回学習したlen()関数を覚えていますか?

これは変数 company の文字列長を取得している例です。

同様に、len()関数にリスト変数を入れると、今度はそのリストの長さ(要素の数)を返してくれるのです。

無事に6が表示されましたか? さらに理解を深めるために、上記の配列の要素の数を増減させ、len()関数がどのような値を返すか試してみてください。(例えば空のリストを入れたらどうなりますか?)

ここまでがリストに関する解説です。詳細は第1部4章を読んでみてくださいね。

 

それではいよいよ実際に東証一部の銘柄をリストで定義してみましょう。

銘柄コードのリストは中級編で学ぶ「スクレイピング」という技術で東証のウェブサイトからサクッと取得でますが、今回は取得済みの下記データをご自分のソースコードにコピペしてください。

それでは、さっそく先ほどのlen()関数で要素数を数えてみましょう。

2117と表示されましたか?

そうです、東証一部には2117種類の銘柄があるということが分かりました。(上記の配列の定義は表記上 「….」 で省略していますが、実際には省略せずに最後の要素までコピペしてください)

ここで話は少々逸れますが、同様なことを手動でしようとすると「東証のウェブサイトを検索して訪問し、銘柄コードの一覧画面を目でカウントするか、エクセルにコピペする」なんてことが必要となります。

これがプログラミングなら、たった三行で同等の結果を得られるわけで、プログラミングの凄さここにありなのです。さらにこのすぐ後で学ぶループを使えば2117種類の銘柄との付け合わせ作業も一瞬で終わらすことができます。

しかも、一度コードを書きさえすれば、半年後や一年後でもこのコードを実行するだけで、最新の銘柄情報をいつでも同じ品質で取得できてしまうのです。

プログラミングの素晴らしさの一端がお分かりになるかと思います。

さて、「キーボードから入力した文字列と、あらかじめ取得していた2117種の東証一部銘柄コードとを一つずつ比較する」のが今回のゴールでした。

上記を実現するために、これまでの知識だけでコードを書くとすると、このようになります。

配列にセットされている2117種類の証券コードを、このように一つずつ呼び出して比較するコードを書こうとすると目眩がしてきますね...でも安心してください、もちろんプログラミングの世界ではこんな書き方はしません。

このような大量の繰り返し処理を行う際の強力な機能が「forループ」です。

forループは様々な繰り返し処理で活用できる機能ですが、今回のようにリストを扱う際には必ずと言っていいほど使われますので、セットで覚えておきましょう。

forループの動きを理解するために、リストにセットされている全ての銘柄コードをprint()で表示するプログラムを書いてみましょう。

forループを使うことによって、リスト変数 stock_codes に定義されている各要素を、変数 c に順番にセットし後続の処理( print(c) )を行い、それをリストの要素数分(2117回)繰り返すことができます。書き手はリストの中身がいくつあるかなどを意識する必要はなく、勝手にforループが処理を回してくれます。便利ですね。

ちなみに英単語のforには「時間や距離の範囲」という意味があります。

working here for two years

cooking for a few minutes

forループのforはまさにこの感覚だと思います。stock_codesの中身(in)の範囲で繰り返し処理を行いなさい、という命令を意味しているわけです。

リスト変数とforループを学んだところで、「一発くん」のバージョンアップに取り掛かりしょう。
前回までは「入力された証券コードが4桁以外ならNG」とするチェック機構でしたが、これを「実在する東証一部の銘柄コードならウェブサイトを開く」というようなロジックに改善します。

みなさんが書いたコードはどのようになりましたか?

上記は答えの一例ですが、入力された銘柄コードとリスト内の要素と比較して、それらが一致したら該当のウェブサイトを開くアプリに改良されました。

ちなみにこれだと入力した銘柄が東証一部の銘柄リストに該当しない場合NGメッセージが出ませんので、さらに以下のように改良します。

breakはforループの途中で抜ける命令です。flagという変数を設けることで、一度もリストの値と合致しなかった場合にはNGメッセージを出力しています。これも条件分岐ifの使い方の一例です。

このように、プログラミングは「条件分岐」と「ループ」を何度も繰り返しながら、目的の値を探したり、分析を行っていきます。この考え方はぜひ頭にいれておいてください。

第1回から今回までの内容を習得すれば、これまで手動で行なっていた様々な処理をプログラミングで自動化できることがお分かりになると思います。そして、ご自身が普段何気なく行なっているPC上での繰り返し作業を、プログラミングに置き換えられるようなアイデアがきっと出てくるはずです。

もちろんまだまだ学ぶべきことがたくさんありますが、自分が実現したいことをイメージしながら学習を進めることで、より効率的な習得ができると思います。そんな近未来を頭に描きながら引き続き学習していきましょう!

次回は、入力した銘柄コードに関連する英語ニュースを検索し、自動的に翻訳した結果を一覧表示するアプリを作っていきます。米国株の情報収集で使えるような実用性の高いアプリを作っていきましょう!

次回学習予定

  • 辞書型(第1部第5章)
  • HTTPリクエストの基礎

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング
退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

こちらの本を教本にした「投資家のためのプログラミング勉強会(投プロ)」を主宰しています。
そもそもプログラミングとはなんぞや、Pythonを実行させる環境をどのように用意するか、などプログラミングにおける超基本的な内容が、我々のような非ソフトウェアエンジニア向けに分かりやすく記載されています。はじめの一歩にはこれ以上ない教材です(^^)

入力した証券コードの妥当性をチェックする

書籍「退屈なことはPythonにやらせよう」を教本にした「投資家のためのプログラミング勉強会(投プロ)」第3回目です。

  • 第1回 複数の株情報サイトを一度に表示してみよう
    • プログラミング初めの一歩
    • 変数とは?
  • 第2回 指定した証券コードの関連サイトを表示する
    • 文字列の結合
    • print()関数でディスプレイに変数を表示する
    • input()関数でキーボードから文字を変数に入力する

今日はプログラミングの超重要要素である「条件分岐」について学びます。この条件分岐と後日学習する「ループ」を理解すると、プログラミングで実現できることが一気に拡がりますので、頑張って学んでいきましょう。(書籍では第1部2章の内容となります)

なお、投プロは現在オンラインのみでの勉強会ですが、近い将来は実際の勉強会方式でも開始します。独学ではなかなかできないプログラミングの勉強を投資家仲間とワイワイできると楽しいですよね。(平日夕方以降、五反田〜恵比寿あたりの貸会議室で行う予定です)

さて、前回は指定した証券コードの関連ウェブページを一気に開くアプリを作りました。
本日は条件分岐と文字列の長さを取得する関数を使って、クリック一発ウェブページ表示アプリ 「一発クン」のバージョンアップをしていきましょう。


こちらは前回のソースコードです。

証券コードを入力すると、その関連ページを一気に表示してくれる機能でしたが、実在しない証券コード(例えば “ABS76” など)を入力すると、「ページが存在しない」というエラーがブラウザ上に表示されてしまいます。

そこで今回は、入力した値が証券コードとして有効かどうかのチェックを行う機能を追加したいと思います。

「有効な証券コードが有効かどうか」は「入力文字が4桁の文字列かどうか」で判定します。(より厳密にチェックする場合は、実在する証券コードとの付け合わせ処理が必要ですが、これは4章の「リスト」を勉強した際に実装しますのでお楽しみに)

ある値が有効かどうかを判定するロジックは「条件分岐」という方法を使います。Pythonではifという命令で表します。もちろん英語のifです、わかりやすいですね。
使い方はこうです。
今回判定したい条件は、入力された証券コードの文字列の長さが4かどうかなので、YESならばウェブページを開き、NOならばエラーメッセージを表示するようにプログラミングしていきます。
ここで文字列の長さを計る関数 len() の登場です。
lenは()の中に長さを測りたい文字変数を入れるとその文字列長を返してくれる便利な関数です。(lenはlengthの略ですね)
では実際に使って動きを確認してみましょう。(プログラミングはこのようにとっとと自分の手を動かしていろいろ試してみることが理解への早道です!)

上記を実行すると、キーボードから入力した文字の文字数が表示されたはずです。

stock_codeという変数にキーボードから入力した文字列がセットされて、その文字列をlen関数に入れると文字列の数が変数mにセットされます。さらにprint関数にmを渡すと、その文字数が表示されるのです。

文字列長の取得方法が理解できたところでいよいよ条件分岐に進んでいきましょう。
今回判定したい条件は「mが4かどうか」ということでした。
これをPythonではこのように判定できます。

==は両側の変数が同じかどうかを判定してくれる命令です。変数に値を代入する=(イコール)とは関係ないので注意してください。==という命令だ、と覚えてください。

==の判定結果はTrueかFalseで返してくれます。(True/FalseはPythonの世界でYes/Noを表します)

では実際に判定結果を変数hanteiに入れてprint()関数で表示してみましょう。mに6を入れた場合と4を入れた場合で試してみましょう。

どうなりましたか?(読むだけではなく実際に手を動かして実行してみてくださいね!)

と表示されましたか?

=の記号が並んで表示されるので違和感があるかもしれませんが、上記の意味を押さえていれば理解できると思います。Pythonでは==の他にも下記の判定機能が用意されています。

上から「mが4でなければTrue、4ならば False(==と逆の判定をする)」「mが4より大きければTrue」「mが4より小さければTrue」という判定となります。
他にも判定機能がありますが詳細は「退屈なことはPythonにやらせよう」の2.2比較演算子を確認してみてください。

繰り返しますが、= と==は似て非なるものですので混乱しないように!

それでは今回勉強したlen関数と==を頭にいれつつ