2017年07月30日

ポイントは忘れたころにやってくる

いつの間にか、以前楽天証券で個人向け国債を購入した時のキャンペーンポイントが付加されていました。
楽天証券で個人向け国債のキャンペーンを実施していたので、楽天証券口座で個人向け国...
こういうキャンペーン系は申し込むときの期限は気にしているのですが、実際にポイント付加だったりキャッシュバックされるときにはすっかり忘れているんですよね。万が一振り込まれていなくても気づかないという現実……。

楽天証券での投資信託購入にも使えるはずだし、今度の三太郎の日に行くミスタードーナツでも使えるし、意外と楽天ポイントは使い勝手が良いですね。

posted by くまなべ at 19:17 | Comment(0) | TrackBack(0) | 日記

2017年07月29日

楽天バリアブルキャンペーンは明日まで

2ヶ月に1回程度実施している楽天バリアブルのキャンペーンが実施されていたので購入してきました。

20170729_rakuten_0.jpg


詳細

  • 対象店舗:セブンイレブン
  • 期間:2017/7/17~2017/7/30
  • 購入金額:10001円
  • プレゼントポイント:711ポイント

楽天ポイント取得


今回はセブンイレブンでの実施だったので下記の手順で実施しました。
  1. nanacoにクレカ(リクルートカード)でチャージ
  2. セブンイレブン店頭で3000円の現金でのnanacoチャージ
  3. nanacoによってセブンイレブンで楽天バリアブルカードを購入
  4. 楽天ポイントを受け取る
今回は、nanacoをセブンイレブン店頭で3000円チャージすると抽選で2000名に1000ポイント当たるキャンペーンを実施していたので、3000円だけ現金でnanacoチャージしてみました。

貰えるポイントは?

  • nanacoチャージ:7000*0.012=84ポイント
  • おまけの楽天ポイント:711ポイント
  • 合計:84+711=795ポイント
あと運が良ければ1000ポイントが当たるかも?

楽天ポイントの使い道

最近は書籍を楽天Booksで購入したり、楽天で家族の帽子を買おうとしているので、その分のポイントに充てたいと思います。

ちなみに以前の楽天バリアブルの購入した時の使い道は下記になります。
前回同様、楽天バリアブルキャンペーンを実施していたので10001円分購入してきま...
ファミリーマートの楽天バリアブルキャンペーンが始まったみたいですね。...
posted by くまなべ at 20:00 | Comment(0) | TrackBack(0) | キャンペーン

2017年07月28日

デニーズのモーニングと7SPOT

最近、朝デニーズに行く機会がありました。デニーズは他のファミレスと比べると高めの印象があったのですが、朝デニーズを使うとお得だったので、その時の感想です。

デニーズのモーニング

デニーズには通常の500円ぐらいのモーニングセットがありますが、それ以外にも235円(税込)のモーニングがありました。

なんと、「お替り自由のコーヒー」+「トースト(ハーフ)」+「ゆでたまご」で235円でした。出てきたものは下記となります。
20170722_dennys_2.jpg


ちなみに「飲み物は何にしますか?」と言われてコーヒー以外のカフェラテを頼んだら、「カフェラテ」+「トースト(ハーフ)」+「ゆでたまご」で360円(税込)でした。要するにドリンクに「トースト(ハーフ)」と「ゆでたまご」がついてくるような感じなんですね。

デニーズのWifi

店舗によると思いますが、デニーズはセブン&アイグループなので7SPOTのWifiが使えます。会員としてメールアドレスとパスワードを登録する必要がありますが、登録すれば1時間*(多分3回)の合計3時間が使えます。

20170722_dennys_0の.jpg

20170722_dennys_3.jpg
20170722_dennys_4.jpg

20170722_dennys_5.jpg
20170722_dennys_1.jpg

気を付けないといけないのは1時間経つと1回Wifiが切れることですね。PythonがTwitterのAPIを叩いているのに反応しなくて困っていたら、Wifiが切れていたというオチがありました。また公衆のWIFIなのでセキュリティ的に気を付けないといけないと思います。

あとは……

これで電源が使えたら申し分無いんですけどね。店舗によっては使える所もあるのかもしれませんが……。あと、アプリを入れてデニモバ会員になると色々クーポンがもらえるんですね。

posted by くまなべ at 21:47 | Comment(0) | TrackBack(0) | 日記

2017年07月27日

フォロー・フォロワーの分類を自動で実施してみた

たまにフォロワー分類みたいなことをしている人がいると思います。TwitterのUser情報やTweet情報を用いて自動で分類ができないかなーと思って、次の様な分類を実施してみました。

分類方法

  • X軸:投資方法がアクティブかどうか
  • Y軸:Twitter上での活動がアクティブがどうか

図にしてみると下記となります。Userの自己紹介文やTweet頻度を参考にして、この図の上にフォロワーやフォローの方のアイコンを分類わけして置いてみました。

20170730_activeGraphBase_0.png

結果


結果としては、下記のような分類分けになりました。投資方針の軸は株式・海外投資・不動産な人をアクティブにしてみました。いい加減なアルゴリズムですがインデックス投資な人はX軸の左寄りになるようにしています。

20170730_activeGraphBase_1.jpg

というわけで、そのいい加減なアルゴリズムに基づいたプログラムは次に続きます。


続きを読む
posted by くまなべ at 07:54 | Comment(0) | TrackBack(0) | Python

2017年07月26日

篠崎屋の株価上げとおすすめ商品

【20170818 追記】大豆のから揚げの写真を撮ったので説明を修正しました。

篠崎屋の業績回復のプレスリリースが出たため、ここ数日篠崎屋の株価が上がっています。ということで篠崎屋についてです。



篠崎屋とは

「三代目茂蔵」の名前で豆腐を中心とした小売りをしている会社になります(以前は製造も実施)。以前は株価が200円近くまで上がり配当も3円程度実施していたのですが、業績低下に伴い株価は80円代まで落ち込み配当も1円まで落ちてしまいました。

ちなみに篠崎屋は前年比の売上をwebで公開しています。今期は前期よりも店舗数が少ないのにもかかわらず、前年比並み・もしくはそれ以上の売り上げを上げており、業績改善が期待されていました。ということで、24日に公表された業績予想によって株価が急騰しました。

我が家は篠崎屋の株をナンピンしながら、一時期最大2000株まで持っていた株主であるとともに、頻繁に購入している顧客でもあります。というわけで、折角なので篠崎屋のおすすめ商品です。

お薦め商品(画像は公式通販ページからお借りしています)


■茂たま
2個で100円の豆腐。2つ合わさって卵状の容器になっているのが特徴です。やわらかいためスプーンですくって食べます。ほんのりとした甘味が特徴です。

商品画像1

極上豆富
水気を吸い取るためか、木綿豆腐の周りに布?が巻いてあります。また、容器の下側に水分を切るような構造となっています。この構造で美味しさを保っているのかなと思います。しっかりとした豆腐です。
商品画像1

黒豆しぼり
公式ページの説明にもありますが、噛みごたえがあり噛めば噛むほど甘味が染み渡る黒豆です。後をひいて、ついつい食べてしまう感じです。
商品画像1
とうふ焼どーなつ
ふんわり・ふわふわとした食感のドーナツ。あげていないのでカロリー控えめ?。美味しいけれど賞味期限が短いのに注意。ちなみに商材ロス削減に株主として貢献するために賞味期限が早いものを店頭で手に取るようにしています。

商品画像1

大豆のから揚げ
店頭でお肉の代用品として大豆のから揚げがおいてあります。本当に鶏肉の味がするから揚げでおいしいです。

20170818_shigezo_0.jpg

ということで

業績が回復している茂蔵の商品を買って売上(と株主)に貢献しましょう!! 我が家もたまに行くと1000円以上買ってます。あと、自分と妻の両方の実家でも評判がよくて結構買っているみたいです。


posted by くまなべ at 07:17 | Comment(0) | TrackBack(0) | 株式

2017年07月25日

フォローとフォロワーの関係の可視化(Python + Graphviz)

最近、TwitterのAPIを叩いているのですが、せっかくなのでフォロー・フォロワーの繋がりを可視化してみたいなーと思いました。

と言うわけで、graphvizを用いて可視化しようとしたのですが、少しのノードでもグラフがbusyになってしまうので、自分のフォローとフォロワーの間だけにしてみました。といっても結構ごちゃごちゃしたグラフになりましたが。

自分のフォロー・フォロワーの関係図

作成したグラフは下記のようになります(巨大画像ファイルのため注意)。→の方向でフォローしている方向になります。

20170723_twitter_0.png

Graphvizにくわせるdot

Graphvizをpythonから直接叩ければよかったのですが、windowsでは環境設定が面倒なため、とりあえず下記のようなdotファイルを作成してGraphvizに食わせてグラフを作成しました。

digraph sample{
node[fontname="meiryo"];
"kumana_be"[image="C:\python\intro\twitter\icon\get\883820222527885312-kumana_be.jpg"];
"chihimasah"[image="C:\python\intro\twitter\icon\get\840769338671996928-chihimasah.jpg"];
"churio777"[image="C:\python\intro\twitter\icon\get\847223574586769408-churio777.jpg"];
<<中略>>
"manesetsu_crowd" -> "zenzenkabu";
"manesetsu_crowd" -> "minasek";
"manesetsu_crowd" -> "ryo_tatibana";
}


続いてソースコードになります。

続きを読む
posted by くまなべ at 07:13 | Comment(0) | TrackBack(0) | Python

2017年07月24日

auの三太郎の日クーポン

auの「三太郎の日」クーポンが7月がから始まりました。今まで自分にも届いていたのですが、SPAMメールと勘違いしてスルーしていました。

スルーしていた理由

三太郎の日はauスマホを使用している人が対象となります。しかし、今自分が実際に使っているのはauのガラケーになります。そのため自分は対象外と思っていてスルーしていました。

実際には、大元の契約はスマホなのですが、ガラケーに持ち込み機種変更をしています。そのため実際に使用しているのはガラケーでも契約上はスマホ(かなり昔の機種ですが)を使用していることになっています。ということで自分にも「三太郎の日」クーポンが届いたみたいです。

ということで

マックに行ってきました。初めて三太郎の日クーポンを使用しましたが発券から30分の制限があったり、実際に貰うときにに店員さんがスマホを操作して不正に2回クーポンを使われないようにしているんですね。
20170724_mac.png


posted by くまなべ at 03:59 | Comment(0) | TrackBack(0) | 日記

2017年07月22日

リスク資産グラフの自動生成[SBI証券+DC年金](Python + matplotlib)

前回、SBI証券のリスク資産をパイチャート(円グラフ)で示すEXCELを作成しました。
Python関連を連続して書いているけれど、投資に関連する内容も!ということでS...
自分が保有しているリスク資産はSBI証券とDC年金となります。また、現在は半年に1回サイトにアクセスして評価額を確認しながらEXCELを作成してグラフを作成していました。この作業は手間がかかるため、SBI証券とDC年金の2つのリスク資産配分をを合算したパイチャートのグラフを自動で作成したいと考えました。

コマンドと実行結果

コマンドは下記となります。

> python.exe .\graphAA.py .\piChart.png <SBIID> <SBIPW> <DCID> <DCPW>
Navigating for SBI...
Signing for SBI...
Navigating for SMTB...
Signing for SMTB...
Saving pieChart...

今回はEXCELを作成するのではなくて、パイチャートの画像データを直接作成しています。下記のパイチャートが自動で作成されました。
20170719_python_piChart.png

下記の記事の2017年7月時点のリスク資産と比較してほぼ同じとなっているので、情報の取得はうまくいっていると思います。あと、他の人はリスク資産の分類のチャートをどのようにして作成しているのかが気になります。MoneyForwardでも自分が思ってたようなチャートを作れなかったので……。
半年に一度の資産状況確認を実施してみました。...
続いてソースコードになります


続きを読む
posted by くまなべ at 16:00 | Comment(0) | TrackBack(0) | Python

2017年07月21日

Twitter上のインデックス投資家はズボラなのか?(Python+Tweepyコード編)

と言うわけで、結果編からの続きです。
最近「Python+Tweepy」でTwitterのAPIを叩いているのですが、...
参考にしている書籍は「Pythonによるスクレイピング&機械学習 開発テクニック」になります。


TwitterのAPIを叩いて、特定の検索ワードのTweetを取得し、そのtweetを呟いているIDのアイコンを確認しています。defaultアイコンかどうかであれば単純な一致で良いと思いますが、せっかくなので上記書籍の七章のAverage Hashとハミング距離を用いています。

自己紹介文の文字数は、そのまま情報を取得して文字数を数えています。

# coding='utf-8'
###########################################################################
# Twitterの検索を行って、その検索に引っかかるユーザーのiconをチェックする
# defaultアイコンの人はズボラと判断する
# アカウント情報が必要になるのでforegoで.envを読みだす
# Usage : .\forego.exe run python.exe .\tweepy_search.py <検索ワード> <検索数> <Debugファイル名>
# Example : .\forego.exe run python.exe .\tweepy_search.py "インデックス投資" 100 bbb.txt

from PIL import Image
import numpy as np
import os
import sys
import tweepy
import urllib.request
from requests_oauthlib import OAuth1Session
import matplotlib.pyplot as plt


# Agerage hash生成
def average_hash (fname, size = 16):
img = Image.open(fname)
img = img.convert('L')
img = img.resize((size,size), Image.ANTIALIAS)
pixel_data = img.getdata()
pixels = np.array(pixel_data)
pixels = pixels.reshape((size,size))
avg = pixels.mean()
diff = 1 * (pixels > avg)
return diff

# np2hashは今回は使用しない
def np2hash(ahash):
bhash = []
for n1 in ahash.tolist():
s1 = [str(i) for i in n1]
s2 = "".join(s1)
i = int(s2,2)
bhash.append("%04x" % i)
return "".join(bhash)

# 元画像と比較画像のハミング距離の計算
def hamming_dist(a,b):
alist = a.reshape(1,-1)
blist = b.reshape(1,-1)
dist = (alist != blist).sum()
return dist

# 環境変数から認証情報を取得する。
CONSUMER_KEY = os.environ['CONSUMER_KEY']
CONSUMER_SECRET = os.environ['CONSUMER_SECRET']
ACCESS_TOKEN = os.environ['ACCESS_TOKEN']
ACCESS_TOKEN_SECRET = os.environ['ACCESS_TOKEN_SECRET']

# 初期化
maxId = 999999999999999999 # 検索結果用ID
maxIdOld = 999999999999999999 # 検索結果用ID
words = {} # 単語とその登場回数を格納
searchPage = 0

# 認証情報を使う
# wait_on_rate_limit = True はAPI制限に引っかかったときにWaitする設定
auth = tweepy.OAuthHandler(CONSUMER_KEY,CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN,ACCESS_TOKEN_SECRET)
api = tweepy.API(auth, wait_on_rate_limit = True)

checkedUserList = []
totalNum = 0
zuboraNum = 0
totalBioLenSum = 0
totalBioLenList = []
searchWord = sys.argv[1] # 検索WORD
maxPage = int(sys.argv[2]) # maxPage * 100のTweetを取得する
outFileName = sys.argv[3] # Debug出力

# 出力ファイルOpen
outFile = open(outFileName,'w',encoding='utf-8')

# defaultアイコンのhash
srcHash = average_hash(os.path.join(os.getcwd(),"icon","default","default.jpg"))
while True:
# maxIdは前のid-1を渡すことに注意
searchTweets = api.search(q=searchWord,count=100,result_type='recent',max_id=maxId-1)
for tweet in searchTweets:
# Debug用にTweetをTextに保存しておく
# cmdline = str(tweet.user.screen_name) + str(tweet.text) + str(tweet.created_at) + str(tweet.id) +'\n'
# outFile.write(cmdline)

# 初めてチェックするUserのみを処理する
if not tweet.user.id_str in checkedUserList:
# API制限に引っかかったときの例外処理対策(実際はErrorは発生せずにWaitがかかる設定にしている)
try:
checkedUserList.append(tweet.user.id_str)
# Iconの取得
iconUrl = tweet.user.profile_image_url
iconPath = os.path.join("icon","get",tweet.user.id_str+"-"+tweet.user.screen_name+".jpg")
urllib.request.urlretrieve(iconUrl,iconPath)
# Hashの作成とdefaultアイコンとの比較
destHash = average_hash(os.path.join(os.getcwd(),iconPath))
hammingValue = hamming_dist(srcHash,destHash) / 256
# 自己紹介文の取得
bio = api.get_status(tweet.id).user.description
# 取得情報の処理
totalNum += 1
totalBioLenSum += len(bio)
totalBioLenList.append(len(bio))
print(hammingValue,":",tweet.user.screen_name)
# アイコンがdefaultアイコンだった時
if (hammingValue==0):
zuboraNum += 1
except:
print("[Error]:Because twitter API was accessed too much")
break

# idが今までのより小さければ代入
if(tweet.id < maxIdOld):
maxId = tweet.id
if maxIdOld == maxId:
# Tweetが見つからなければmaxIdOldと変わらないので検索結果をすべて受けとったと判断
break
elif searchPage == maxPage:
# もしくは最大で引数で指定したmaxPagex100までのTweetをチェックする
break
else:
maxIdOld = maxId
searchPage += 1

outFile.close()

# 結果出力
print("--------------- Result -----------------")
print("検索に引っかかったID数:",totalNum,"そのうちDefaultアイコンのID数:",zuboraNum,"Defaultアイコンの割合:",zuboraNum/totalNum*100,"%")
print("検索に引っかかったIDの自己紹介文の平均文字数:",totalBioLenSum/totalNum)

plt.hist(totalBioLenList,bins=20)
plt.title("自己紹介の文字数のヒストグラム")
plt.xlabel("自己紹介の文字数")
plt.ylabel("該当ID数")
plt.savefig("hist.png")
plt.show()
今回TwitterのAPIを叩いて気付いたのですが、15分間に情報取得のために叩けるAPIの回数制限って厳しいんですね。サードパーティのアプリを使っていてタイムラインが更新されないなーとか思っていたのですが、API回数制限によってタイムラインなど情報取得ができない状態が発生しているのに気づかされました。
posted by くまなべ at 07:48 | Comment(0) | TrackBack(0) | Python

Twitter上のインデックス投資家はズボラなのか?(結果編)

最近「Python+Tweepy」でTwitterのAPIを叩いているのですが、Twitter上で「インデックス投資」と単純に「投資」でつぶやいている人の情報を取得して、どちらがズボラか考えてみました。

情報取得とズボラかどうかの判断基準

  1. Twitter上で特定ワードで検索する
  2. 検索に引っかかった人のアイコンがdefaultアイコンかどうかをチェックする
  3. 自己紹介文の長さをチェックする
自分の中でズボラな人は「Twitterアイコンをdefaultのままで使う」とか「自己紹介文が短い」という印象(思い込み?)を持っているため上記を判断基準としています。

結果

Defaultアイコン
 
検索に引っかかったID
DefaultアイコンのID
Defaultアイコンの割合
「投資」で検索 993個 47個 4.73%
「インデックス投資」で検索308個9個2.92%

Defaultアイコンの割合としては「インデックス投資」を話題にしている人の方が少ない感じです。


自己紹介文の平均文字数
 
検索に引っかかったIDの自己紹介文の平均文字数
「投資」で検索82.80文字
「インデックス投資」で検索76.26文字

自己紹介文の文字数のヒストグラム
「投資」で検索
20170721_investHist.png

「インデックス投資」で検索
20170721_indexInvestHist.png

自己紹介の文字数としては平均は「インデックス投資」を話題にしている人の方が少ないですが、理由としては自己紹介文が20文字ぐらいの人が、「投資」を話題にしている人より多めなため平均を引き下げている感じに見えます。

結論

まあ、結果から言えば誤差の範囲ですよね。というかTwitterでつぶやいている段階でズボラでは無いだろうという話ですが……

というわけで「Python+Tweepyコード編」に続きます。

と言うわけで、「Python+Tweepyコード編」です。参考にしている書籍は「...
posted by くまなべ at 06:50 | Comment(0) | TrackBack(0) | インデックス投資